ES6中,
export、export default 均可用于导出常量、函数、文件、模块等。
你可以在其它文件或模块中通过 import + (常量 | 函数 | 文件 | 模块)名的方式,将其导入。
在一个文件或模块中,export、import可以有多个,export default仅有一个。
特别提醒:ES6的模块关键字是js原生的,不要和非js原生的同步/异步模块技术搞混。
Node中,
module.exports、exports 的区别:
module.exports 初始值为一个空对象 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是 exports,
module.exports才是真正的接口,exports收集到的属性和方法,都赋值给了module.exports,
有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
特别提醒:Node是实现了同步模块技术,但不要和也实现了同步模块技术的Webpack搞混。
Webpack中,
Webpack对于同步/异步模块技术均支持,它实现了同步技术规范里面的异步规范。
如,webpack的函数require根据参数不同(是否具备回调函数),
既可以实现同步加载,也可以实现异步加载。
另外,Webpack也定义了专用的异步加载函数require.ensure,
同时,扩展了一个函数require.include来实现预加载功能。
特别提醒:Webpack模块加载技术一般只是作用在程序打包或者转译时,而不是在系统运行时。
总结: 起码有一点,我们在项目中使用模块加载技术的时候,要明白你现在使用的关键字是属于谁的!
比如require关键字,是属于node的,还是webpack的,因为它们都有require函数。
如果连这个都弄糊涂了,就没法继续了,后来的事情会保持模棱两可直到搞清楚,
所以,学习的时候,要尽量站到全局的角度看问题。
其他实现了同步或异步模块技术的库(比如,RequireJS等库)暂不讲,因为它们功能都比较单一,不易混淆,
主要容易混淆的还是在上面三者间,当项目中同时使用了nodejs,es6,webpack时就容易造成理解和使用混乱。
比如es6的import会被转化为commonjs(同步)格式或者是AMD(异步)格式,所以不要把它认为是一种新的模块引用方式,babel默认会把ES6的模块转化为commonjs规范的,你也不用费劲再把它转成AMD了,(但如果有需要转译成AMD的形式,可以借助第三方工具,比如 Traceur)。
同时,es6也支持可编程式的按需导入模块,也因此实现了异步加载,比如:
System.import('./module1.js')
.then(function(module1){
// use module1
}, function(e){
// handle error
});
由此可见,es6的模块技术已经能或者说即将会替代非原生的模块加载技术,所以值得拥有和学习它!
export、export default 均可用于导出常量、函数、文件、模块等。
你可以在其它文件或模块中通过 import + (常量 | 函数 | 文件 | 模块)名的方式,将其导入。
在一个文件或模块中,export、import可以有多个,export default仅有一个。
特别提醒:ES6的模块关键字是js原生的,不要和非js原生的同步/异步模块技术搞混。
Node中,
module.exports、exports 的区别:
module.exports 初始值为一个空对象 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是 exports,
module.exports才是真正的接口,exports收集到的属性和方法,都赋值给了module.exports,
有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
特别提醒:Node是实现了同步模块技术,但不要和也实现了同步模块技术的Webpack搞混。
Webpack中,
Webpack对于同步/异步模块技术均支持,它实现了同步技术规范里面的异步规范。
如,webpack的函数require根据参数不同(是否具备回调函数),
既可以实现同步加载,也可以实现异步加载。
另外,Webpack也定义了专用的异步加载函数require.ensure,
同时,扩展了一个函数require.include来实现预加载功能。
特别提醒:Webpack模块加载技术一般只是作用在程序打包或者转译时,而不是在系统运行时。
总结: 起码有一点,我们在项目中使用模块加载技术的时候,要明白你现在使用的关键字是属于谁的!
比如require关键字,是属于node的,还是webpack的,因为它们都有require函数。
如果连这个都弄糊涂了,就没法继续了,后来的事情会保持模棱两可直到搞清楚,
所以,学习的时候,要尽量站到全局的角度看问题。
其他实现了同步或异步模块技术的库(比如,RequireJS等库)暂不讲,因为它们功能都比较单一,不易混淆,
主要容易混淆的还是在上面三者间,当项目中同时使用了nodejs,es6,webpack时就容易造成理解和使用混乱。
比如es6的import会被转化为commonjs(同步)格式或者是AMD(异步)格式,所以不要把它认为是一种新的模块引用方式,babel默认会把ES6的模块转化为commonjs规范的,你也不用费劲再把它转成AMD了,(但如果有需要转译成AMD的形式,可以借助第三方工具,比如 Traceur)。
同时,es6也支持可编程式的按需导入模块,也因此实现了异步加载,比如:
System.import('./module1.js')
.then(function(module1){
// use module1
}, function(e){
// handle error
});
由此可见,es6的模块技术已经能或者说即将会替代非原生的模块加载技术,所以值得拥有和学习它!