dynamic import in javascript
import() syntax in es2015
es2015中使用inport和export语法实现的模块体系时完全静态的,模块依赖关系在编译(是的,javscript也是会编译的)时就被决定了,运行时无法更改。这样的优点是可以在编译时进行静态分析,方便进行静态检查和优化。然而静态模块的不便之处似乎更加明显,我们无法动态的加载模块了。
比如在commonjs中,我们可以这样写:1
2
3
4
5
6
7
8
9
10
11
12
13let test;
let moduleName = "";
if (Math.random() > 0.5){
moduleName = "./a.js";
}
else {
moduleName = "./b.js";
}
test = require(moduleName);
console.log(test);
但是在使用es2015的import时是不行的,假如用import重写上面的代码的话,import是在编译阶段被处理的,此时无法知道if语句的条件成立与否,变量也都没有被创建,所以使用import上面的代码会直接在编译阶段报语法错误。所以import和export只能放在代码的最顶层,不能被代码块所包含。
但是动态加载模块有时还是很有用的,所以提出了import()。
因为node8版本还是不支持es2015的模块系统,所以用webpack来配合下。
1 | setTimeout(() => { |
webpack的相关信息可以看文档
import()返回的是一个promise对象,所以和commonjs的require不同,import()是异步的。
其实一开始我还想了下为啥没有export()之类的东西…