我使用materializecss
和express
。为了使materializecss的css/js文件可用,我在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
,它是可用的并且可以工作。它在本地也起作用。但是尝试在Heroku运行的应用程序上加载js/css文件时,会出现404错误。
可能会有一些不同:这些文件不在git中,它们被.gitignore
文件排除。
我错过了为什么它在本地工作,而不是在Heroku吗?
作为一种替代解决方案,我删除了postinstall
并通过:
node_modules
中交付materializecss
dist文件:;[
['/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))
})
})