历史背景
- require/exports
- 来自野生规范当中,即这些规范是JavaScript社区中的开发者自己草拟的规则,得到了大家的承认和广泛的应用,比如
CommonJS
、AMD
、CMD
等等。而Node
遵循CommonJS
规范,requireJS
遵循AMD
,seaJS
遵循CMD
。 - 因为
Node
无法直接兼容ES6
语法,所以现阶段require/exports
仍然是必要且是必须的。
- 来自野生规范当中,即这些规范是JavaScript社区中的开发者自己草拟的规则,得到了大家的承认和广泛的应用,比如
- import/export
- 来自ES6的新规范,即TC39 制定的新的 ECMAScript 版本。
babel
诞生后,它能将还未被宿主环境(各大浏览器、Node
)直接支持的ES6
语法编译为ES5
,也就是能将ES6 Module
的import/export
编译为CommonJS
的require/exports
这种写法。
差异
写法差异
require/exports
import/export
输出差异
require/exports
require/exports
输出的是一个值的拷贝,也就是说,当你引入一个值,模块内部的变化是影响不到这个值的。
import/export
import/export
输出的是值的索引,也就是说,该引用其实是一个动态引用,并不会缓存值,当模块内部发生变化,你的引入值也会随之更新。
加载差异
require/exports
CommonJS
模块是运行时加载。
因为CommonJS
模块加载的是一个对象,即module.exports
属性,该对象只有在脚本运行完才生成,也因此没办法再编译时做“静态优化”。
import/export
ES6
模块是编译时输出接口。
ES6
模块不是对象,它对外接口只是一个静态定义,在代码静态解析阶段才会生成,因此效率要比CommonJS
模块加载高。
异步差异
require/exports
CommonJS
模块中的require
是同步加载模块。
import/export
ES6
模块的import
命令是异步加载的,有一个独立的模块依赖的解析阶段。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!