多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
@[toc] ## 写在前面 关于JavaScript的模块化的需求来源以及相关标准可以参考以下两篇: [Javascript模块化编程系列一: 模块化的驱动](https://blog.csdn.net/oscar999/article/details/8902060) [Javascript模块化编程系列二: 模块化的标准化(CommonJS & AMD)](https://blog.csdn.net/oscar999/article/details/8905155) 此处,在代码层演示不同标准的代码 以及在Node.js演示的效果。 ## JavaScript模块化的规范 * Node.js 遵循 CommonJS * RequireJS 遵循AMD * Seajs 遵循 CMD * ES6, ECMAScript 6 是JavaScript的下一代标准规范,对模块化也有一套定义 在JavaScript中,一个模块,基本上是一个独立的文件, ## Node.js 的模块化实现 Node.js遵循CommonJS规范定义模块,定义的方式是: * 使用module.exports定义模块 * 使用require 导入模块 这里建立两个文件, sub.js定义一个模块;main.js导入并使用sub.js定义的模块 sub.js ```javascript module.exports={ myVar:'Oscar', myFunc:function(){ return 'Oscar'} } ``` main.js ```javascript var sub = require('./sub'); var s = sub.myFunc(); console.log(s); ``` 以上的示例是调用在模块中定义的某个函数, 在控制台打印函数的返回值。 测试方式: 在命令行运行 ` node main.js` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200909230502627.png#pic_center) ## AMD or CMD 代码示例 相比CommonJS , AMD/CMD 只是在最外层使用define 包装了一层。 sub.js ```javascript define(function (require, exports, module) { module.exports = { myVar: 'Oscar', myFunc: function () { return 'Oscar' } } }); ``` main.js ```javascript define(function (require, exports, module) { var sub = require('./sub'); var s = sub.myFunc(); console.log(s); }); ``` ## ES6模块化标准以及在Node.js的使用 ES6标准使用export 和 import 导出和导入模块 ,早期的Node.js 没有支持这个标准, 不过Node.js 9之后提供了一个实验模块, 可以直接使用 export/import , 但是文件名后缀需要是 .mjs。 sub.mjs ``` var myVar = 'Oscar'; function myFunc() { return 'Oscar' } export {myVar,myFunc} ``` main.mjs ``` import {myVar,myFunc} from './sub.mjs' var s = myFunc(); console.log(s); ``` 注意: 运行的命令需要加--experimental-modules选项: `node --experimental-modules main.mjs` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200909231217596.png#pic_center) 这里会有一个警告:ExperimentalWarning: The ESM module loader is experimental. 意思就是这个模组还处在实验阶段,用用完可以,正式环境不建议使用。 在正式环境中,结合webpack可以正常使用export和import。 ***** *****