今天在研究react的lazyRequire时突然想到了这个问题,于是展开了一些列研究。。
要回答这个问题,必须从模块化说起。
所谓模块化主要就是解决代码分割、作用域隔离、模块之间的依赖管理。
通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数。
流行的模块化规范有:CommonJS、AMD、CMD、ES6的模块系统。
这里简单介绍下CommonJS规范和ES6 Module。
1. CommonJS
使用module.exports定义当前模块对外输出的接口,用require加载模块。
2. ES6 Module
其模块功能主要由两个命令构成:export和import。
export用于规定模块的对外接口;import用于输入其他模块提供的功能。
3. 两者区别
CommonJS模块输出的是一个值的拷贝,ES6模块输出的是值的引用。
也就是说,在CommonJS模块中,一旦输出一个值,模块内部的变化就影响不到这个值;而ES6输出的是值的引用,export之后,内部对这个值进行修改,最终export的是修改过的值。
CommonJS模块是运行时加载,ES6模块是编译时加载。
两者各有用武之地:
扫描二维码关注公众号,回复:
6106574 查看本文章
- 可以利用require做懒加载
- 而import是在编译时加载。可以只加载用到的接口,而require会把所有export的接口都加载。
如果大家对“编译
”有疑惑,请看如下链接和微信聊天截图: - 《不是说js不需要编译吗,那‘ES6模块是编译时加载’是什么意思》
- 微信聊天截图
4.参考
https://juejin.im/post/5aaa37c8f265da23945f365c
https://imweb.io/topic/582293894067ce9726778be9
https://www.cnblogs.com/cag2050/p/7419258.html
http://es6.ruanyifeng.com/#docs/module