1、commonJs加载规范
module.exports :
暴露
exports:
暴露
require
: 引入
- 区别
// 1、初始化他们是一个空对象
module.exports === exports === {}
// 2、暴露的写法
module.exports = a; //a是你要暴露的内容,可以是任何东西
exports[key] = value; //exports只能是这种写法,不能写exports = a,这种写法
//3、 module.exports才是真正的接口,exports只不过是它的一个辅助工具。
//最终返回给调用的是module.exports而不是exports。
// 所有的exports收集到的属性和方法,都赋值给了Module.exports。
// 当然,这有个前提,就是module.exports本身不具备任何属性和方法。
// 如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
对于区别中第三条的疑问的解释:
先看例子
var counter = 0;
exports.printNextCount = function()
{
counter+=2;
console.log(counter);
}
module.exports = function(){
counter+=10;
this.printNextCount=function(){
console.log(counter)
}
}
var isEq = (exports === module.exports);
console.log(exports);
console.log(module.exports);
console.log(isEq);
打印结果
image.png
说明
exports仅仅是module.exports的一个地址引用。nodejs只会导出module.exports的指向,如果exports指向变了,那就仅仅是exports不在指向module.exports,于是不会再被导出,这可以解释为什么不能使用
exports = {a: 1} //错误,
exports.a = 1;
这种写法,因为,当使用exports = {a:1}时,相当于把exports的指向从module.exports变成了{a:1},当然不会再暴露了。
-
commonJs结论
NodeJs开发者建议导出对象用module.exports,导出多个方法和变量用exports,为了避免混淆,大部分场景用module.exports就行了
来自
https://www.cnblogs.com/ooooevan/p/5897586.html
1、es6模块加载规范
es6模块加载规范不能直接在node里面运行,需要babel,且必须在服务器端,自己手写的html部署在服务器端需要加
<script type="module"></script>
commonJs加载规范,暴露和导入这两个是深拷贝,两者完全脱离关系;ES modules即es6模块加载规范是浅拷贝,两者还存在引用关系
.
网友评论