如何捆绑和分发包含本机模块的npm软件包

时间:2019-08-01 18:46:42

标签: javascript node.js webpack rollup node-native-addon

我已经将本机节点模块编译为noble_mac.node,并在其周围编写了一些TypeScript。我将所有内容与Rollup捆绑在一起。我生成的捆绑包如下所示:

root
 ∟ package.json
 ∟ lib
   ∟ index.js
   ∟ noble_mac.node

index.js内现在有一行

var NobleMacModule = require("./noble_mac.node");

当我编写一个简单的文件test.js时,就像这样:

const MyPackage = require("my-package");

MyPackage.doMyStuff()

一切正常。现在,我尝试使用Webpack在一个项目中消费我的包。因此,在我的webpack.config.js中,我有这个加载器:

{
  test: /\.node$/,
  loader: require.resolve("native-ext-loader")
}

但是我得到了错误

  

未捕获的错误:无法打开/noble_mac.node:错误:dlopen(/noble_mac.node,1):找不到图像

现在事实证明,解析本机节点插件需要绝对路径。我可以通过更改Webpack配置来解决此问题:

{
  test: /\.node$/,
  loader: require.resolve("native-ext-loader"),
  options: {
    rewritePath:
      "/Users/yomom/Projects/DecentEspresso/sblendid/packages/sblendid/lib/"
  }
}

但这意味着我的软件包的每个用户都需要在他们的node_modules文件夹中怪异地设置我的模块的绝对路径。另外,当他们使用多个本机模块时,他们会怎么做。

我想知道如何创建一个包含本机加载项的npm软件包,然后将其分发给其他人而无需他们担心其webpack配置。

我可以不打包我的软件包,以便他们甚至不必知道内部有本机插件并且不需要自己的加载器吗?

正如我所说,我目前正在使用汇总,这是我的rollup.config.js

import typescript from "typescript";
import commonjs from "rollup-plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import typescriptPlugin from "rollup-plugin-typescript2";
import autoExternal from "rollup-plugin-auto-external";
import copy from "rollup-plugin-copy";
import { terser } from "rollup-plugin-terser";
import pkg from "./package.json";

export default {
  input: "src/index.ts",
  output: [
    {
      file: pkg.main,
      format: "cjs"
    },
    {
      file: pkg.module,
      format: "es"
    }
  ],
  plugins: [
    autoExternal(),
    resolve({ preferBuiltins: true }),
    commonjs(),
    typescriptPlugin({ typescript, objectHashIgnoreUnknownHack: true }),
    terser(),
    copy({
      targets: [{ src: "src/native/**/*.node", dest: "lib" }],
      copyOnce: true
    })
  ]
};

如果解决了问题,我不一定需要使用Rollup,Weback或Parcel。

0 个答案:

没有答案