node中commonJs模块加载规范和es6模块加载规范

2020-07-05  本文已影响0人  WWWWWWWWWWWWWWM

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},当然不会再暴露了。

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模块加载规范是浅拷贝,两者还存在引用关系

.

上一篇下一篇

猜你喜欢

热点阅读