[Node.js]Gulp3で「ReferenceError: primordials is not defined」が出た時の暫定対応策

2023.01.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • あるGulp3を利用しているプロジェクトでNode10からNode14に上げてみたところ、開発サーバー起動の際にタイトルのようなエラーがでました。
  • そこで今回はgulp3からgulp4に上げる前の暫定対応策を記録いたします。

環境

  • mac OS Ventura 13.1
  • Node 14
  • Yarn 1.22

修正前の状態

  • 修正前のpackage.jsonのgulpのバージョンは以下です。
"gulp": "^3.9.1",
  • その状態でNode10からNode14に上げてyarnコマンドを実行すると、パッケージインストール自体は終わりますが、以下のようなwarningが出ます。
warning gulp > vinyl-fs > glob-watcher > gaze > globule > glob > graceful-fs@1.2.3: please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js
warning gulp > vinyl-fs > graceful-fs > natives@1.1.6: This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x.
  • その状態でyarn devのような開発サーバーを起動すると、以下のようなエラーが出ます。
ReferenceError: primordials is not defined
    at Object.<anonymous> (/xxxx/node_modules/gulp/node_modules/graceful-fs/fs.js:1:37)
  • このエラーは上記のwarning内容から見て、gulp3で利用しているgraceful-fsはNodeに依存していて、v4以前のものを利用しているからだと考えられます。

修正後の内容

  • 調べてみたところ、対応策は以下の2点がありそうです。
    • gulpをv4へ更新
    • graceful-fsをv4へ更新
  • gulpのv4への更新はv3と比べてgulpfileの書き方等が変わるらしいのでコストがかかりそうでした。
  • そのため暫定策としてgraceful-fsをv4へ更新する策をとります。
    • ※将来的にはgulpをv4に上げる方が理想です。
  • 方法としてYarnのresolutions機能を利用します。
    • この機能を利用することで依存しているものには触れずに指定ライブラリのみのバージョンの固定が可能です。
  • そこでpackage.jsonに以下のresolutionsフィールドを追記します。
"devDependencies": {
    "xxxx": "^x.x.x",
    "gulp": "^3.9.1",
    "xxxx": "^x.x.x",
},
"resolutions": {
    "graceful-fs": "^4.2.10"
},
  • 追記後、再度yarnコマンドを実行したらgrace-ful関係のwarningが消えていることが確認できました。
  • その後、yarn devを実行したら開発サーバーが起動してlocalhost:xxxxにアクセスできることも確認できました。
  • 以上です。

まとめ

  • 今回のように影響が大きいライブラリのバージョンを上げる前に指定ライブラリの問題を解決したい場合にresolutionsは便利です。
  • この他にもパッケージマネージャーは開発していく上で便利な機能が豊富にあるので最適に利用していく所存です。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。