Javascript模块加载定义和模块加载程序的状态 现在所有模块加载定义之间是否有赢家?CommonJS、AMD、UMD、ES6。那么模块加载器呢,我们应该使用哪一个? ng4上的Angular cli使用SystemJS模块加载程序,对吗?

Javascript模块加载定义和模块加载程序的状态 现在所有模块加载定义之间是否有赢家?CommonJS、AMD、UMD、ES6。那么模块加载器呢,我们应该使用哪一个? ng4上的Angular cli使用SystemJS模块加载程序,对吗?,angular,angular-cli,amd,commonjs,es6-module-loader,Angular,Angular Cli,Amd,Commonjs,Es6 Module Loader,如果您正在编写JavaScript,我认为您肯定应该使用ES6模块ESM。但是,由于ESM现在在浏览器中的实现方式存在一些限制-动态导入仅在Chrome中受支持,而命名模块AFAIK甚至不在规范中-因此您必须使用模块加载器。我使用SystemJS按需加载模块。不幸的是,它不支持ESM,因此首先需要将它们转换为SystemJS支持的任何格式。我选择CommonJS,因为它的格式与NodeJS上使用的格式相同,而且我更熟悉它。转换可以通过TypeScript方便地完成。一旦浏览器完全支持ESM,包括

如果您正在编写JavaScript,我认为您肯定应该使用ES6模块ESM。但是,由于ESM现在在浏览器中的实现方式存在一些限制-动态导入仅在Chrome中受支持,而命名模块AFAIK甚至不在规范中-因此您必须使用模块加载器。我使用SystemJS按需加载模块。不幸的是,它不支持ESM,因此首先需要将它们转换为SystemJS支持的任何格式。我选择CommonJS,因为它的格式与NodeJS上使用的格式相同,而且我更熟悉它。转换可以通过TypeScript方便地完成。一旦浏览器完全支持ESM,包括我上面提到的限制,大多数项目将能够删除SystemJS依赖项


然而,大多数前端应用程序现在使用模块绑定器网页包。它基于CommonJS将ESM模块转换为自己的模块格式,因此通常不需要单独的模块加载程序。但由于Webpack无法在构建时加载它不知道的模块,如果您需要在运行时加载动态第三方模块,您仍然需要SystemJS。我正在处理的应用程序就是这样。

angular使用webpack作为默认模块加载程序/绑定程序。@Orlandster,它是模块绑定程序,而不是加载程序。它不能在demandHi上加载模块,您的动态第三方模块将在运行时加载,这是否意味着Webpack不能动态加载它不知道的模块,但SystemJS可以。这也是AMD/RequireJS所擅长的——动态模块加载吗?@Hao,是的,他们都能做到,但SystemJS现在是首选解决方案