Open3

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.cjsdist/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は使用できないことを確認。

https://github.com/import-js/eslint-import-resolver-typescript/blob/6683854b2ce88572747957f71113447395ee0816/package.json#L14

対応

eslint-import-resolver-typescriptのv2.7.1であればnode v14.16.0で使用できるので、バージョンを3.0.0 →2.7.1に下げてインストール。

node:fsのエラーも解消され、ESLintが問題なく動くことを確認。