Node.js + express web应用如何打包部署?

Posted

技术标签:

【中文标题】Node.js + express web应用如何打包部署?【英文标题】:How to package & deploy Node.js + express web application? 【发布时间】:2014-02-11 02:37:11 【问题描述】:

我是 Node.js 编程的新手,我最近使用(express、backbone 和其他免费视图技术,以及 mongoDB)创建了一个示例工作 Web 应用程序。现在,我想在登台环境中部署相同的应用程序,但我不确定如何打包此应用程序并分发它。 [我可以照顾mongoDb并单独设置它]

我来自 Java 世界,在那里我们为部署在 servlet 容器中的 Web 应用程序创建可重用库和 war/ear 包的 jar。现在在这种情况下,由于 node.js 本身也充当 web 容器,我该如何打包我的 webapp?

    是否有使用 express 构建的打包节点 webapps 的标准格式/指南? (节点应用程序是否有类似的 jar/war 打包系统?) 打包后如何部署?它会变成一个 exe,因为它也是它自己的容器吗?

PS:到目前为止,我正在考虑将所有必需的源文件手动复制到登台环境中并运行 npm 命令以下载该机器上的所有依赖项,然后使用“永远”或其他一些机制来运行我的服务器。 js。 (另外,添加某种监控,以防应用程序崩溃并永远失败)我不确定这是否是正确的方法?我确信必须有一些标准化的方法来解决这个问题。

【问题讨论】:

对于我的 java 项目,我们使用 Maven 作为构建/部署工具。在过去,我甚至有蚂蚁的经验。我确实看过 Grunt for Node.js,但我从它的任务中所能理解的是,它执行预处理任务(如缩小、concat、JSHint 等),它没有提到任何关于打包应用程序然后说安装进入存储库(就像 Maven 一样)。 【参考方案1】:

部署Node.js 应用程序非常简单。在 Maven 中,有pom.xmlNode.js 中的相关概念是 package.json。您可以在 package.json 上声明您的依赖关系。您也可以在package.json 上进行环境设置。例如,在开发环境中,您可以这样说

我想运行单元测试。

但在生产中;

我想跳过单元测试。

.m2 文件夹下有 maven 的本地存储库。在 Node.js 中,您的 Node.js 项目下有 node_modules 文件夹。您可以看到模块文件夹及其名称。

让我们来看看这个答案的grunt 部分。 Grunt 是您的前端资产、htmljavascript、css 的任务管理器。例如,在部署之前,您可以缩小 html、css、javascript 甚至图像。您也可以将grunt 任务运行函数放在package.json 中。

如果您想查看示例应用程序,可以找到示例博客应用程序here。检查文件夹结构和package.json 以供参考。

对于部署,我建议您为启动应用程序进行 Heroku 部署。你可以找到如何here。这是基于 git 的简单部署。

在项目运行部分,只需设置您的环境NODE_ENV=developmentnode app.jsapp.js 在您的项目中。

这里是java和nodejs的相对概念;

    maven clean install => npm install .m2 文件夹 => node_modules(在项目文件夹下) mvn test => npm test(package.json上的测试部分) junit, powermock, ... => mocha, node-unit, ... Spring MVC => Express.JS pom.xml => package.json import package => require('module_name')

【讨论】:

非常有用。在 package.json 中,有没有办法指定版本以最大程度地减少由于依赖项更改而破坏的可能性? @MikiJ 当然,您可以为模块(依赖项)指定版本。 package.json中使用了语义化的版本控制,更多细节可以看here 不错的 Java - 节点比较。伟大的!!谢谢!! 太棒了!! Java中有没有相当于War文件的东西?因为我们只会部署类文件而不是源文件,所以在 node 中是否有类似的东西而不是部署整个 JS 文件。 @HüseyinBABAL 您的类比并不完全正确。因为mvn clean install 创建了一个捆绑的.war 文件,可以轻松地部署到世界上的任何服务器,java -jar *.war 在服务器中执行它。但是如何为我的节点项目创建捆绑文件!以及如何在服务器中执行它!!【参考方案2】:

没有标准化的方法,但您走在正确的轨道上。如果您的package.json 是最新的并且保存完好,您可以将您的应用目录复制/压缩/克隆到生产系统,不包括node_modules

在您的生产系统上,运行 npm install 安装你的依赖,npm test 如果你有测试,最后NODE_ENV=production node server.js

我认为最近的一些幻灯片很有帮助,其中还包括像永远这样的包装器的主题,可以找到here。

【讨论】:

抱歉,回复延迟。在尝试了所有可能的组合之后,我最终得到了上述建议。谢谢! 如果我不想让 npm 从互联网上下载模块怎么办。相反,我想运送包裹中的所有东西。是否也可以发送 node_modules 文件夹?它有效吗?我问的原因是:我的应用程序可能运行在 Intranet 环境中,没有 Internet 连接。 @Stefan 取决于您随附的模块。由于需要先构建一些不是纯 JS 的模块,因此将它们移动到不同的环境可能会破坏它们。我还没有处理这个问题,但也许使用npm cache 提供了一个可行的解决方案,通过使用完整的包列表填充缓存,然后从中安装(和构建)。【参考方案3】:

希望这可能对寻找解决方案的人有所帮助,Node js 应用程序的打包可以使用“npm pack”命令完成。它会创建一个可以在生产/暂存环境中运行的应用程序的 zip 文件。

【讨论】:

【参考方案4】:
    是否有打包节点 webapps 的标准格式/指南 使用快递构建? (是否有类似的 jar/war 包装系统 节点应用?)

是的,the CommonJS Packages specification:

本规范描述了 CommonJS 的包格式 分发 CommonJS 程序和库。 CommonJS 包是一个 模块、代码和其他资产集合的内聚包装 成一个单一的形式。它提供了方便交付的基础, CommonJS 组件的安装和管理。

对于您的下一个问题:

2。打包后如何部署?它会变成一个 exe,因为它也是它自己的容器吗?

我赞同 Hüseyin 的建议,即在 Heroku 上部署以进行生产。对于开发和暂存,我分别将 Node-Appliance 与 VirtualBox 和 Amazon EC2 一起使用:

这个程序需要一个由 build-debian-cloud 构建的 Debian 机器或 Debian-VirtualBox-Appliance 并将其变成 Node.js “设备”, 能够运行通过 git 部署的 Node 应用程序。

您的网络应用不会变成exe

【讨论】:

感谢您只是简单地回答了达贡的问题。【参考方案5】:

解决这个问题的几种方法:

将您的代码推送到 Git 存储库,排除所有不是您的代码 (node_modules/**),然后将其拉入您的暂存环境,运行 npm install 以恢复所有依赖项

从中创建一个 NPM 包,通过 npm 在您的暂存环境中安装它(这也应该处理所有依赖项)

手动复制/ssh 文件到您的临时环境(这可以通过Grunt 自动完成),而不是通过npm 恢复您的依赖关系

【讨论】:

【参考方案6】:

我使用了 zeit 的 pkg 模块。它可以为 linux/win/macos 创建跨平台的可交付成果。实际在生产中使用它并且工作正常,没有任何问题。

它接受所有的js脚本并将其打包到一个文件中。

我使用它的原因是因为它有助于保护您的源代码。这样,在客户环境的生产环境中,他们将可以访问应用程序,但不能访问源代码。

还有一个优点是,在生产环境中,您实际上不需要让客户安装 node.js,因为节点二进制文件也会打包在构建中。

https://www.npmjs.com/package/pkg

【讨论】:

以上是关于Node.js + express web应用如何打包部署?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node-Express / Vue Web 应用程序中管理 OAuth?

Express - 基于 Node.js 平台的 web 应用开发框架

express js 可以做啥

有哪些关于 Node.js 以及 Express 的书籍

从 Express/node.js Web 应用程序预填充 HTML/Jade

使用node.js的开发框架express创建一个web应用