You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Thx~,a awesome technical post. But I have some puzzles about the details of the above post. Take, for example,the last table(about the comparing of multiple modules) seems to be incorrect in some cases. As for CommonJS, the support for webpack include require.ensure and require. However the post said that the support for webpack include require with AMD. This is the point where the difference arises. Look forward to your reply.
问题
使用 webpack 构建, 动态去加载 css 时,为什么使用
import()
会报错,使用System.import()
可以?原因
require.ensure()
在 webpack1.x 中提供了
require.ensure()
方法动态导入文件,其函数签名如下:简单示例:
注:
require.ensure()
出自 CommonJS 中有一个 Modules/Async/A 规范,该规范定义了require.ensure
语法。webpack 基于此基础,在打包的时候根据require.ensure()
进行代码切分,并异步加载切分后的代码。System.import()
ES6 Loader 规范定义了 System.import 方法,用于在运行时动态加载 ES6 模块,Webpack 把 System.import 作为拆分点;所以也可以通过
System.import()
方法实现动态引入,与require.ensure()
不同的是
System.import()
返回的是一个 Promise,如:import()
而在 webpack v2 (v2.1.0-beta.28) 废弃了
System.import()
方法,在 webpack v3 会完全删除System.import()
方法, 进而支持 ECMAScript State 3 草案阶段的原生import()
方法来替代System.import()
方法。import
ES6 模块与 CommonJS 模块的差异 ,自行理解:
CommonJS
ES6 Module
由于 ES6 中的模块是编译时加载,
import
命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行。所以,下面的代码会报错:注:在 Webpack 2(v2.2.0-rc.5) 中增加对 ES6 模块的原生支持。这意味着 Webpack 现在可以识别 import 和 export,不需要先把它们转换成 CommonJS 模块的格式。
require()、import、import()
require()
是 CommonJS 的实现,用于运行时加载,推荐阅读 require() 源码解读import
是 ECMAScript 6 Module 的语法,import 是静态执行,推荐阅读 import 命令import()
函数是 ECMAScript Stage 3 草案阶段的语法;用于完成动态加载即运行时加载,可以用在任何地方。import()
函数 返回的是一个 Promise。类似于 CommonJs 的require()
,区别主要是前者是异步加载,后者是同步加载,推荐阅读 proposal-dynamic-importimport()
的适用场景:结论
webpack 的 Dynamic Imports 实现主要是利用 ECMAScript的
import()
动态加载特性,而import()
目前只是一个草案,如果需要用此方法,需要引入对应的转换器,如 babel-plugin-syntax-dynamic-import。模块化的实现对比
参考
推荐阅读
写在最后
感谢 @Sean Larkin (webpack 核心开发者之一) 的指点,一眼看出了错误所在 ,那种感觉就像...你懂得...;值得记录一下 😀 😀 😀 😀 😀 😀
The text was updated successfully, but these errors were encountered: