小程序开放平台

文档中心
概览
框架开发
代码编辑
开发辅助
AI 助手(Beta)
下载
代码沙箱

代码沙箱

开发
>
开发工具
>
代码沙箱
>
更新时间:2025-09-12 20:23:06

代码沙箱

1. 简介

代码沙箱是为小程序提供的一项功能,用于隔离不同运行环境之间的差异,确保代码在不同平台(IDE、安卓/iOS、审核工具)上表现一致。

设置路径:

IDE -> 详情 -> 代码沙箱

2. 背景:为何需要沙箱?

小程序在从开发、测试到上线的整个生命周期中,会经历多个运行环境,例如:

  • IDE:
    WebView
  • 安卓:
    V8
  • iOS:
    JavaScriptCore
  • 审核工具:
    Worker
    WebView

这些 JavaScript 运行环境存在差异。例如,

WebView
环境中包含
window
document
等浏览器特有的全局对象,而在
V8
JavaScriptCore
中则没有。如果在代码中直接访问这些非标准对象,会导致在真机上运行时抛出错误。

javascript
// 在非 WebView 环境中执行会报错
window; 
// Uncaught ReferenceError: window is not defined

代码沙箱旨在抹平这些环境差异,提供一个更可控、更一致的开发与运行环境。

3. 沙箱选项

沙箱提供三种模式:

严格
宽松
关闭
。默认为
宽松
模式

3.1. 关闭沙箱

  • 特点: 和基础库共享同一个运行环境。
  • 行为:
    javascript
    // 读取这些变量会抛出错误。
    console.log(window); // Uncaught ReferenceError: window is not defined
    
  • 风险: 开发者需要特别注意,不要意外修改或覆盖
    globalThis
    上的全局函数或对象,否则可能导致小程序运行异常。
    javascript
    // 错误示例:这将破坏小程序的核心功能
    globalThis.createRenderer = () => { /* ... */ }; 
    

3.2. 宽松模式

  • 特点:
    1. 和基础库共享同一个运行环境。
    2. 在此模式下,以下浏览器相关的全局变量会被重置为
      undefined
    • window
    • document
    • frames
    • self
    • location
    • navigator
    • localStorage
    • history
    • screen
    • alert
    • confirm
    • prompt
  • 行为:
    • 读取这些变量不会抛出错误,但会得到
      undefined
    • 尝试对这些变量进行 Polyfill是无效的。
    javascript
    // a.js
    console.log(window); // 输出: undefined
    globalThis.window = { msg: 'my window' };
    console.log(window); // 输出: undefined
    
    // b.js
    console.log(window); // 输出: undefined
    

3.3. 严格模式

  • 特点:
    • 与宽松模式一样,上述浏览器相关的全局变量会被重置
      undefined
    • 关键区别1: 允许开发者对这些变量进行 Polyfill,并且会生效。
    • 关键区别2:
      globalThis
      是一个纯净的对象,仅包含标准的小程序 API 和 JavaScript 内置对象。
  • 行为:
    • 开发者可以自由定义全局变量,而不会影响小程序的核心功能。
    javascript
    // a.js
    globalThis.window = { msg: 'my window' };
    
    // b.js
    console.log(window); // 输出: { msg: 'my window' }
    
    javascript
    // 在严格模式下,这不会影响小程序运行
    globalThis.createRenderer = () => {}; 
    
  • 使用前提: 为了确保严格模式能正常工作,您的代码中不应使用以下非标准方式来获取全局对象。因为通过这些方式获取到的 global 与严格模式下的 globalThis 不是同一个对象,对 global 的修改不会同步到 globalThis 上。
    javascript
    // 不推荐的方式
    var global = new Function("return this")();
    var global = (function() { return this })();
    
    // 推荐
    globalThis;
    
  • 建议:
    • 推荐使用: 对于绝大部分现代项目,强烈建议使用严格模式。它提供了最纯净、最可预测的运行环境。
    • 关于
      globalThis
      : 小程序的运行环境(iOS >= 12.2, V8 > 9.0(chrome 90))均原生支持
      globalThis
      。因此,没有必要使用上述拗口的、非标准的方式来获取全局对象。