インポート属性

公開日 · タグ: ECMAScript

以前のバージョン #

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を使用するように促す警告がコンソールに出力されます。

インポート属性のサポート状況 #