模块导出的声明语句有很多种:
1 | module.exports.hello = function() { |
Nodejs遵循的是CommonJS规范,使用require
方法来加载模块,而ES6中是使用import
来加载模块。参考这个图片:
module.export vs exports
1 | function (exports, require, module, __filename, __dirname) { |
可以看出require
规范下module
和exports
都是内置的变量。但是exports
是被module.exports
引用的,所以给任意其一赋值都是可行的。
1 | // working |
这种情况下,模块导出的是包含两个方法的对象。但是对比下面的声明:
1 | // working |
这种情况下,第二个声明失效,因为module.exports
已经被直接赋值,exports
会被忽略。
另外,因为exports
只是一个变量,所以直接给其赋值也是无意义的。
1 | // working |
Nodejs
require
方法无法识别export
导出语句,会直接报错。因此Nodejs
环境下只能使用module.exports
或者exports
语法。
1 | // module.js |
ES6
import
语句可以识别module.exports
、exports
和export
语法。
1 | // module.js |
可以猜想到,import
方法中,export default
和exports.default
是被认为相似的声明,而且不会强制认为必须是相同的导出导入名称匹配。
这种互通,在Server Side Rendering
技术中会有更好的体现。在服务器渲染技术中,我们需要找到一种声明在ES6模块(比如React代码)和Nodejs中都可以被识别,这种情况下,使用module.exports
/ exports
顶替export
会是更好的选择。