CommonJS规范是诞生比较早的,适合服务端,因为在服务器读取模块都是在本地磁盘,加载速度很快.
CommonJS的特点:
-
1.所有代码都运行在模块作用域,不会污染全局作用域。
-
2.模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
-
3模块加载的顺序,按照其在代码中出现的顺序。
AMD的特点 AMD,即 (Asynchronous Module Definition),这种规范是异步的加载模块,requireJs应用了这一规范。先定义所有依赖,然后在加载完成后的回调函数中执行,依赖前置 ,代表作有 require.js库
require(['clock'],function(clock){
clock.start();
});
CMD的特点
CMD (Common Module Definition), 是seajs推出的规范,CMD则是依赖就近,用的时候再require, 就近依赖 代代表有SeaJS 库
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});
| 方案 | 优势 | 劣势 | 特点 |
|---|---|---|---|
| AMD | 速度快 | 会浪费资源 | 预先加载所有的依赖,直到使用的时候才执行 |
| CMD | 只有真正需要才加载依赖 | 性能较差 | 直到使用的时候才定义依赖 |
能够提出CMD和AMD互相补充是一个很赞的想法。现在,它们除了希望放在浏览器作为loader也能够放在服务端,提供加载功能。在我看来,AMD擅长在浏览器端、CMD擅长在服务器端。这是因为浏览器加载一个功能不像服务器那么快,有大量的网络消耗。所以一个异步loader是更接地气的。
后期使用webpack之后 AMD和CMD 没有啥意义.加上ES6也出了自己的模块化机制
ES6的模块化
import config from './config' //导入
export default function () { //导出
console.log('fff')
}
注意:
script标签中写js代码,或者使用src引入js文件时,默认不能使用module形式,即不能使用import导入文件,
但是我们可以再script标签上加上type=module属性来改变方式