Problems with using a bundler (esbuild, webpack, etc)
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- javascript, nodejs, webpack
- 領域
- build-system
調査の方向性
まず webpack または esbuild で bundling の失敗を再現し、src/pulsar-binding.js と、@mapbox/node-pre-gyp による ../package.json の検索に注目します。node_modules からの pulsar.node と追加の HTML/CS ファイルがどのように扱われるかを追跡します。外部インストールの workaround なしで pulsar-client をパッケージ化して読み込める、文書化またはテスト済みの bundler パスがあれば完了です。
索引モデルが issue の本文から書いたものです。
説明
We haven't been able to get pulsar-client to work with a bundler like webpack or esbuild. The pulsar.node file is not picked up by the bundler and additional files in the library (.html, .cs) end up breaking the build. Even if the bundler is configured to ignore these html/cs files, it fails to export pulsar.node file from node_modules into the build directory.
An alternative path is to get webpack/esbuild to ignore pulsar-client completely and to manually copy over pulsar.node from node_modules. This ends up causing problems because pulsar-binding.js explicitly looks for the package.json file and for mapbox/node-pre-gyp:
const binary = require('@mapbox/node-pre-gyp');
const bindingPath = binary.find(path.resolve(path.join(__dirname, '../package.json')));
So it seems like pulsar-client would need to be architected differently to work with webpack/esbuild.
We did finally find a workaround to the problem. Sharing it here for other people who run into this too: we use esbuild to build and package up our node.js app but we add an additional step that creates a simple package.json file with pulsar-client in the parent directory and then run npm install. This way we can continue using esbuild to package up our node app but externally inject pulsar-client as a dependency.
Here's an example build.js for esbuild:
const esbuild = require("esbuild");
const { copy } = require("esbuild-plugin-copy");
const fs = require("fs-extra");
const path = require("path");
const { execSync } = require("child_process");
// Ensure that native modules, like node-canvas, are bundled correctly
// This however does not work for pulsar-client, see the then() block below
const nativeNodeModulesPlugin = {
name: "native-node-modules",
setup(build) {
build.onResolve({ filter: /\.node$/, namespace: "file" }, (args) => ({
path: require.resolve(args.path, { paths: [args.resolveDir] }),
namespace: "node-file",
}));
build.onLoad({ filter: /.*/, namespace: "node-file" }, (args) => ({
contents: `
import path from ${JSON.stringify(args.path)}
try { module.exports = require(path) }
catch {}
`,
}));
build.onResolve({ filter: /\.node$/, namespace: "node-file" }, (args) => ({
path: args.path,
namespace: "file",
}));
const opts = build.initialOptions;
opts.loader = opts.loader || {};
opts.loader[".node"] = "file";
},
};
esbuild
.build({
entryPoints: ["src/index.ts"],
plugins: [nativeNodeModulesPlugin],
bundle: true,
platform: "node",
target: "node18",
outdir: "build/src",
tsconfig: "tsconfig.json",
sourcemap: true,
// Ignore pulsar-client and related dependencies. These will be installed in the build directory later.
external: ["*.html", "mock-aws-s3", "aws-sdk", "nock", "pulsar-client"],
})
.then(() => {
// pulsar-client does not work when bundled so we install it in the build
// directory as a dependency.
// Get the version of pulsar-client that we are using
const pulsarVersion = require("pulsar-client/package.json").version;
// Create a package.json file in the build directory with pulsar-client as a dependency
const packageJson = {
name: "external-deps",
version: "1.0.0",
dependencies: {
"pulsar-client": `^${pulsarVersion}`,
},
};
// Write the package.json file to the build directory and install the dependencies
fs.writeFileSync(path.join("build", "package.json"), JSON.stringify(packageJson, null, 2));
execSync("cd build && npm install --no-package-lock");
})
.catch(() => process.exit(1));
We then launch our app: cd build && node ./src/index.js
- 主要言語
- C++
- スター
- 164
- フォーク
- 99
- 平均マージ
- 5日 18時間
- マージ済み PR(30日)
- 2
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/pulsar-client-node のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
apache/pulsar-client-node#477 ·
-
公司网络无法访问海外站点,如何解决?オープン
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
apache/pulsar-client-node#455 · コメント 3 件 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
apache/pulsar-client-node#432 · リアクション 2 件 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 38/100
apache/pulsar-client-node#431 · コメント 3 件 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
apache/pulsar-client-node#429 · コメント 1 件 ·
apache/pulsar-client-node の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
lldb
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
llvm/llvm-project#229592 · コメント 11 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 3 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 94/100
llvm/offload-test-suite#1560 ·
メンテナーはふだん 1 日以内に返信
-
cudf-polars feature request
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信