匯入屬性

發布於 · 標記為 ECMAScript

先前 #

V8 在 v9.1 中發布了 匯入斷言 功能。此功能允許模組匯入陳述式使用 assert 關鍵字包含額外資訊。此額外資訊目前用於匯入 JavaScript 模組中的 JSON 和 CSS 模組。

匯入屬性 #

從那時起,匯入斷言已演變為 匯入屬性。此功能的重點仍然相同:允許模組匯入陳述式包含額外資訊。

最重要的差異是匯入斷言具有僅斷言的語意,而匯入屬性具有較為寬鬆的語意。僅斷言的語意表示額外資訊不會影響模組的載入方式,只會影響是否載入。例如,JSON 模組會根據其 MIME 類型載入為 JSON 模組,而 assert { type: 'json' } 子句只能在所要求模組的 MIME 類型不是 application/json 時導致載入失敗。

但是,僅斷言的語意有一個致命的缺陷。在網路上,HTTP 要求的格式會根據所要求的資源類型而有所不同。例如,Accept 標頭 會影響回應的 MIME 類型,而 Sec-Fetch-Dest 元資料標頭 會影響網路伺服器是否接受或拒絕要求。由於匯入斷言無法影響載入模組的方式,因此無法變更 HTTP 要求的格式。所要求資源的類型也會影響所使用的 內容安全政策:匯入斷言無法正確配合網路的安全模型。

匯入屬性放寬了僅斷言的語意,允許屬性影響模組的載入方式。換句話說,匯入屬性可以產生包含適當 AcceptSec-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 中移除。請使用 with 取代 assert!使用 assert 子句會在主控台列印警告,建議改用 with

匯入屬性支援 #