Express,如何始终提供静态目录?

Posted

技术标签:

【中文标题】Express,如何始终提供静态目录?【英文标题】:Express, how to always serve static directory? 【发布时间】:2020-07-20 06:06:02 【问题描述】:

所以我需要 Express 始终提供静态目录。这些是关于如何仅提供 index.html 的大量指南,例如 here。他们使用以下代码:

app.use(express.static(path.join(__dirname, 'build')));

app.get('/*', function (req, res) 
    res.sendFile(path.join(__dirname, 'build', 'index.html'));
);

但是对我来说问题是'/*' 路由只服务于 index.html,而不是它拉入的任何文件,例如 main.js。无论访问者在哪条路径上,我基本上都需要我的应用程序始终提供“build/”服务,因为路由是由前端使用 React Router 处理的。比如:

app.get('/*', function (req, res) 
    res.redirect('/');
);

不起作用,因为它删除了路径。登陆“/aa/bb/cc”的用户应该获得与登陆“/”的用户相同的内容(express.static)。我试过app.use('/*', express.static(...),但是这会导致浏览器中出现SyntaxError: expected expression, got '<',因为似乎每个请求都被路由到静态 index.html 文件?

【问题讨论】:

【参考方案1】:

不要将它放在 app.get 中,在主 app.js 文件中将它作为 app.use 根据 Express 文档:https://expressjs.com/en/starter/static-files.html

【讨论】:

【参考方案2】:

为了回答我自己的问题,我找到了这个答案:https://***.com/a/43373134/11441482

为了让所有文件都使用绝对路径(例如 src="/main.js"),我必须在前端 Webpack 配置中将 output.publicPath 设置为 '/'。该属性由 html-webpack-plugin 使用。有关详细信息,请参阅此问题:HtmlWebpackPlugin injects relative path files which breaks when loading non-root website paths

【讨论】:

以上是关于Express,如何始终提供静态目录?的主要内容,如果未能解决你的问题,请参考以下文章

使用express设置静态文件目录

利用 Express 托管静态文件

利用 Express 托管静态文件

使用 sendFile() 在 Express 中发送静态文件

如何从 asar 存档中提供静态文件

multer - req.file 始终未定义