Module

模块

commonjs amd cmd umd es6

  • commonjs nodejs 模块规范 语法有 require() exports.a=b; exports.default={}
 1// foobar.js
 2
 3//私有变量
 4var test = 123;
 5
 6//公有方法
 7function foobar () {
 8
 9    this.foo = function () {
10        // do someing ...
11    }
12    this.bar = function () {
13        //do someing ...
14    }
15}
16
17//exports对象上的方法和变量是公有的
18var foobar = new foobar();
19exports.foobar = foobar;
1//require方法默认读取js文件,所以可以省略js后缀
2var test = require('./boobar').foobar;
3
4test.bar();
  • amd: Asynchronous Module Definition 异步模块定义 推崇依赖前置 相关实现库 requirejs,语法 define(id?, dependencies?, factory)
  • cmd: Common Module Definition 推崇依赖就近 类似 amd 相关实现库 seajs
 1//AMD
 2define(['./a','./b'], function (a, b) {
 3
 4    //依赖一开始就写好
 5    a.test();
 6    b.test();
 7});
 8
 9//CMD
10define(function (requie, exports, module) {
11
12    //依赖可以就近书写
13    var a = require('./a');
14    a.test();
15
16    ...
17    //软依赖
18    if (status) {
19
20        var b = requie('./b');
21        b.test();
22    }
23});
  • umd Universal Module Definition 通用模块定义,是 AMD 和 CommonJS 的糅合 UMD 先判断是否支持 Node.js 的模块(exports)是否存在,存在则使用 Node.js 模块模式。在判断是否支持 AMD(define 是否存在),存在则使用 AMD 方式加载模块
 1(function (window, factory) {
 2    if (typeof exports === 'object') {
 3
 4        module.exports = factory();
 5    } else if (typeof define === 'function' && define.amd) {
 6
 7        define(factory);
 8    } else {
 9
10        window.eventUtil = factory();
11    }
12})(this, function () {
13    // module ...
14});
  • ES6:语言标准的模块化,取代 UMD,服务器和浏览器都能使用

es6

模块导入与导出

操作 语法 重命名 对应导入 对应导入重命名
直接导出 export var a=2;or export function a(){}; no import {a} from 'x'; import {a as b} from 'x';
先申明,再导出 var a=2,b=3;export {a,b};or function a(){};export {a}; export {a as c,b}; import {a,b} from 'x'; import {a as c,b} from 'x';
默认导出 export default function(){};or export default 44; 不需要 import a from 'x'; 不需要
先申明,再默认导出 function a(){};export default a;or var a=2;export default a; 不需要 import a from 'x'; 不需要
  • 总结: 默认导入导出不需要重命名,因为导入的名字可以随便取;非默认导入导出 {}里都支持重命名

export import 复合写法

  • 如果在一个模块之中,先输入后输出同一个模块,import 语句可以与 export 语句写在一起
1export { foo, bar } from 'foo';//导出foo中的foo bar
2export { default } from 'foo';//导出foo中的默认输出
3export * from 'foo';//export *命令会忽略foo模块的default方法
  • 注意:import 和 export 命令只能在模块的顶层,不能在代码块之中,JavaScript 引擎静态分析,先于模块内的其他语句执行。

Number
Map&Set

评论