Javascript 模块加载定义和模块加载器的状态
The state of Javascript module loading definition and module loaders
- 现在所有的模块加载定义有没有赢家? CommonJS、AMD、UMD、ES6。那么外面的模块加载器呢,我们应该使用哪一个?
- Angular-ng4 上的 cli 使用 SystemJS 模块加载器,正确吗?
如果您正在编写 JavaScript,我认为您绝对应该使用 ES6 模块 (ESM)。但是由于现在在浏览器中实现 ESM 的方式有一些限制——动态导入仅在 Chrome 中支持,命名模块 AFAIK 甚至不在规范中——你被迫使用模块加载器。我正在使用 SystemJS 按需加载模块。不幸的是,它也不支持 ESM,因此首先需要将它们转换为 SystemJS 支持的任何格式。我选择 CommonJS,因为它与 NodeJS 上使用的格式相同,而且我更熟悉。转换由 TypeScript 方便地完成。一旦浏览器完全支持 ESM,包括我上面提到的限制,大多数项目将能够删除 SystemJS 依赖项。
但是,大多数前端应用程序现在都使用模块捆绑器 Webpack。它将 ESM 模块转换成它自己的模块格式(基于 CommonJS),因此您通常不需要单独的模块加载器。但是由于 Webpack 无法在构建期间加载它不知道的模块,如果您需要在运行时加载动态 3rd 方模块,您仍然需要 SystemJS。我正在处理的应用程序就是这种情况。
- 现在所有的模块加载定义有没有赢家? CommonJS、AMD、UMD、ES6。那么外面的模块加载器呢,我们应该使用哪一个?
- Angular-ng4 上的 cli 使用 SystemJS 模块加载器,正确吗?
如果您正在编写 JavaScript,我认为您绝对应该使用 ES6 模块 (ESM)。但是由于现在在浏览器中实现 ESM 的方式有一些限制——动态导入仅在 Chrome 中支持,命名模块 AFAIK 甚至不在规范中——你被迫使用模块加载器。我正在使用 SystemJS 按需加载模块。不幸的是,它也不支持 ESM,因此首先需要将它们转换为 SystemJS 支持的任何格式。我选择 CommonJS,因为它与 NodeJS 上使用的格式相同,而且我更熟悉。转换由 TypeScript 方便地完成。一旦浏览器完全支持 ESM,包括我上面提到的限制,大多数项目将能够删除 SystemJS 依赖项。
但是,大多数前端应用程序现在都使用模块捆绑器 Webpack。它将 ESM 模块转换成它自己的模块格式(基于 CommonJS),因此您通常不需要单独的模块加载器。但是由于 Webpack 无法在构建期间加载它不知道的模块,如果您需要在运行时加载动态 3rd 方模块,您仍然需要 SystemJS。我正在处理的应用程序就是这种情况。