如何打包和部署Node.js + express Web应用程序?


83

我是Node.js编程的新手,我最近使用mongoDB创建了一个示例工作Web应用程序(express,bone和其他免费视图技术)。现在,我正要在暂存环境中部署该应用程序,但我不确定如何打包此应用程序并将其分发。[我可以照顾mongoDb并分别进行设置]

我来自Java世界,在那里我们为可重用的libs创建了jars,并为servlet容器中部署的Web应用程序创建了war / ear软件包。现在在这种情况下,由于node.js本身也充当Web容器,因此如何打包我的Webapp?

  1. 使用express构建的打包节点Web应用程序是否有任何标准格式/准则?(是否有用于节点应用程序的类似的jar / war包装系统?)
  2. 打包后如何部署?由于它也是它自己的容器,它将成为一个exe吗?

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


对于我的Java项目,我们使用Maven作为构建/部署工具。在过去,我有蚂蚁的经验。我确实看过Grunt for Node.js,但是我只能从它的任务中了解到,它执行预处理任务(如缩小,concat,JSHint等。),它没有提到有关打包应用程序然后说安装的任何内容。到存储库中(例如maven的工作方式)。
KBJ 2014年

Answers:


44

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

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

我认为最近很有帮助的一些幻灯片,其中也包含永久性的包装器主题,可以在这里找到。


抱歉,您的回复如此延迟。在尝试了所有可能的组合之后,我最终得到了上述建议。谢谢!
KBJ 2014年

4
如果我不希望npm从互联网下载模块怎么办。相反,我想将所有物品都运送到包裹中。是否也可以发送node_modules文件夹?它行得通吗?我问的原因是:我的应用程序可能在没有Internet连接的情况下在Intranet环境中运行。
Stefan

2
@Stefan取决于随附的模块。由于一些不是纯JS的模块需要首先构建,因此将它们移动到其他环境可能会破坏它们。我还没有处理这个问题,但是也许使用npm cache提供了一个可行的解决方案,方法是使用完整的软件包列表填充缓存,然后从中进行安装(和构建)。
MildlySerious

89

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

我想运行单元测试。

但是在生产中

我想跳过单元测试。

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

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

如果要查看示例应用程序,可以在此处找到示例博客应用程序。检查文件夹结构,package.json以供参考。

对于部署,我建议您将heroku部署为启动应用程序。您可以在此处找到方法。这是基于git的简单部署。

在项目运行阶段,只需设置您的环境NODE_ENV=developmentnode app.js。这app.js是您的项目中。

这是java和nodejs的相对概念;

  1. maven clean install => npm install
  2. .m2文件夹=> node_modules(在项目文件夹下)
  3. mvn test=> npm test(关于的测试部分package.json
  4. junit,,powermock... => mocha节点单元,...
  5. Spring MVC=> Express.JS
  6. pom.xml => package.json
  7. import package => require('module_name')

很有用。在package.json中,是否有一种方法可以指定版本,以最大程度地减少因依赖项更改而造成的破坏可能性?
mikijov 2015年

2
@MikiJ当然,您可以为模块(依赖项)指定版本。语义版本在使用的package.json,你可以看到这里了解详情
侯赛因BABAL

不错的Java-节点比较。大!!谢谢!!
亚历杭德罗·特谢拉·穆尼奥斯

大。!!有什么与Java中的War文件等效的东西吗?因为我们只部署类文件而不是源文件,所以在节点中有类似的事情,而不是部署整个JS文件。
Mdumanoj

@HüseyinBABAL您的类比并不完全正确。因为mvn clean install创建了一个捆绑的.war文件,该文件可以轻松部署到世界上的任何服务器并java -jar *.war在该服务器中执行。但是,如何为我的节点项目创建捆绑文件!以及如何在服务器中执行它!
KNDheeraj

6
  1. 使用express构建的打包节点Web应用程序是否有任何标准格式/准则?(是否有用于节点应用程序的类似的jar / war包装系统?)

是的,CommonJS包规范

该规范描述了用于分发CommonJS程序和库的CommonJS包格式。CommonJS软件包是将模块,代码和其他资产的集合内聚在一起包装成一种形式。它为CommonJS组件的便捷交付,安装和管理提供了基础。

对于下一个问题:

2.打包后如何部署?由于它也是它自己的容器,它将成为一个exe吗?

我赞同Hüseyin关于在Heroku上进行生产部署的建议。为了进行开发和登台,我分别将Node-Appliance与VirtualBox和Amazon EC2结合使用:

该程序采用由build-debian-cloud或Debian-VirtualBox-Appliance构建的Debian机器,并将其转换为能够运行通过git部署的Node应用程序的Node.js“设备”。

您的webapp不会成为exe


1
感谢您所做的仅是回答daggone问题。
monsto

6

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


5

几种解决方法:

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

  • npm从中创建一个NPM软件包,在您的登台环境中通过安装它(这也应该照顾所有依赖项)

  • 手动将文件复制/ ssh文件到暂存环境(可以使用进行自动操作Grunt),然后通过npm


2

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

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

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

优点之一还在于,在生产环境中,您实际上不需要让客户安装node.js,因为节点二进制文件也被打包在内部版本中。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.