【发布时间】:2021-05-05 00:24:30
【问题描述】:
背景
我正在尝试创建一个“buildless”JavaScript 应用程序,我不需要在每次保存任何源文件时运行watch 任务来转换 JSX、重新捆绑代码等。
仅使用第一方代码就可以正常工作,但是当我尝试从 npm 获取 import 依赖项时,我被卡住了。
目标
我想实现这样的工作流程:
-
npm install foo(假设它是一个 ES 模块,而不是 CommonJS) - 编辑
source/index.js并添加import { bar } from 'foo' -
npm run build。某些东西(webpack、rollup、自定义脚本等)运行,并将foo及其依赖项捆绑到./build/vendor.js中(没有来自source/的任何东西)。 - 编辑
index.html以添加<script src="build/vendor.js" type="module"... - 我可以在浏览器中重新加载
source/index.js,bar将可用。在下一次添加/删除依赖项之前,我不必运行npm run build。
我已经让 webpack 将依赖项拆分到一个单独的文件中,但是在无构建上下文中从该文件到 import,我必须 import { bar } from './build/vendor.js。届时 webpack 将不再捆绑 bar,因为它不是相对导入。
我也尝试过Snowpack,在概念上更接近我想要的,但我仍然无法配置它来实现上述工作流程。
我可以编写一个简单的脚本来将文件从node_modules 复制到build/,但我想使用捆绑软件来实现摇树等。很难找到支持这种工作流程的东西,不过。
【问题讨论】:
-
合乎逻辑的问题是,如果您不想“构建”您的项目,为什么还要使用 webpack。如果你使用 webpack,你将不得不构建。这就是它的工作原理。我已经构建了几十个应用程序,但没有一个使用 webpack 或任何“打包”工具。如果您选择使用 webpack 来提供它提供的功能,那么您选择必须构建您的应用程序。
-
这是一种妥协。理想情况下,它根本不需要,但似乎 production 需要它,而不是在 dev 工作流程期间。如果我可以在没有 webpack 的情况下完成这一切,那就更好了。您如何处理应用程序中的依赖项?
-
呃,澄清一下,有两个原因:1)在开发工作流程中,我使用的是现代浏览器,但对于生产我需要支持 IE10+,所以我需要转译为 ES5 等。我还想转译 HTM 等以提高性能。 2) 依赖关系。假设我要导入eff-diceware-passphrase,它只提供了一个CommonJS 模块,并且有自己的依赖项。构建步骤似乎是必要的,即使只是在开发工作流程中导入它。
-
好吧,如果你在编译,你总是在构建。如果我正在为生产进行编译,我通常也会在我的开发环境中进行编译,所以我正在测试/运行将在生产中运行的相同代码。似乎您可以将外部模块及其依赖项分别构建到它们自己单独导入的包中,只要它们不更新,您就不必重新构建它们。对于生产来说可能效率不高,因为如果你不让捆绑器一起分析所有内容,一些代码可能会重复,但对于开发环境来说可能没问题。
-
例如,您可以将 eff-diceware-passphrase 及其依赖项构建到您导入的一个捆绑脚本中,并且该构建将是一次性的,直到您更新到该模块的较新版本。这类似于在 C++ 中构建一次 DLL,如果没有任何更改,则每次执行新构建时都不会重新构建它。
标签: javascript webpack es6-modules bundling-and-minification snowpack