前端模块化规则,一般来说就是,commonJS(常用于nodejs),esModule(现在前端普遍采用这种),还有amd,cmd.(总结一下,备忘速查)
commonjs
是采用动态编译方式进行加载文件。
- require()导入,
- module.exports = xxx或者exports.xxx=xxx用于导出.
每个文件内部都有一个module对象,里面有个属性exports,这个属性也是一个对象,打印一下
Module {
id: '.',
path: xxx,
exports: {},
parent: null,
filename: xxx,
loaded: false,
children: [],
paths: [
xxx
]
}
require 引入时候其实就是引入的目标文件的exports里面的内容。
既然module.exports 和 exports 都可以导出,他们之间有什么关联呢? 在每个模块的内部,默认执行了一步 module.exports = exports。这样来说module.exports = xxx ,exports.xxx=xxx 都可以暴露属性、方法。但是他们的区别就在于前者是为对象赋值,后者为对象增加属性。
注意:如果使用了module.exports = xxx 后续就不能使用exports.xxx=xxx了,因为 module.exports = exports 所产生的联系已经被断开
浏览器一般不识别require,如果要想在浏览器里面使用需要配合webpack,browserify插件去打包。
amd
这个是适用于浏览器的,异步加载文件的模块化方式。通过script,引入cdn, requirejs。
//用define函数去定义模块导出,其中xxx 是依赖于其他模块。
define([xxx],function(xxx){
var a= x
return {
a,
}
)
//用require去导入模块。
require(['jquery', 'xxx'],function($, xxx){
//一些操作
});
//这里还需要对require.config去配置,配置一些路径这些。
cmd
个人理解cmd 更像是结合了amd,commonjs的优势的产品,这一点从名字上就不难看出。也是异步加载,也要引入sdn,sea.js
//用define函数去定义模块导出,其中xxx 是依赖于其他模块。内部用require,去引入
define(function(require, exports, module){
var a= x
//区别于amd,采用exports的形式去导出
exports = {
}
)
//加载模块;
seajs.use(xxx.js)
esmodule
这个应该最常见。是静态编译的,但是import()函数实现了动态引入, import 导入 ,export {},export default {} 导出;
export {
a:xxx,
b:xxx
}
//用export 导出时一定要通过 结构赋值导入。
import {a,b} from 'xxx'
export default {
a:xxx;
b:xxx
}
import x from 'xxx'
console.log(x.a,x.b)
作为比较常见的两种模块方式,esmodule(浏览器主流模块应用方式),commonJS(node主流模块应用方式)。
- 编译方式:esmodule 静态编译,但是import()可以实现动态引入。commonJS为动态编译。
- 引入方式:esmodule 是引入了一个引用,就是说修改引入的文件会有影响。但是commonJS是引入的一个浅拷贝,所以来说是不太影响的(注意是浅拷贝)。
- 使用方式:
- esmodule 只能在模块顶层使用,不能在函数、判断语句等代码块之中引用(import导入是静态的,并且还会有引入提升);commonJS 可以。
- ES6 模块可以在 import 引用语句前使用模块,CommonJS 则需要先引入后使用