提供 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 中的文件提供“模块没有导出的成员...”错误

在我的项目中删除 node_modules 目录

如何测试 dockerignore 文件?

使用 TypeScript 声明 (*.d.ts) 和接口的正确方法?

vue文件夹中的node_modules显示灰色

如何使用捆绑包中的 node_modules 依赖项正确构建用于生产的 NestJS 应用程序?