提供 node_modules 中文件的正确方法 [重复]
Posted
技术标签:
【中文标题】提供 node_modules 中文件的正确方法 [重复]【英文标题】:Correct way to serve file that's in node_modules [duplicate] 【发布时间】:2019-05-09 19:47:51 【问题描述】:这是给图书馆的,我不一定会打这个电话:
app.use('/node_modules', express.static('node_modules'));
我必须以不同的方式做到这一点。因为我无法控制服务器如何提供静态资产。假设我有这个结构:
project/
node_modules/
xxx/
asset.js
index.html
app.js
在 app.js 中我有:
const express = require('express');
const app = express();
app.use('/docs', (req,res)
res.render(require.resolve('./node_modules/xxx/index.html'));
);
app.listen(3000);
问题是因为服务器是从当前根目录运行的,所以 index.html 文件没有正确的路径来获取 assets.js 文件。
例如,在 index.html 中,如果 base 设置如下:
<base href="/">
那行不通。我可以尝试使用:
<base href="node_modules/xxx/">
另一个解决方案是将所有内容捆绑在一起,以便 index.html 文件不需要对静态资产提出任何请求,但我正在寻找一个很好的解决方案,以确保路径解析在某种程度上可以通用。例如,如果 express 服务器不是在项目根目录中启动,而是在另一个子目录中启动。
【问题讨论】:
您在问题中指的是“获取 assets.js”,但您没有向我们展示您如何尝试访问它。请向我们展示试图加载 assets.js 的 HTML。您可能不应该对核心资产使用相对路径。我真的不知道这是否是你需要的:How to include scripts located inside the node_modules folder?. 请记住,Express 默认不提供任何文件。因此,如果您希望 Express 服务器在浏览器请求时为 assets.js 提供服务,您需要在 Express 服务器中设置一个发送该文件的路由。而且,您的 HTML 可能应该指定绝对路径,而不是相对路径。 这个问题在这里交叉发布:softwareengineering.stackexchange.com/questions/382682/… @jfriend00 不是骗子,我想这还不够清楚,我更新了 OP,我无法进行通常可以完成的express.static
调用。
我在重复答案中添加了更多信息,以防它现在涵盖您的情况。请查看更新。
【参考方案1】:
假设您的文件位于 node_modules 中,路径类似于 './node_modules/bootstrap/dist/'
你可以创建一个像'/file'这样的静态路由
你可以使用:
app.use('/file',express.static(__dirname+'/node_modules/bootstrap/dist/'));
包括这样的脚本:
<script src="/file/bootstrap.min.js"></script>
【讨论】:
以上是关于提供 node_modules 中文件的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
即使不需要模块,Webpack 也会为 node_modules 中的文件提供“模块没有导出的成员...”错误