“内联”和“寄存器”模块选项



--modules inline--modules register选项有什么作用?

https://github.com/google/traceur-compiler/wiki/Options-for-Compiling。

使用 2ality.com 的lib.js示例模块:

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}
//------ main.js ------
import { square, diag } from 'lib';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5

inline将模块包装在一个匿名函数中,由外观分配给自动生成的变量,知道这是什么会很有趣,该技术可用于捆绑模块而无需实际使用模块系统,但必须知道分配返回对象的var

var $__src_47_lib_46_js__ = (function() {
  "use strict";
  var __moduleName = "src/lib.js";
  var sqrt = Math.sqrt;
  function square(x) {
    return x * x;
  }
  function diag(x, y) {
    return sqrt(square(x) + square(y));
  }
  return {
    get sqrt() {
      return sqrt;
    },
    get square() {
      return square;
    },
    get diag() {
      return diag;
    }
  };
})();
//# sourceMappingURL=lib.js.map

System.register是草稿模块格式:

System.registerModule("src/lib.js", [], function() {
  "use strict";
  var __moduleName = "src/lib.js";
  var sqrt = Math.sqrt;
  function square(x) {
    return x * x;
  }
  function diag(x, y) {
    return sqrt(square(x) + square(y));
  }
  return {
    get sqrt() {
      return sqrt;
    },
    get square() {
      return square;
    },
    get diag() {
      return diag;
    }
  };
});
System.get("src/lib.js" + '');
//# sourceMappingURL=lib.js.map

注册模块后,可以调用System.module( ... )来加载模块。 目前我知道traceur(虽然不是运行时)将系统对象填充,大概也babel.

System.register格式有一些有用的优点,我建议,一个文件中可以包含多个模块,该文件适合较小的紧密耦合模块(通常是类)的集合;无需购买另一个模块系统,例如,在节点模块中包含香草JS(测试数据,附加到全局对象的垫片等)需要额外的样板代码,从而增加工作流的开销, 等。

不过,System对象是仍在开发中的技术(不包括当前的标准草案)。

最新更新