沙箱是什么
有两种自定义扩展:沙箱和非沙箱。到目前为止的一切都是沙箱的。本页解释这意味着什么,以及为什么您通常会想要另一种。
沙箱
在 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比较。它们不同,因为沙箱是一个独立的源。
下一步
非沙箱扩展对大多数用途显然更好,所以让我们写一个。