我已经将本机节点模块编译为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。