【问题标题】:Referencing a local file within npm package在 npm 包中引用本地文件
【发布时间】:2023-03-05 11:10:01
【问题描述】:

我们如何在 npm 包中引用本地文件?由于 npm 包是由另一个消费者安装的,这些引用相对于消费者的根文件夹是否会过时?

例如,我为 Angular 创建了一个 npm 包。该软件包还从第三方重新发送了少量 html 和 css 文件(它们没有 angular 软件包)。我确保在发布包期间将文件复制到...dist\thirdparty。我想使用相对路径或其他机制在我的 npm 包中引用其中一些文件。

例如

@Component({
selector: 'ng2-my-library',
template: '<div></div>'
})
export class MyLibraryComponent {
.....
var newWindowUrl = "./thirdparty/some.html"; **// Need to relatively locate some.html here**
window.open(newWindowUrl);
.....
}

在我将my-package 安装到示例角度应用程序后,上面的代码导致"localhost:3000/thirdparty/some.html",这是不准确的。

我该怎么做?

安装我的包后,消费者会有这个结构
consumerApp node_modules(Folder) ng2-my-library(Folder) ng2-pdfjs-viewer.umd.js // This is where I need to access some.html thirdparty(Folder) some.html

我也考虑过指导包的消费者做这样的事情,但是这个指令非常依赖于其他构建工具来复制或重定向到 html,这不是我想要的。

   var TransferWebpackPlugin = require('transfer-webpack-plugin');
         ...
         plugins: [
           new TransferWebpackPlugin([
             { from: 'node_modules/my-package/assets', to: path.join(__dirname, 'my/public') }
           ])
         ] 

我也尝试过使用这个包。显然它没有为我提供正确的 html 结果。 https://www.npmjs.com/package/static-reference

【问题讨论】:

  • 您在寻找什么预期行为?
  • 正如我所说,简单地说,在创作 Angular 库时,在“库内”引用静态 html 的最佳机制是什么。当消费者安装该库时,静态 html 将安装在 ./node_modules/thirdparty/some.html 下。
  • 组件需要知道它的根路径,如果组件是由2个不同的模块在2个不同的路径上挂载的,那么它将如何工作?您可以直接使用window.location.href,但我怀疑这会有所帮助。
  • 你能显示你安装在node_modules中的包文件结构吗?我对这些第三方的东西在哪里安装以及你的东西在哪里安装有点困惑
  • 您可以尝试在您的网络服务器中公开公开thirdparty 文件夹并在您的组件中像window.open('/thirdparty/some.html') 一样引用它?

标签: angular typescript npm


【解决方案1】:

使用__dirname 而不是. 来获取保存文件的本地目录。将代码更改为:

var newWindowUrl = __dirname + "/thirdparty/some.html";
window.open(newWindowUrl);

有关 __dirname here 的更多信息。

不要忘记在项目中包含节点类型:

npm install --save-dev @types/node

【讨论】:

  • 这使得新窗口中的 url 解析为 (On consumer of package) : http://thirdparty/some.html 这是不准确的。请在有关 web-pack 的问题中查看我的附加信息
【解决方案2】:

你可以试试这个

1 - 公开资产

使静态资产可从您的网络服务器(即thirdparty 文件夹)访问

例如,如果您使用 express,则可以使用 serve-static

var path = require('path');
var assetsFolder = path.join(__dirname, './node_modules/ng2-my-library/thirdparty');

app.use('/thirdparty', express.static(assetsFolder));
//...
app.listen ...

2 - 引用文件

在你的包的组件中,像这样引用文件

window.open('/thirdparty/some.html')

例如,如果您使用的是 express,则可以

编辑

您也可以使用 npm post install 任务复制文件,但您仍然需要将它们复制到浏览器可以静态提供它们的位置。例如,您不能确定所有客户端都会有一个assets 文件夹。所以我认为总会有某种网络服务器配置需要以某种方式

【讨论】:

  • 很遗憾我不使用快递
  • 无论什么webserver,原理都是一样的。你用的是哪一个?
  • 我正在构建一个库,我不希望向客户端用户包含针对不同服务器技术或 webpack 插件配置的复制或重定向到 html 的说明。我的库应该与网络服务器无关,因为我指的是我的组件中的 npm 包本身中的一个 html 文件。
  • @int-i 恕我直言,因为您想提供静态文件,它确实取决于网络服务器,这意味着您需要以某种方式对其进行配置。即使您有一个 npm post install 任务将文件复制到某处,网络服务器也需要知道它以正确配置规则(即使资产被复制到根目录中)。仅当您确定所有用户都将在同一位置拥有该资产文件夹时,这可能适用于资产文件夹
  • 这是我在研究中的感受。我仍然相信会有一种方法可以使用构建步骤(例如 web 包)嵌入 html,从而在需要时将其用作。如果你查看这个 npm 包 - npmjs.com/package/static-reference,它对于 css 文件是成功的,并且确实解决了类似的问题(虽然不适用于 html)
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2018-07-14
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多