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-docx0.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前提であることが書かれている。落とし穴は、少なくとも今回の環境では、enginesにbunしか無いパッケージでも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経由の実行)で解決する。