以前のバージョン #
V8はv9.1でインポートアサーション機能をリリースしました。この機能により、モジュールのimport文にassert
キーワードを使用して追加情報を含めることができるようになりました。この追加情報は現在、JavaScriptモジュール内でJSONおよびCSSモジュールをインポートするために使用されています。
インポート属性 #
その後、インポートアサーションはインポート属性へと進化しました。この機能のポイントは、モジュールのimport文に追加情報を含めることができるという点で変わりません。
最も重要な違いは、インポートアサーションがアサートのみのセマンティクスを持っていたのに対し、インポート属性はより緩和されたセマンティクスを持っていることです。アサートのみのセマンティクスとは、追加情報がモジュールがロードされる方法には影響せず、ロードされるかどうかにのみ影響することを意味します。たとえば、JSONモジュールは、そのMIMEタイプによって常にJSONモジュールとしてロードされ、assert { type: 'json' }
句は、要求されたモジュールのMIMEタイプがapplication/json
でない場合にのみロードを失敗させる可能性があります。
ただし、アサートのみのセマンティクスには致命的な欠陥がありました。ウェブでは、HTTPリクエストの形式は、要求されるリソースのタイプによって異なります。たとえば、Accept
ヘッダーはレスポンスのMIMEタイプに影響を与え、Sec-Fetch-Dest
メタデータヘッダーはウェブサーバーがリクエストを受け入れるか拒否するかに影響を与えます。インポートアサーションはモジュールをロードする方法に影響を与えることができなかったため、HTTPリクエストの形式を変更することができませんでした。リクエストされているリソースのタイプは、どのコンテンツセキュリティポリシーが使用されるかにも影響します。インポートアサーションは、ウェブのセキュリティモデルで正しく機能することができませんでした。
インポート属性は、アサートのみのセマンティクスを緩和し、属性がモジュールのロード方法に影響を与えることを可能にします。言い換えれば、インポート属性は、適切なAccept
およびSec-Fetch-Dest
ヘッダーを含むHTTPリクエストを生成できます。新しいセマンティクスに合わせて構文を合わせるために、古いassert
キーワードはwith
に更新されました。
// main.mjs
//
// New 'with' syntax.
import json from './foo.json' with { type: 'json' };
console.log(json.answer); // 42
動的import()
#
同様に、動的import()
も、with
オプションを受け入れるように更新されました。
// main.mjs
//
// New 'with' option.
const jsonModule = await import('./foo.json', {
with: { type: 'json' }
});
console.log(jsonModule.default.answer); // 42
with
の可用性 #
インポート属性は、V8 v12.3でデフォルトで有効になっています。
assert
の非推奨と最終的な削除 #
assert
キーワードはV8 v12.3以降非推奨となり、v12.6までに削除される予定です。assert
の代わりにwith
を使用してください!assert
句を使用すると、代わりにwith
を使用するように促す警告がコンソールに出力されます。