Nodejs + Heroku:在"postinstall"中使用"cp"命令,但正在运行的服务器不存在这些文件



我使用materializecssexpress。为了使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中交付materializecssdist文件:
;[
['/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))
})
})

相关内容

最新更新