You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// counter.jsexports.count=0setTimeout(function(){console.log('increase count to',++exports.count,'in counter.js after 500ms')},500)// commonjs.jsconst{count}=require('./counter')setTimeout(function(){console.log('read count after 1000ms in commonjs is',count)// read count after 1000ms in commonjs is 0},1000)//es6.jsimport{count}from'./counter'setTimeout(function(){console.log('read count after 1000ms in es6 is',count)// read count after 1000ms in es6 is 1},1000)
看了一些相关的文章,大致就是一下几点:
1. es6模块化是值的引用,而CommonJS获取的是值的拷贝。
一提到拷贝就明白了,就是不管被引用的的文件里的值怎么变,都不会影响到引入文件的这个文件里面的变化。 说的有的拗口,上代码看一下:
一下子就看出区别来了
2. es6模块化是编译时输出,CommonJS是运行时加载
可能一下也理解不了。这里说一下这一点导致的影响吧。由于,
es6
的模块化是编译时输出的,所以我们要在文件开头就声明。而CommonJS
是运行时才加载,所以我们可以随时随地的用require
来加载模块。并且CommonJS
是同步阻塞的加载的,当执行到require
的时候,就会去执行require
的文件。但是如果这个模块已经被加载过,存在缓存列表里了的话,就会去读缓存。所以 ES6 的模块化可以用 Tree-shaking
执行结果:
具体的可以参看:CommonJS 和 ES6 Module 究竟有什么区别? 的「缓存和循环引用」部分。或者 Node 文档 CommonJS 模块
3. es6的模块化不能直接用,CommonJS可以直接用
es6的模块化需要被编译才能被浏览器使用
4. 自动开启严格模式
es6 的模块化
this
是undefined
,CommonJS 是当前模块
参考
Module 的加载实现 阮一峰
require,import区别? 寸志知乎回答
The text was updated successfully, but these errors were encountered: