先前 #
V8 在 v9.1 中發布了 匯入斷言 功能。此功能允許模組匯入陳述式使用 assert
關鍵字包含額外資訊。此額外資訊目前用於匯入 JavaScript 模組中的 JSON 和 CSS 模組。
匯入屬性 #
從那時起,匯入斷言已演變為 匯入屬性。此功能的重點仍然相同:允許模組匯入陳述式包含額外資訊。
最重要的差異是匯入斷言具有僅斷言的語意,而匯入屬性具有較為寬鬆的語意。僅斷言的語意表示額外資訊不會影響模組的載入方式,只會影響是否載入。例如,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 中移除。請使用 with
取代 assert
!使用 assert
子句會在主控台列印警告,建議改用 with
。