为什么在Node中要使用webpack-node-externals?

29

我正在使用webpack打包我的TypeScript Node.js代码。

我使用webpack-node-externals避免在编译期间出现node_modules中的错误。

webpack-node-externals表示可以定义外部依赖项 - 不应该被捆绑的模块。

但为什么呢?Webpack应该将我需要启动打包的所有内容都捆绑在一起,对吧?它可以提取和删除我不使用的模块(例如tree-shake)。

如果我使用webpack-node-externals,那么我就必须在我的生产文件夹中执行npm i以获取所有依赖项。

我认为这违背了webpack的意图。对吧?


2
那么我就必须在我的生产文件夹中执行npm i以获取所有依赖项。这可能是您应该采取的措施。Webpack无法捆绑Node本地模块,而它们是常见的。看起来您误解了Webpack在Node应用程序中的作用。有可能您根本不需要它。 - Estus Flask
2
是的,在一个Node应用程序中,你可能不需要那个。 - PlayMa256
2
webpack 无法打包 fs、path 等一些模块,还有一些你安装的二进制模块也无法打包。 - PlayMa256
2个回答

16

我认为你说得对,在你的情况下,将文件捆绑成单个文件更有意义。 webpack-node-external 似乎是为NodeJS库设计的,而不是独立应用程序。来自他们的文档

例如,编写节点库时,您可能希望将代码拆分为几个文件,并使用Webpack将它们捆绑在一起。但是-您不希望将代码与其整个node_modules依赖项捆绑在一起,原因如下:

  1. 它会使您的库在npm上膨胀。
  2. 它违反了整个npm依赖项管理。如果您正在使用Lodash,并且您的库的使用者也具有相同的Lodash依赖项,则npm确保仅添加一次。但是,在库中捆绑Lodash实际上会使其包含两次,因为npm不再管理此依赖关系。

作为库的使用者,我希望库代码仅包含其逻辑,并指出其依赖项,以便它们可以与我的项目中的其他依赖项合并/解析。将您的代码与其依赖项捆绑在一起几乎是不可能的。

我不同意那些声称Webpack不是为了捆绑Node脚本而设计的评论,因为Webpack有一个专门的设置来做到这一点(目标。遗憾的是,有太多第三方库与Webpack不兼容(就像我今天刚发现的那样),因此从实用的角度来看,你最好还是将模块安装在发布文件夹中。


2
这是因为 node_modules/ 中存在二进制依赖,具体解释请参考:https://archive.jlongster.com/Backend-Apps-with-Webpack--Part-I

Webpack 会从 node_modules 文件夹中加载模块并进行打包。这对于前端代码来说没问题,但后端模块通常不准备好(即使用不规范的 require),甚至更糟糕的是存在二进制依赖。

我已经仔细阅读了此解释,你可以查看我的学习笔记:https://github.com/ApolloTang/wf-backend-with-webpack-explained/tree/main/steps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接