[Node.js]Gulp3で「ReferenceError: primordials is not defined」が出た時の暫定対応策
- 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 > [email protected]: please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js warning gulp > vinyl-fs > graceful-fs > [email protected]: This module relies on Node.js's internals and will break at some point. Do not use it, and update to [email protected].
- その状態で
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サイトをご覧ください。