1执行的顺序:
一般来说,js引擎去执行一个模块(import)会做一下几件事情:
1>语法解析(AST)词法分析语法分析:进行语法分析(AST),解析模块的源码,看是否有语法错误;
2> 加载:递归地加载所有被导入的模块。
3> 连接:没遇到一个新的模块,为其创建作用域并将模块内部申明的所有绑定填充到改作用域,其中就包含由 其他模块导入的内容;
4>运行时:每一个新加载的模块内部执行所有语句;
Import提前计算所有的依赖;
ES6模块系统的实现:在编译的时候,计算所有依赖并将所有模块打包成一个文件,通过网络传输一个文件;
静态VS动态:
1只可以在模块的最外层作用域使用import和export,不可在条件语句中使用,也不能在函数作用域中使用import;
2所有的到处标识符一定要在源码中明确出它们的名字,不可以利用类似数组遍历的处理方式去到处一系列名称列表;
3模块对象被冻结了,不可以hack模块对象并为其添加polyfill风格的新特性;
4一个模块的所有依赖项目,必须在模块代码执行之前就全部加载、解析、并及早链接,不存在通过import来动态按需加载的说法;
5 import没有恢复机制,一个app囊括很多模块,其中一个模块无法加载或无法解析、编译错误,所有的模块都不回正常执行,利用webpack(rollup)可以再编译期期间,检测代码的错误;