使用Node.js的最佳部署实践 - 直接将node_modules移动到服务器还是运行npm install命令

31
什么是部署Node.js应用的最佳实践?
1)直接将node_modules文件夹从开发服务器移动到生产服务器,以便我们可以在生产环境中创建相同的本地环境。任何远程修改的节点模块都不会影响我们的代码。
2)使用package.json在生产服务器上运行npm install命令。问题在于,节点模块中的任何更改都会影响我们的代码。我遇到了一些循环回路模块issue link的问题。
有人能帮帮我吗?
5个回答

32
在某些情况下(缺少编译工具、受限的互联网访问等),在生产服务器上运行“npm install”可能无法完成;同时,如果您需要在多台机器上部署同一项目,则可能浪费 CPU、内存和带宽资源。因此,您应该在具有与生产服务器相同的库和节点版本的计算机上运行“npm install --production”,然后压缩“node_modules”并将其部署到生产服务器上。此外,您还应保留“package-lock.json”文件以精确定位版本。
这种方法还允许您在实际部署之前使用开发包构建/测试代码,然后修剪“node_modules”。

1
这应该是被接受的答案。在生产环境中构建不是正确的方法,因为它不允许您在部署之前运行测试。此外,如果您使用TypeScript,则实际上只需要在生产服务器上编译后的.js文件而不是源文件。为了完整起见:如果使用具有本地代码(node-gyp)的节点模块,请确保在相同的架构上构建。 - N4ppeL
1
谢谢你的回答。请问你能否提供一些示例步骤,将一个包含依赖项的Node-Js项目部署到没有/受限制的互联网访问的环境中,并使其保持最新状态? - Felix

6
  • 移动 node_modules 文件夹是过度的。
  • 运行 npm install 可能会破坏版本依赖关系。
  • 最佳方法是使用 npm ci。它使用 package_lock 文件并安装所需的依赖项而不修改版本。 npm ci 适用于持续集成项目。链接

npm cinpm i --production有什么区别? - João Pimentel Ferreira
为什么要过度杀伤?npm ci需要很长时间,它会加载服务器。我看到很多理由不在生产服务器上执行此操作。 - FiftiN

1
我是一名ASP.NET Core开发人员,但最近开始使用Node.js应用程序。对我来说,将node_modules文件夹移动到生产环境中是你提到的挑战之一。我想出并尝试了一种方法,使用Webpack将我的Node.js应用程序打包成单个/多个捆绑包,摆脱了管理node_modules文件夹的混乱。它只会获取我应用程序中正在使用/引用的所需的node_modules软件包,并将其与我的应用程序代码捆绑在一个单独的文件中,然后将该单个文件部署到生产环境而不移动整个node_modules文件夹。
我发现这种方法在我的情况下很有用,但请告诉我是否正确,关于应用程序性能或此方法的任何缺点,请给出建议。

0

肯定是要运行npm install。但是当你部署应用程序时,你不应该亲自动手去做这件事。

使用像PM2这样的工具来完成此操作。

至于你对软件包更改的担忧,简短的答案是package-lock.json


pm2如何帮助npm install - FiftiN

-1

我猜您提出这个问题是因为您并不真正理解package.json文件的作用。

package.json文件专门设计用来实现这一目的(以及上传到npm registry),即在不传输大量依赖项的情况下传输Node包。

我甚至可以说,从根本上讲,您永远不应该手动移动node_modules目录。

在生产服务器上,一定要使用npm install命令,这是正确的方法。为了避免与您的本地环境相比引起对node_modules目录进行任何更改,请使用package lock文件。这应该有助于将对node_modules中源代码的更改最小化。

我的意思不是恶意


6
如果服务器无法访问互联网(出于安全原因等),导致无法避免复制 node_modules 的情况。我觉得这是其中一个例子。请注意,翻译后的内容已经尽可能地保持了原意和简洁性。 - Vasan
1
这是一个很好的观点。我们在工作中的构建服务器上设置了这样的环境,但是我们并没有复制 node_modules,而是使用了我们内部的镜像,这是一种更加优雅的解决方案。 - undefined
你的意思是什么? - undefined
这意味着在 package.json 文件中,版本被指定为 "^3.0.0",如果我们将 packag.lock.json 文件移动到生产服务器并运行 npm install,则在生产环境中安装的版本将与本地相同吗? - Sanjay Kumar N S
1
@Konrad 在生产服务器上的问题不仅是访问互联网,还包括缺乏编译器进行安装。在生产服务器上放置编译工具是不良实践,应该避免。在生产服务器上授予对公共 Node.js 模块存储库的访问权限也是不良实践(就像 RubyGem 存储库一样...)。容易的解决方案是使用从预构建映像构建的容器(即 Docker),但这也并非总是可行的。 - Yanick Girouard
显示剩余3条评论

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