2017-04-21 71 views
1
找到模块

我正在使用Gulp来构建我的所有资产。对于JavaScript,我有一个使用Browserify解决我所有代码依赖项的任务。Heroku - 使用Gulp&Browserify节点:错误无法从

当我在本地运行我的项目时,一切正常。但是,在Heroku的部署时,咕嘟咕嘟失败,出现以下错误:

2017-04-21T20:35:28.370935+00:00 app[web.1]: Error: Cannot find module './components/feed' from '/app/client/web/public/dev/js' 
2017-04-21T20:35:28.370935+00:00 app[web.1]:  at /app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:55:21 
2017-04-21T20:35:28.370936+00:00 app[web.1]:  at load (/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:69:43) 
2017-04-21T20:35:28.370937+00:00 app[web.1]:  at onex (/app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:92:31) 
2017-04-21T20:35:28.370937+00:00 app[web.1]:  at /app/node_modules/browser-resolve/node_modules/resolve/lib/async.js:22:47 
2017-04-21T20:35:28.370938+00:00 app[web.1]:  at FSReqWrap.oncomplete (fs.js:123:15) 

这是咕嘟咕嘟任务

gulp.task('bundle',() => { 
    const javascriptFiles = [ 
    { 
     src: './client/web/public/dev/js/main.js', 
     outDir: './client/web/public/production/js', 
     outFile: 'main.bundle.js' 
    } 
    ] 
    javascriptFiles.forEach((file) => { 
    const bundler = browserify({ 
     entries: [ file.src ], 
     extensions: ['.js'], 
     paths: ['./node_modules','./client/web/public/dev/js'] 
    }) 
    .transform(coffeeify) 
    .transform('babelify', { presets: ['es2015'] }) 

    createBundle(bundler, file) 
    }) 
}) 

function createBundle (bundler, file) { 
    const src = path.join(__dirname, file.src) 
    const outFile = path.join(__dirname, file.outFile) 
    const outDir = path.join(__dirname, file.outDir) 
    const sourceMapDir = 'maps' 

    bundler.bundle() 
    .pipe(source(src)) 
    .pipe(buffer()) // Convert to gulp pipeline 
    .pipe(rename(outFile)) 
    // Sourc Map 
    .pipe(sourceMaps.init({ loadMaps : true })) 
    .pipe(sourceMaps.write(sourceMapDir)) // save 
    // Write result to output directory 
    .pipe(gulp.dest(outDir)) 
    .pipe(livereload()) // Reload browser if relevant 
} 

这是我目前的项目组织(客户端模块)

. 
├── app.js 
├── gulpfile.js 
└── client 
    └── web 
     ├── public 
     │   ├── dev 
     │   │   ├── js 
     │   │   │   ├── main.js 
     │   │   │   │   ├── utils 
     │   │   │   │   │  ├── random.js 
     │   │   │   │   ├── components 
     │   │   │   │   │  ├── feed 
     │   │   │   │   │  │  ├── index.js 

这是来自client/web/public/dev/js/main.js的主要模块,它需要馈送模块并且失败:

const Feed = require('./components/feed') 
Feed.doWhatever(...) 

这是进纸模块的代码段:

const Random = require('../../utils/random) 

class Feed { 
    // Rest of class 
} 

module.exports = Feed 

回答

0

总之,你在package.jsondevDependencies当你NODE_ENV设置为production没有得到加载。默认情况下,Heroku将其设置为生产。所以在我看来,你有三种选择,从最坏到最好。

  1. 将你的NODE_ENV env var设置为Heroku。 (stagingproduction以外的任何东西)然后你的devDependencies会加载,grunt会运行,但是你的Heroku版本中会包含所有这些库。而且您不应该在此模式下运行生产应用程序。

  2. 将必要的devDependencies移动到您的package.jsondependencies部分。和以前一样,这些库仍然会在您的制作应用程序中,但至少您的NODE_ENV将是准确的。

  3. 使用postinstall脚本在启动前加载devDependencies,运行构建并删除devDependencies。在此处看到我的评论:https://stackoverflow.com/a/42237745/673882