无模块时有哪些问题
1.命名冲突
2.无依赖管理
CommonJS 和 es6 module的区别:
CommonJS | es6 module |
---|---|
社区制定的模块加载方案 | es6标准 |
用于服务器端 | 浏览器和服务器通用的模块解决方案 |
运行时加载 | 编译时输出接口 |
输出值的拷贝 | 输出值的引用,与其对应的值是动态绑定关系 |
动态语法可写在判断里 | 静态语法只能写在顶层 |
顶层this指向当前模块 | 顶层的this指向undefined |
CommonJS 运行时加载 - 只有运行时才能得到这个对象,导致完全没办法在编译时做“静态优化”。
es6 module编译时加载/静态加载 - 在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。使得静态分析成为可能。
其它es6 module好处:
- 将来服务器和浏览器都支持 ES6 模块格式。
- 将来浏览器的新 API 就能用模块格式提供,不再必须做成全局变量或者navigator对象的属性。
- 不再需要对象作为命名空间(比如Math对象),未来这些功能可以通过模块提供。
AMD、CMD与CommonJS区别:
- CommonJS是同步的,用于服务器端,
- AMD、CMD是异步的,用于浏览器端。
AMD、CMD区别:
- AMD推崇依赖前置,提前执行。
- CMD推崇依赖就近,延迟执行。
参考资料