"use strict"
在我們深入探討細節之前,讓我們先了解一些背景。
- ESM(ECMAScript 模組)在技術上總是處於嚴格模式中。 連結。
這表示如果你使用 ESM,則不需要在檔案開頭加入 "use strict"
。 它預設就會啟用。
- 嚴格模式不只是一個子集合:它故意與一般程式碼區分語意。
format: 'esm'
如果你所有檔案都是 ESM,則你不需要理會 "use strict"
。
如果你的檔案包含 commonjs 模組,事情會變得有點複雜。由於你想輸出 ESM,因此你必須確定你的 commonjs 檔案程式碼在嚴格模式中是有效的。Rolldown 會在嚴格模式中解析它,如果無效則會傳回錯誤。
透過 format: 'esm'
,rolldown 會在嚴格模式中解析你的程式碼,並會傳回與嚴格模式相關的錯誤。解析完畢後,rolldown 會在每個模組中移除 "use strict"
(如果存在的話)。
輸出的程式碼不會包含 "use strict"
,因為 ESM 已經處於嚴格模式中。
format: 'cjs'
在輸出 commonjs 時,將有數種處理 "use strict"
的策略。
Rollup 會在輸出檔案的最前端加入 "use strict"
,因為它只接受 ESM 輸入。
Esbuild 有條件地輸出 "use strict"
(連結),但並非完全。
Esbuild 另外說明使用 ESM 和 CJS 混合模組,幾乎不可能在啟用範圍提升功能的情況下,完美處理 "use strict"
(連結)。
Rolldown 選擇輸出可執行的程式碼,並盡可能優化。
如果該區塊的所有模組都滿足下列條件,rolldown 只會在每個區塊加入 "use strict"
- ESM
- commonjs 模組,檔案前端帶有
"use strict"
否則,它會在區塊中省略 "use strict"
。請注意,這會改變原始 ESM 程式碼的語意,因為 "use strict"
並未加入區塊中。
透過 format: 'cjs'
,rolldown 會先在嚴格模式中解析你的程式碼,如果第一次解析傳回錯誤,則會再次在非嚴格模式中解析。
在此查看更多關於 "use strict"
會影響哪些部分的資訊 連結。
format: 'app'
由於每個模組都包覆在一個函式中,rolldown 可選擇根據原始模組來輸出每個函式的 "use strict"
。