Node.js应用程序部署在heroku中
我有我的MEAN应用程序的以下文件结构:
root
|---> public
|----> css
|----> js
|----> controller
|----> app.js
|----> views
|----> index.html
|---> app
|----> server.js
|---> node_modules
|---> bower_components
|---> gulpfile.js
|---> package.json
|---> Procfile
在这个应用程序中,我使用gulp
运行public/index.html
,
gulpfile.js :
var gulp = require('gulp');
var browserSync = require('browser-sync');
var server = require('gulp-live-server');
gulp.task('server', function() {
live = new server('app/server.js');
live.start();
})
gulp.task('serve', ['server'], function() {
browserSync.init({
notify: false,
port: process.env.PORT || 8080,
server: {
baseDir: ['public'],
routes: {
'/bower_components': 'bower_components'
}
}
});
gulp.watch(['public/**/*.*'])
.on('change', browserSync.reload);
});
然后使用REST API
与app
进行通信。 这是在本地机器上工作。 我已经把这个项目上传到了heroku
。
我的Procfile :
web: node node_modules/gulp/bin/gulp serve
但它显示错误。 在heroku logs
有以下错误
2017-05-21T16:26:57.305350+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=myapp.herokuapp.com request_id=some-request-id fwd="fwd-ip" dyno= connect= service= status=503 bytes= protocol=https
2017-05-21T15:53:50.942664+00:00 app[web.1]: Error: Cannot find module '/app/node_modules/gulp/bin/gulp'
我的package.json
文件:
{
"name": "myapp",
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"start": "gulp serve"
},
"repository": {
"type": "git",
"url": ""
},
"dependencies": {
"async": "^2.4.0",
"body-parser": "^1.17.2",
"express": "^4.15.3",
"mongoose": "^4.10.0",
"morgan": "^1.8.1",
"multer": "^1.3.0",
"underscore": "^1.8.3"
},
"devDependencies": {
"browser-sync": "^2.18.11",
"gulp": "^3.9.1",
"gulp-live-server": "0.0.30"
}
}
任何建议? 提前致谢。
你可能有gulp
定义为发展依赖(下devDepenenies
在你) package.json
文件。 当NODE_ENV
未设置为production
时,NPM仅安装devDependencies
。
当你部署到Heroku的, NODE_ENV=production
,所以gulp
永远不会安装。 因此,错误...
Error: Cannot find module '/app/node_modules/gulp/bin/gulp'
只需动gulp
和其他任何需要从建立你的包devDependencies
到dependencies
。 你可以让npm为你移动它..
npm uninstall --save-dev gulp
npm install --save gulp
对构建您的包所需的每个开发依赖项重复此操作。 或者您可以自己复制并粘贴它们。
这是没有理想解决方案AFAIK的常见问题。 NPM期望在生产中,您将已经预先构建了您的文件。 就像你将它们发布到NPM一样。 但是,在heroku和其他推动部署解决方案的情况下,情况并非如此。
查理马丁对dev-dependencies
和--production
标志是正确的(Heroku正确地通过了这个标志)。 您可以在nodejs文档中看到有关npm install
和package.json的更多解释 - 这一部分的问题已在其他地方详细阐述过。
不过,我强烈建议部署时不要通过gulp运行服务任务,而是定义npm脚本start
运行browserSync的CLI。 通过这种方式, 您可以将gulp作为开发依赖 。
它可能看起来像这样: package.json
{
... other properties ...
"scripts": {
"start": "browser-sync start --port 8080 -s"
},
... other stuff ...
}
Browsersync的文档非常好,所以你应该找到你需要的。 我会在本地拨弄它,直到npm start
, gulp serve
做同样的事情,然后我会用heroku部署,看看它是否工作。