TLDR: 使用bundler仍然是发布/打包应用程序的最佳方式。
这不仅仅是一个模块的问题,更多地涉及服务器拓扑和整体打包。
例如,您有一些第三方npm模块,它们提供ES模块,即import/export语法。它通常会安装在node_modules文件夹中,它的依赖项也是如此。现在,您要在代码中使用此模块,您希望像这样使用它:
import xyz from 'my-npm-module';
通过上述简单的语句,存在多个问题。以上类型的导入是非相对的导入。对于 Node.js 或者 Webpack 或 Rollup 等打包工具,这只需要从当前目录开始查找 node_modules 文件夹,并一直查找到根目录即可。
现在,浏览器没有这种非相对的导入解析知识(浏览器不使用 Node 模块的解析方式)。所以第一个问题是,浏览器如何知道在服务器上查找这些模块的位置。第二个问题,假设你以某种方式教浏览器使用非相对的模块并遵循 Node 风格的解析算法,你仍然需要打包整个 node_modules 文件夹,包括子目录。这是一个非常繁琐的过程,并且会使应用程序的最终构建大小无端膨胀。
这些都是你仍然需要使用像 Webpack 和 Browserify 这样的打包工具的原因。为了保持简洁,如果你不想支持旧的 JS 引擎,可以跳过 Babel。然而,如果你真的想要在浏览器中使用和传送 ES 模块,请考虑使用支持输出格式为 ES module 的 Rollup.js,而不是 Webpack 的 UMD 或 Common.js。
另一种选择是使用 System.js + JSPM 的应用程序打包方式,其中 ES 模块是默认的,但它没有像 Webpack 或 Rollup 那样的灵活性。此外,还有一种新的打包器——Parcel.js,旨在成为零配置解决方案,并且非常容易使用。你不会注意到所有复杂的细节。
最后,现实世界中的前端打包不仅仅涉及 JavaScript。还有其他的资源文件,例如 TS 文件、ReasonML 文件、图像、SVG 文件,你可能想要将其编译和打包到最终的文件中,使用高级优化技术如 Tree shaking 和 HMR(开发模式),这些打包工具真正擅长于此。
import / export
。 - bill.gates/node_modules
文件夹)。 - Bergi