Node.js v22でimport assertionsが廃止された件
Node.js v22でimport assertionsが廃止された件について、日本語の記事が見当たらなかったのでまとめてみました。
TL;DR
- 今までJSONをimportする際には、import assertionsが使われていた
- Node.js v22でimport assertionsが廃止された
- 既存のコードはimport attributesに移行する必要がある
assert
をwith
に変更するだけで対応できる
はじめに
手元の環境をNode.js v21からv22にアップデートしたところ、このブログのプレビュー用のローカルサーバーが動作しなくなりました。そのときに表示されていたエラーメッセージは次のとおりです。
このエラーメッセージを読むと、import assertions関連でエラーが出ていることが分かります。Windows Sandbox内で詳しく検証したところ、Node.js 21では問題なく動作する一方で、Node.js 22ではエラーが発生することが確認できました。
Node.js v22でimport assertionが廃止された
さらに詳しく調べていたところ、DenoのこちらのIssueにたどり着きました。
Node.js is planning to remove support for
assert
in v22 (which will be released in April) and Chrome in v126 (which will be released in May).—— Warn code that uses import assertions · Issue #17944 · denoland/deno
どうやら、Node.js v22ではimport assertionsの廃止が計画されているとのことです。次に、Node.jsのドキュメントを確認したところ、次のような記述がありました。
Import attributes
Version Changes v21.0.0, v20.10.0, v18.20.0 Switch from Import Assertions to Import Attributes. v17.1.0, v16.14.0 Added in: v17.1.0, v16.14.0 This feature was previously named “Import assertions”, and using the
assert
keyword instead ofwith
. Any uses in code of the priorassert
keyword should be updated to usewith
instead.—— Modules: ECMAScript modules | Node.js v22.0.0 Documentation
つまり、import assertionsは廃止され、import attributesに移行する必要があるということです。また、assert
をwith
に変更するだけで対応できるとのことです。
Node.jsのchangelogにも、import assertionが廃止されたことが記載されていました。公式ブログのリリースノートには記載されていなかったので、完全に見逃していました。
Other Notable Changes
- [
25c79f3331
] - esm: drop support for import assertions (Nicolò Ribaudo) #52104—— node/doc/changelogs/CHANGELOG_V22.md at main · nodejs/node
import attributesに移行する方法
import assertionsからimport attributesに移行する方法は、簡単です。assert
をwith
に変更するだけで対応できます。なお、import attributesはNodejs v18.20.0から導入されているため、それ以前のバージョンでは動作しません。また、TypeScriptでのimport attributesのサポートは、TypeScript v5.3から導入されているため、それ以前のバージョンでは動作しないことに注意してください。
Cloudflare Pagesでの対応
Cloudflare PagesのデフォルトのNode.jsのバージョンは、記事執筆時点ではv18.17.1になっています。そのため、import attributesが使われているコードをCloudflare Pagesにデプロイしようとすると、Unexpected identifier 'with'
というエラーが発生します。このエラーを防ぐには、Cloudflare Pagesで利用するNode.jsのバージョンを上げる必要があります。
Cloudflare PagesのNode.jsのバージョンを変更するには、Cloudflare Pagesプロジェクトの設定画面の[環境変数]タブで、NODE_VERSION
という環境変数を追加し、使用したいNode.jsのバージョンを指定します。たとえば、Node.js v22を使用する場合は、NODE_VERSION
に22
を設定します。必要に応じて、22.0.0
のように詳細なバージョンを指定することもできます。
まとめ
Node.js v22でimport assertionsが廃止されたため、import attributesに移行する必要があります。既存のコードはassert
をwith
に変更するだけで対応できます。Node.js v22にアップデートする際は、この点に注意してください。
参考
- Warn code that uses import assertions · Issue #17944 · denoland/deno
- Modules: ECMAScript modules | Node.js v22.0.0 Documentation
- Node.js — Node.js 22 is now available!
- node/doc/changelogs/CHANGELOG_V22.md at main · nodejs/node
- Announcing TypeScript 5.3 - TypeScript
- Language support and tools · Cloudflare Pages docs