🗂
Node.jsで`ERR_PACKAGE_PATH_NOT_EXPORTED`の回避方法
Node.jsアドベントカレンダー16日目の記事です。
NPMライブラリのpackage.json
にexportsプロパティが書いてあると、
そこに列挙されたモジュール以外を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