#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))
})
})