試してから書くAI・開発ツールの実機検証

bun-docxがNode.jsで動かない原因と解決

この記事の結論

npmで入れたbun-docx(docx-cli)をNode.jsで実行すると「TypeError: __require is not a function」で失敗する。原因はBun専用バンドル。解決手順を実機ログ付きで解説します。

検証記録

検証済

検証日
2026-07-11
対象バージョン
bun-docx 0.20.3
環境
Docker (WSL2/Ubuntu)。エラー再現: node:24-slim(Node.js v24.18.0)。解決確認: oven/bun:1.3.14-slim(Bun 1.3.14)

npm installの成功、Node.js直接実行での__requireエラー、Bun 1.3.14での正常動作、シェバンとengines宣言の内容はすべて実機で確認。公式のスタンドアロンバイナリ(install.sh経由)は未検証。

Word文書操作CLIのdocx-cli(npmパッケージ名 bun-docx)をnpmでインストールすると、インストール自体は成功するのに、実行するとTypeError: __require is not a functionで落ちる。結論: このパッケージはBunランタイム専用で、Node.jsでは動かない。Bun(1.3.0以上)を導入するか、Bun入りのDockerイメージで実行すれば解決する。

症状

npm install bun-docxは警告なく成功する。しかし配布物をNode.jsで実行すると、モジュール読み込みの時点で次のエラーになる(どのサブコマンドを指定しても同じ)。

TypeError: __require is not a function
    at file:///tmp/docxtest/node_modules/bun-docx/dist/index.js:58506:14
    at file:///tmp/docxtest/node_modules/bun-docx/dist/index.js:33:45
    at file:///tmp/docxtest/node_modules/bun-docx/dist/index.js:58631:17
    ...

Node.js v24.18.0

なお、インストールされる実行ファイルのシェバンは#!/usr/bin/env bunなので、Bunが入っていない環境でnpx docxやパス経由で普通に叩いた場合は、上記の__requireエラーではなく「bunが見つからない」という趣旨のエラーになるはずだ(今回はnodeで直接実行したため__requireエラー側を踏んだ)。入り口によってエラーの見た目は変わるが、原因は同じ。

発生環境

  • Docker(WSL2/Ubuntu上)、node:24-slimイメージ(Node.js v24.18.0)
  • bun-docx 0.20.3(記事執筆時点の最新)
  • npm install --prefix <dir> bun-docx でインストール(成功)

原因

bun-docxの配布物(dist/index.js)は、BunのバンドラーでBunランタイム向けにビルドされた単一ファイルだ。ファイル先頭に// @bunマーカーがあり、CommonJSのrequire相当を処理する内部ヘルパ__requireがBunランタイムの機構を前提にしている。Node.jsにはその前提がないため、読み込んだ瞬間に__require is not a functionで落ちる。

パッケージ側も隠しているわけではなく、package.jsonには明確に宣言がある。

"engines": {
  "bun": ">=1.3.0"
}

公式READMEにも「npm — the simplest path (requires Bun >= 1.3)」とBun前提であることが書かれている。落とし穴は、少なくとも今回の環境では、enginesbunしか無いパッケージでもnpmのインストールが警告なく成功してしまうこと。「npmで入った=Nodeで動く」という思い込みが崩れるポイントだ。

解決手順

1. Bunを導入して実行する(公式の想定)

Bun 1.3.0以上を導入済みなら、公式README記載のとおりでよい。

bun add -g bun-docx
# またはインストールせずに
bunx bun-docx read doc.docx

2. Dockerで実行する(Node環境を汚したくない場合・今回検証した方法)

手元にBunを入れたくない場合は、Bun公式イメージ内で実行できる。今回はoven/bun:1.3.14-slim(Bun 1.3.14)で、npmインストール済みの同じパッケージが正常に動作することを確認した。

docker run --rm -v "$PWD:/work" -w /work oven/bun:1.3.14-slim \
  sh -c "bun add [email protected] && bun node_modules/.bin/docx read your.docx"

実際にこの構成(依存はlockfileで固定)で、docx-cliのNDA記入・変更履歴・コメント追加まで一通り動かせた。詳細はdocx-cliでNDAをAIに編集させてみたを参照。

3. スタンドアロンバイナリを使う(Bun不要・ただし未検証)

公式はBun不要のプリビルトバイナリも各リリースで配布しており、インストーラがSHA-256を検証する方式になっている。今回は試していないので、動作は公式ドキュメントの記載として紹介するに留める。

効かなかった方法

  • nodeでdist/index.jsを直接実行する: 上記のとおり__require is not a functionで落ちる。エントリポイントを変えても、バンドル自体がBun前提なので回避できない
  • npmで入れ直す: インストールは元から成功しているので、キャッシュ削除や再インストールでは何も変わらない

再発防止

「npmで入るのにNodeで動かない」パッケージはbun-docxに限らず今後も出てくる(Bunエコシステム発のツールが増えているため)。実行前に次を確認するとよい。

# シェバンを見る(bunと書いてあればBun前提)
head -1 node_modules/.bin/<コマンド>

# engines宣言を見る
grep -A3 '"engines"' node_modules/<パッケージ>/package.json

READMEのインストール手順がbun addで書かれているパッケージは、npmで入っても実行はBunという可能性をまず疑うのが早い。

まとめ

bun-docx__require is not a functionは、パッケージの不具合ではなく「Bun専用バンドルをNode.jsで実行した」ことによる仕様どおりの失敗だ。engines宣言はnpmインストールを止めてくれないので、エラーメッセージからBun依存に気づけるかが分かれ目になる。Bunの導入(またはDocker経由の実行)で解決する。

参考情報源