https://blog.csdn.net/crystal6918/article/details/74906757/
CommonJS
CommonJS就是为JS的表现来制定规范,因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。
CommonJS是nodejs也就是服务器端广泛使用的模块化机制。
该规范的主要内容是,模块必须通过module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。
根据这个规范,每个文件就是一个模块,有自己的作用域,文件中的变量、函数、类等都是对其他文件不可见的。
如果想在多个文件分享变量,必须定义为global对象的属性。(不推荐)
定义模块
在每个模块内部,module变量代表当前模块。它的exports属性是对外的接口,将模块的接口暴露出去。其他文件加载该模块,实际上就是读取module.exports变量。
var x =5;
varaddX =function(value) {returnvalue + x;};
module.exports.x = x;
module.exports.addX = addX;
定义模块
require方法用于加载模块,后缀名默认为.js
varapp =require('./app.js');
根据参数的不同格式,require命令去不同路径寻找模块文件。
如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。
如果参数字符串以“./”开头,则表示加载的是一个位于相对路径的模块文件
如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(node核心模块,或者通过全局安装或局部安装在node_modules目录中的模块)
AMD
AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件。
requirejs即为遵循AMD规范的模块化工具。
RequireJS的基本思想是,通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。
ES6 Modules
ES6正式提出了内置的模块化语法,我们在浏览器端无需额外引入requirejs来进行模块化。
ES6中的模块有以下特点:
模块自动运行在严格模式下
在模块的顶级作用域创建的变量,不会被自动添加到共享的全局作用域,它们只会在模块顶级作用域的内部存在;
模块顶级作用域的 this 值为 undefined
对于需要让模块外部代码访问的内容,模块必须导出它们
定义模块
使用export关键字将任意变量、函数或者类公开给其他模块。
重命名模块
导出默认值
模块的默认值是使用 default 关键字所指定的单个变量、函数或类,而你在每个模块中只能设置一个默认导出。