首页 > 解决方案 > 如何在 NodeJS 模块中处理资产

问题描述

我有一个 NodeJS 模块,它应该通过 XSL 文件将 XML 转换为 HTML。问题是我需要将 XSL 与模块的其余部分捆绑在一起。

现在它在源文件夹中,我通过以下方式使用它:

function createHtml(xml) {
    const fs = require('fs');
    const xsltProcessor = require('xslt-processor');

    var xsl = fs.readFileSync('./src/xsl/html-export.xsl', 'utf-8');
    return xsltProcessor.xsltProcess(xsltProcessor.xmlParse(xml), xsltProcessor.xmlParse(xsl));
}

当然,我确保在package.jsonfiles的属性中有这个文件夹:

    "files": [
        "src"
    ],

此设置在模块内部有效,但在我发布模块并从第二个模块中要求它时无效。然后我还需要将 XSL 文件复制到第二个模块的路径中。

这对我来说真的不起作用。我想访问相对于 JavaScript 源文件的文件,而不是当前的 NodeJS 应用程序。

我尝试使用不同类型的路径(html-export.xsl./html-export.xsl./xsl/html-export.xsl),但即使在模块内部也没有其他工作。所以我不能发布它来在别处试用。

好消息是:XSL 文件在发布期间实际上包含在模块中;当我安装它时,node_modules/文件夹中的模块包含 XSL。所以“只是”上面的代码不起作用,因为路径是相对于第二个模块(即带有 的模块)解析的require,而不是相对于原始模块(即node_modules/中的那个)。

如何处理 NodeJS 中的资产,以便将它们与它们所属的模块捆绑在一起?

这个问题似乎是相关的,但答案正是我所做的,并且由于某种原因它对我不起作用。

标签: javascriptnode.jsnpm

解决方案


看来您只想.xsl在包内部使用该文件,这是我最初误解的内容..

为了做到这一点,您可以使用path包来解析.xsl文件的路径。

像这样:

function createHtml(xml) {
    const fs = require('fs');
    const path = require('path');
    const xsltProcessor = require('xslt-processor');

    var xsl = fs.readFileSync(path.resolve(__dirname, './src/xsl/html-export.xsl'), 'utf-8');
    return xsltProcessor.xsltProcess(xsltProcessor.xmlParse(xml), xsltProcessor.xmlParse(xsl));
}

为了演示如何执行此操作,我构建了一个示例 NPM 包供您查看。虽然这个包不使用.xsl文件,但它使用.txt文件——逻辑保持不变。

包中的自述文件包含有关如何使用它的说明。

你可以在这里找到 NPM 上的包

你可以在这里找到包的源代码


推荐阅读