在Heroku上部署Node.js应用程序

7
我可以帮忙翻译。以下是您的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 APIapp 进行通信。这在本地机器上运行良好。我已将此项目上传到 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="应用程序崩溃" 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]: 错误:找不到模块'/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"
    }
}

有什么建议吗?先谢谢了。

你的 package.json 位于哪里?它的内容是什么? - therobinkim
2个回答

4
您可能已经在您的package.json文件中将gulp定义为开发依赖项(在devDepenenies下)。当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

针对构建您的捆绑包所需的每个开发依赖项都要重复此操作。或者您可以自己复制并粘贴它们。


据我所知,这是一个常见的问题,没有理想的解决方案。NPM希望在生产环境中,您已经预先构建了文件。就像您将它们发布到NPM一样。然而,在Heroku和其他推送部署解决方案中,情况并非如此。


0

Charlie Martin关于dev-dependencies--production标志是正确的(Heroku正确地传递了该标志)。您可以在nodejs文档中查看有关npm installpackage.json的详细说明-这部分问题已经在其他地方进行了阐述

但是,我强烈建议您在部署时不要通过gulp运行serve任务,而是定义您的npm脚本start来运行browserSync的CLI。这样,您可以将gulp保留为开发依赖项

它可能看起来像这样:package.json

{
  ... other properties ...
  "scripts": {
    "start": "browser-sync start --port 8080 -s"
  },
  ... other stuff ...
}

Browsersync的文档非常好,所以你应该可以找到需要的内容。我建议你在本地调试,直到npm startgulp serve达到相同的效果后再进行部署到Heroku并测试是否工作正常。


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