CommonJS规范
CommonJS,规范了需要用exports或者module.exports对模块进行导出。用require对模块进行引入。
Node的模块化实现就是基于CommonJS规范,通过fs模块实现了require方法(自己理解,没看过源码)。
AMD规范
举个例子,在AMD规范里如何定义模块
define(['module1','module2'],(module1,module2) => {
return function(){
//....
}
})
再通过require引入即可。
在AMD规范里,主要是通过script标签以及src属性,来实现require方法(自己理解,没看过源码)。
CMD规范
举个例子,在CMD规范里如何定义模块
define(function(require,exports,module){
//.....
})
再通过require引入即可。
如何实现一个兼容多种规范的模块
如果基于上面的三种规范,我们想实现出一个模块,就要适配每一种情况,如果都不满足,那么就默认在浏览器端,将模块挂载到window上变量上
(function(name,callback){
const hasDefine = typeof define === 'function';
const hasNode = typeof module !== undefined && module.exports;
if(hasDefine){
define(callback)
}else if(hasNode){
module.exports = callback
}else {
this[name] = callback
}
})(() => {
console.log('hello');
})