ES module与CommonJs的区别
1、在导出时使用别名的不同
1 | //ES Module |
2、CommonJS在require文件的时候采用文件路径,并且可以忽略.js文件扩展名,但是ESModule在import的时候采用的是URL规范就不能省略文件的扩展名,而必须写成完整的文件名,如果你自己使用Babel编译的方式将ESModule编译成CommonJS,因为Babel自己做了处理所以可以省略文件扩展名
3、ESModule的import与export都只能写在最外层,不能放在块级作用域或者函数作用域中,比如
1 | if(condition){ |
但是这种写法在CommonJS中是允许的,比如
1 | let api |
4、require是一个函数调用,路径是参数字符串,它可以动态拼接;但是ESModule的import语句是不允许用动态路径的
1 | const libPath = ENV.supportES6 ? './es6/' : './' |
但是,ESModule提供了一个异步加载模块的机制,将import作为异步函数使用,所以我们可以这样动态加载:
1 | //foo.mjs(ESModule是用.mjs扩展名,如果想要用ESModule定义.js文件的模块,可以在node.js的配置文件中设置参数type:module) |