Как собрать и распространить пакет 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, если бы это решило проблему.

0 ответов

Другие вопросы по тегам