🗂

Node.jsで`ERR_PACKAGE_PATH_NOT_EXPORTED`の回避方法

2021/12/16に公開

Node.jsアドベントカレンダー16日目の記事です。
https://qiita.com/advent-calendar/2021/nodejs

NPMライブラリのpackage.jsonexportsプロパティが書いてあると、
そこに列挙されたモジュール以外をrequire/importしようとしたときに
ERR_PACKAGE_PATH_NOT_EXPORTEDエラーが発生します。

たとえば@kintone/rest-api-clientのKintoneRequestConfigBuilderなど使わせてもらおうとして、こうしちゃうとエラー。

index.js
const { KintoneRequestConfigBuilder } = require('@kintone/rest-api-client/lib/KintoneRequestConfigBuilder')
❯ node index.js
node:internal/modules/cjs/loader:488
      throw e;
      ^

Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/KintoneRequestConfigBuilder' is not defined by "exports" in /path/to/project/node_modules/@kintone/rest-api-client/package.json
    at new NodeError (node:internal/errors:371:5)
    at throwExportsNotFound (node:internal/modules/esm/resolve:440:9)
    at packageExportsResolve (node:internal/modules/esm/resolve:692:3)
    at resolveExports (node:internal/modules/cjs/loader:482:36)
    at Function.Module._findPath (node:internal/modules/cjs/loader:522:31)
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/path/to/project/index.js:1:41) {
  code: 'ERR_PACKAGE_PATH_NOT_EXPORTED'
}

ところが、node_modulesへの相対パスから書くとエラーは出ず、回避できちゃいますw
NPMライブラリではなく、単独のJSファイルと見なさて、package.jsonは無視されるんでしょうね。

index.js
const { KintoneRequestConfigBuilder } = require('./node_modules/@kintone/rest-api-client/lib/KintoneRequestConfigBuilder')

ライブラリ作者としてはやってほしくないと思いますし、
これで無理やり使ってて breaking change があっても文句は言えないわけですが、
それを承知でhackしたい場合は、自己責任でどうぞ!

Discussion