沙箱是什麼
有兩種自訂 擴充功能:沙箱和非沙箱。到目前為止的一切都是沙箱的。本頁解釋這意味著什麼,以及為什麼您通常會想要另一種。
沙箱
在 Bilup 中,沙箱是一個 <iframe>。沙箱擴充功能執行在無法觸及編輯器和 VM 所在主頁面上的跨源 iframe 中。它被隔離在自己的世界中。
這種隔離意味著沙箱擴充功能:
- 不能存取 Bilup 內部(VM、執行時、渲染器)
- 不能讀取專案中未作為引數傳遞給它的任何部分,包括變數
- 不能直接與角色互動
它仍然可以:
- 呼叫大多數公共 Web API,受 CORS 約束
- 使用許多不需要頁面存取的瀏覽器 API,例如 Gamepad API
其他一些 Scratch 修改版在 Worker 中沙箱擴充功能。Bilup 使用 iframe,因為它是跨源的(更安全)並暴露更多 Web API。
大限制
每次沙箱積木執行時,指令碼至少暫停一幀,無論積木多麼微不足道。"執行時不重新整理螢幕"和渦輪模式都不會改變這一點;等待是不可避免的,因為每次呼叫都必須跨越 iframe 邊界。
每個積木一幀的成本使沙箱擴充功能對任何在迴圈中執行的東西幾乎無用,這就是非沙箱擴充功能存在的原因。
非沙箱擴充功能
非沙箱擴充功能不在 iframe 中執行。它與 Bilup 本身在同一頁面上執行,作為 <script> 標籤載入。因此它:
- 可以存取 Bilup 內部
- 可以讀取專案的任何部分,包括變數
- 可以直接與任何角色互動
並且,關鍵是,執行它的積木是瞬時的。沒有強制的一幀延遲。
權衡是信任和責任:因為非沙箱程式碼可以做頁面能做的任何事情,Bilup 只在特定條件下以非沙箱方式執行它,而您要承擔一些額外的規則。這是下一頁的主題。
練習
- 載入一個帶什麼都不做的
COMMAND積木的沙箱擴充功能(就像您一直在做的)。在一個空專案中,把它放進重複執行 (10)四次。注意迴圈花費超過一秒,儘管積木什麼都沒做。 - 用
將我的變數設為 0替換那些積木。迴圈現在立即完成。這就是非沙箱擴充功能積木的行為方式。 - 在沙箱擴充功能內部,
console.log(window.origin)。與在主頁面控制台中輸入的window.origin比較。它們不同,因為沙箱是一個獨立的源。
下一步
非沙箱擴充功能對大多數用途顯然更好,所以讓我們寫一個。