Nodejs Heroku: Использование команды » cp » в «postinstall», но файлы не существуют для запущенного сервера

#node.js #heroku #materialize

Вопрос:

Я использую materializecss и. express Чтобы сделать доступными css/js файлы materializecss, я копирую их во postinstall время .

Проблема в том, что в журналах сборки Heroku я вижу postinstall запуски:

 > ... postinstall
> cp -r ./node_modules/materialize-css/dist/ ./www/
 

Каталог становится общедоступным с помощью express:

 app.use(express.static(path.join(process.cwd(), 'www')))
 

В www каталоге также есть index.html каталог, который доступен и работает.
Также локально это работает.
Но попытка загрузить файлы js/css в запущенное приложение Heroku заканчивается 404 ошибками.

Возможно, это имеет какое-то значение: файлы не находятся в git, они исключаются через .gitignore файл.

Я что-то пропустил, почему это работает локально, но не на Heroku?

Ответ №1:

В качестве альтернативного решения я удалил postinstall и доставил файлы materializecss dist непосредственно из node_modules via:

 ;[
  ['/css/materialize.css', 'materialize-css/dist/css/materialize.css'],
  ['/js/materialize.js', 'materialize-css/dist/js/materialize.js'],
].forEach(([urlPath, filePath]) => {
  app.get(urlPath, (req, res) => {
    res.sendFile(path.join(process.cwd(), 'node_modules', filePath))
  })
})
 

Кроме того, этот подход позволяет действительно легко обслуживать разные файлы в разных средах (например .min , файлы в производственных средах).:

 const staticFiles = process.env.NODE_ENV === 'production'
  ? [
      ['/css/materialize.css', 'materialize-css/dist/css/materialize.min.css'],
      ['/js/materialize.js', 'materialize-css/dist/js/materialize.min.js']
    ]
  : [
      ['/css/materialize.css', 'materialize-css/dist/css/materialize.css'],
      ['/js/materialize.js', 'materialize-css/dist/js/materialize.js']
    ]
staticFiles.forEach(([urlPath, filePath]) => {
  app.get(urlPath, (req, res) => {
    res.sendFile(path.join(process.cwd(), 'node_modules', filePath))
  })
})