Resolve error: Cannot find module 'node:fs'のエラー解消手順メモ
背景
既存プロダクトのディレクトリ構成で、contextA/
ディレクトリのモジュールをcontextB
ディレクトリにimportしている記述が複数あったので、ESLintで防ごうとしていた。
あと、エイリアスの設定がされてなかったのでついでにこちらも対応する。
そのため、コード上で別コンテキスト配下のモジュールをインポートするとアラートをが出るようにeslint-plugin-import
(v2.26.0)、エイリアス設定のためのeslint-import-resolver-typescript
(v3.0.0)の2つのライブラリをインストールした。
課題
ライブラリをインストール後、.eslintrc.js
で設定しESLIntを実行してみると、以下のエラーが発生。
1:1 warning Resolve error: Cannot find module 'node:fs'
Require stack:
- /Users/.../node_modules/eslint-import-resolver-typescript/lib/index.cjs
- /Users/.../node_modules/eslint-module-utils/resolve.js
- /Users/.../node_modules/eslint-plugin-import/lib/rules/no-unresolved.js
- /Users/.../node_modules/eslint-plugin-import/lib/index.js
- /Users/.../node_modules/@eslint/eslintrc/dist/eslintrc.cjs
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
at Function.Module._load (internal/modules/cjs/loader.js:725:27)
at Module.require (internal/modules/cjs/loader.js:952:19)
~
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19) import/namespace
調査
上記のエラーからnode_modules配下のeslint-import-resolver-typescript/lib/index.cjs
とdist/eslintrc.cjs
あたりをファイルを確認してみる。
eslint-import-resolver-typescript/lib/index.cjs
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var fs = require('node:fs');
var path = require('node:path');
var node_url = require('node:url');
var debug = require('debug');
var getTsconfig = require('get-tsconfig');
var isGlob = require('is-glob');
var resolve$1 = require('resolve');
var synckit = require('synckit');
~
dist/eslintrc.cjs
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var debugOrig = require('debug');
var fs = require('fs');
var importFresh = require('import-fresh');
var Module = require('module');
var path = require('path');
var stripComments = require('strip-json-comments');
var assert = require('assert');
var ignore = require('ignore');
var util = require('util');
var minimatch = require('minimatch');
var Ajv = require('ajv');
var globals = require('globals');
var os = require('os');
~
エラー文にあったnode:fs
に着目すると、index.cjsではnode:fsをrequireしているが、eslintrc.cjsではfsをrequireしている。
このことから、使用しているnodeのバージョンがライブラリと合ってないのではないか、という仮説が立つ。
検証
検証のため、使っているnodeのバージョンを確認し、REPLを使用してnode:fsをrequireしてみる。
すると、Cannot find module 'node:fs'
のエラーを再現。
% node -v [3/10/22 | 1:34:45]
v14.16.0
% node [3/10/22 | 1:34:55]
Welcome to Node.js v14.16.0.
Type ".help" for more information.
> const fs = require('node:fs')
Uncaught Error: Cannot find module 'node:fs'
Require stack:
- <repl>
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
at Function.Module._load (internal/modules/cjs/loader.js:725:27)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '<repl>' ]
}
>
eslint-import-resolver-typescriptのv3.0.0での変更内容を確認するため、GitiHubのtagsからv3.0.0を選択。
package.jsonの中身を確認すると、node14系の場合、v14.18.0のみしかv3.0.0は使用できないことを確認。
対応
eslint-import-resolver-typescriptのv2.7.1であればnode v14.16.0で使用できるので、バージョンを3.0.0 →2.7.1に下げてインストール。
node:fsのエラーも解消され、ESLintが問題なく動くことを確認。