Как собрать и распространить пакет npm, который включает в себя собственный модуль
Я скомпилировал модуль нативного узла как 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")
}
Но я получаю ошибку
Uncaught Ошибка: невозможно открыть /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
пакет, который содержит собственное дополнение и распространяет его среди других, не беспокоясь о конфигурации своего веб-пакета.
Могу ли я не связать свой пакет, чтобы им даже не приходилось знать, что внутри есть нативное дополнение, и для этого не нужен собственный загрузчик?
Как я уже сказал, я в настоящее время использую Rollup, и это мой 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, если бы это решило проблему.