多应用+插件架构,代码干净,支持一键云编译,码云点赞13K star,4.8-4.12 预售价格198元 广告
## 一、概述 module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。 node为每一个模块提供了一个exports变量(可以说是一个对象),指向 module.exports。这相当于每个模块中都有一句这样的命令 var exports = module.exports; 这样,在对外输出时,可以在这个变量上添加方法。例如  ``` exports.add = function (r){ return Math.PI }; ``` >[danger] 注意: > 1、不能把exports直接指向一个值,这样就相当于切断了 exports 和module.exports 的关系。例如 `exports=function(x){console.log(x)};` > 2、一个模块的对外接口,就是一个单一的值,不能使用exports输出,必须使用 module.exports输出。module.exports=function(x){console.log(x);}; ## 二、 模块导出 `module.exports`与`exports` ``` index.js中 exports.test = 100;//意思就是直接输出一个test变量 ``` 应用 ``` const mod=require('.index'); console.log(mod.test); ``` exports会默认设置为module.exports的快捷方式,可以往里面添加属性( exports.test ),但是不可以修改它的指向,修改了他的指向,他就和普通的对象没有啥差别,因为在common.js里模块对外输出永远是module.exports,如果exports改变了指向之后,就会不在生效。 ## 三、完整语法 ~~~ // foo.js //1、一个一个 导出 module.exports.age = 1 module.exports.foo = function(){} exports.a = 'hello' //2、整体导出 module.exports = { age: 1, a: 'hello', foo:function(){} } // 注意:整体导出不能用`exports` 用exports不能在导入的时候使用 exports = { age: 1, a: 'hello', foo:function(){} } ~~~ ## 四、webpack打包策略 CommonJS里的require对应的是webpack内部的__webpack_require__透出的module.exports,而default的对象被赋值在module.exports.default上,default也只是module.exports的一个叫default名的普通透出对象,自然是要加default属性声明的。 而ES6规范定义,import moduleName from 'modulePath'就是引入一个模块export default的内容,webpack为了遵循这个规范,在内部对default的内容做了标记处理,在引入的时候直接透出default的内容。 因此,对于CommonJS定义的moule.exports.default内容,可以在es6的import中直接引入,例如: CommonJS定义的zh_CN.js中: ``` exports['default'] = { locale: 'zh-cn', ....... }; ``` es6引入的时候: ``` import zhCN from './lib/locale-provider/zh_CN' ```