我是Node.js编程的新手,我最近使用(express,backbone和其他免费视图技术,使用mongoDB)创建了一个示例工作Web应用程序。现在,我想要在暂存环境中部署相同的内容,我不知道如何打包此应用程序并分发相同的内容。 [我可以照顾mongoDb并单独设置]
我来自Java世界,在那里我们为可重用的libs和用于Web应用程序的war / ear包创建jar,它们部署在servlet容器中。现在在这种情况下,因为node.js本身也充当了Web容器,我如何打包我的webapp?
答案 0 :(得分:86)
部署Node.js
应用程序非常简单。在maven中,有pom.xml
。 Node.js
中的相关概念是package.json
。您可以在package.json
上声明您的依赖项。您还可以在package.json
上进行环境设置。例如,在开发环境中,您可以说
我想进行单元测试。
但在生产中;
我想跳过单元测试。
您在.m2
文件夹下拥有maven的本地存储库。在Node.js中,Node.js项目下有node_modules
个文件夹。您可以看到带有名称的模块文件夹。
让我们来看看这个答案的grunt
部分。 Grunt
是您的前端资产的任务管理器,html,javascript,css。例如,在部署之前,您可以缩小html,css,javascript甚至图像。您还可以在grunt
中放置package.json
任务运行功能。
如果您想查看示例应用程序,可以找到示例博客应用程序here。检查文件夹结构和package.json
以供参考。
对于部署,我建议您使用heroku部署启动应用程序。你可以找到如何here。这是基于git的简单部署。
在项目运行部分,只需设置您的环境NODE_ENV=development
和node app.js
即可。此处app.js
位于您的项目中。
这是java和nodejs的相对概念;
maven clean install
=> npm install
.m2
folder => 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')
答案 1 :(得分:39)
没有标准化的方法,但你走在正确的轨道上。如果您的package.json
是最新且保存完好的,您只需将您的应用目录复制/压缩/克隆到生产系统,node_modules
除外。
在您的生产系统上运行
npm install
安装您的依赖项,npm test
如果您有测试,最后NODE_ENV=production node server.js
最近的一些幻灯片我认为非常有帮助,也包括像永远这样的包装主题,可以找到here。
答案 2 :(得分:6)
- 是否有任何包装节点webapps的标准格式/指南 建使用快递? (是否有类似的罐子/战争包装系统 节点应用程序?)
醇>
是的,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
。
答案 3 :(得分:5)
希望这对寻找解决方案的人可能有所帮助,可以使用“ npm pack”命令打包Node js应用程序。它会为您的应用程序创建一个zip文件,该文件可以在生产/登台环境中运行。
答案 4 :(得分:4)
很少有办法解决这个问题:
将您的代码推送到Git存储库,排除不是您的代码(node_modules/**
)的所有内容,然后将其拉到您的暂存环境中,运行npm install
以恢复所有依赖项
从中创建一个NPM包,通过npm
在您的临时环境中安装它(这也应该处理所有依赖项)
手动复制/ ssh文件到您的登台环境(这可以通过Grunt
自动完成),而不是通过npm
答案 5 :(得分:0)
我使用了zeit的pkg模块。它可以为linux / win / macos创建跨平台可交付成果。实际上已在生产中使用它,并且工作正常,没有任何问题。
它接收所有js脚本并将其打包到一个文件中。
我之所以使用它,是因为它有助于保护您的源代码。这样,在客户环境下的生产中,他们将可以访问应用程序,但不能访问源代码。
优点之一是,在生产环境中,您实际上不需要让客户安装node.js,因为节点二进制文件也被打包在内部版本中。