{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/",
  "atlas": "https://www.pystone.net/?node=wechat-minigame-vs-miniprogram-framework-diff#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff.md",
  "context": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:wechat-minigame-vs-miniprogram-framework-diff",
  "slug": "wechat-minigame-vs-miniprogram-framework-diff",
  "title": "关于微信小游戏与小程序框架的差异",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "关于微信小游戏与小程序框架的差异",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "36d8c7d2ab9f6c41a5c5de7e36af51e34d64fe4cc049a923f7b64b0c9244c35e",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "关于微信小游戏与小程序框架的差异",
      "anchor": "关于微信小游戏与小程序框架的差异",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E5%85%B3%E4%BA%8E%E5%BE%AE%E4%BF%A1%E5%B0%8F%E6%B8%B8%E6%88%8F%E4%B8%8E%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A1%86%E6%9E%B6%E7%9A%84%E5%B7%AE%E5%BC%82"
    },
    {
      "depth": 2,
      "text": "一、运行时架构差异",
      "anchor": "一运行时架构差异",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E4%B8%80%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9E%B6%E6%9E%84%E5%B7%AE%E5%BC%82"
    },
    {
      "depth": 3,
      "text": "小程序（Mini Program）",
      "anchor": "小程序mini-program",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E5%B0%8F%E7%A8%8B%E5%BA%8Fmini-program"
    },
    {
      "depth": 3,
      "text": "小游戏（Mini Game / Unity WebGL）",
      "anchor": "小游戏mini-game-unity-webgl",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E5%B0%8F%E6%B8%B8%E6%88%8Fmini-game-unity-webgl"
    },
    {
      "depth": 2,
      "text": "二、技术栈与底层框架",
      "anchor": "二技术栈与底层框架",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E4%BA%8C%E6%8A%80%E6%9C%AF%E6%A0%88%E4%B8%8E%E5%BA%95%E5%B1%82%E6%A1%86%E6%9E%B6"
    },
    {
      "depth": 2,
      "text": "三、为什么小游戏没有页面跳转 API？",
      "anchor": "三为什么小游戏没有页面跳转-api",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E4%B8%89%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B0%8F%E6%B8%B8%E6%88%8F%E6%B2%A1%E6%9C%89%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC-api"
    },
    {
      "depth": 2,
      "text": "四、小游戏典型架构",
      "anchor": "四小游戏典型架构",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E5%9B%9B%E5%B0%8F%E6%B8%B8%E6%88%8F%E5%85%B8%E5%9E%8B%E6%9E%B6%E6%9E%84"
    },
    {
      "depth": 2,
      "text": "五、页面与 Unity 场景的关系",
      "anchor": "五页面与-unity-场景的关系",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E4%BA%94%E9%A1%B5%E9%9D%A2%E4%B8%8E-unity-%E5%9C%BA%E6%99%AF%E7%9A%84%E5%85%B3%E7%B3%BB"
    },
    {
      "depth": 3,
      "text": "小结",
      "anchor": "小结",
      "citation": "https://www.pystone.net/notes/wechat-minigame-vs-miniprogram-framework-diff/#%E5%B0%8F%E7%BB%93"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:game-graphics-and-runtime",
      "title": "游戏图形与运行时",
      "url": "https://www.pystone.net/notes/game-graphics-and-runtime/",
      "atlas": "https://www.pystone.net/?node=game-graphics-and-runtime#knowledge-atlas",
      "label": "游戏图形与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "WebGL中的“关于微信小游戏与小程序框架的差异”导航项",
      "citation": "https://www.pystone.net/notes/game-graphics-and-runtime/#webgl"
    }
  ],
  "contentMarkdown": "# 关于微信小游戏与小程序框架的差异\n\n﻿# 关于微信小游戏与小程序框架的差异\n\n\n\n\n## 一、运行时架构差异\n\n### 小程序（Mini Program）\n\n* **视图层 + 逻辑层分离**\n\n  * 视图层使用 WXML/WXSS，由微信原生引擎直接渲染原生组件；\n  * 逻辑层用 JavaScript 运行在“App-Service”沙箱里，通过双进程（或多线程）与视图层通信。\n* **页面栈管理**\n\n  * 每个页面对应一个 `.js` + `.wxml` + `.wxss` 模块；\n  * 框架维护一个全局的页面栈（最多十几级），提供 `wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`、`wx.onPageNotFound` 等 API 做路由与生命周期管理。\n\n### 小游戏（Mini Game / Unity WebGL）\n\n* **单一 Canvas / WebGL 画布**\n\n  * 只有一个 `<canvas>`（或 WebGL 上下文），所有内容都由游戏引擎（Unity 编译后的 WASM + JS 框架）在这个画布上渲染；\n  * 没有多页面概念，也没有原生组件渲染，所有 UI 和场景切换都由引擎负责。\n* **纯脚本运行环境**\n\n  * 逻辑和渲染全都在同一个 JS+WASM 运行时里，没有“视图层进程”与“逻辑层进程”之分；\n  * 微信基础库并不注入小程序的页面栈路由 API，也不维护页面栈。\n\n---\n\n## 二、技术栈与底层框架\n\n| 维度        | 小程序                            | 小游戏（Unity WebGL）                  |\n| --------- | ------------------------------ | --------------------------------- |\n| **UI 描述** | WXML + WXSS + 原生组件             | 引擎内部 Canvas/WebGL + 自绘 UI         |\n| **渲染引擎**  | 微信客户端原生渲染（基于 WebView 或原生控件）    | Unity 引擎在浏览器/WebView 中渲染          |\n| **业务逻辑**  | JavaScript（V8/JSC/Hermes）      | Unity C# 编译成 WASM + JS 桥接层        |\n| **打包方式**  | `.wxapkg` 包，资源独立管理             | WebGL 导出：`game.js` + `.wasm` + 资源 |\n| **生命周期**  | `App.onLaunch`、`Page.onShow` 等 | `UnityLoader` 加载完成后，进入游戏循环        |\n\n---\n\n## 三、为什么小游戏没有页面跳转 API？\n\n1. **没有“页面”概念**\n   小程序的“页面”是微信为业务逻辑层提供的多页面路由模型；小游戏一旦启动，就只剩下一个被 Unity 接管的 Canvas，微信基础库不再提供页面栈，也就没有 `wx.navigateTo`、`wx.redirectTo` 这种面向多页面的 API。\n\n2. **所有切换都在引擎内完成**\n   在小游戏里，关卡、菜单、子场景……都由 Unity 自己的 **场景管理** (`SceneManager`)、**UI 界面**（如 `Canvas` + `UGUI`）来做，根本不需要微信层面再做页面路由。\n\n3. **简化运行时**\n   微信为小游戏精简了基础库，只保留渲染上下文、输入事件、资源加载等必要接口，去掉了与路由相关、原生组件相关的逻辑，以减小包体与提升性能。\n\n---\n\n## 四、小游戏典型架构\n\n1. **启动与加载**\n\n   * `game.js`（由 Unity 导出）在 H5/小程序容器中插入一个 `<canvas>`；\n   * 加载 `.wasm`、资源包（图集、音频、Bundle）；\n\n2. **引擎初始化**\n\n   * Unity 在 JS 侧建立渲染循环，下载并初始化 WASM 中的 C# 运行时；\n   * 拆分主线程 / Worker（多线程模式）加载资源。\n\n3. **游戏逻辑循环**\n\n   * Unity 主循环（`Update`、`FixedUpdate`、`Render`）全部跑在引擎层；\n   * 脚本调用 `UnityEngine.SceneManagement.SceneManager.LoadScene()` 切换场景，不依赖微信 API。\n\n4. **与微信基础库交互**\n\n   * 只会用到：`wx.getSystemInfo`、`wx.request`、`wx.createInnerAudioContext`、`wx.triggerGC`、少量性能调优 API；\n   * 无页面栈、无原生 UI，所有交互、输入、UI 都在 Unity 内部处理。\n\n---\n\n## 五、页面与 Unity 场景的关系\n\n* **页面（小程序）**\n\n  * 如果你把 Unity WebGL 嵌在**小程序页面**里（而非小游戏模式），那该页面只是一个承载 `<web-view>` 或 `<canvas>` 的容器；\n  * 小程序层可以通过 `wx.miniProgram.postMessage` 或自定义 JS 接口与 Unity 交互。\n\n* **Unity 场景**\n\n  * 在引擎层，场景（Scene）是关卡、UI 界面、逻辑分区的集合；\n  * 场景切换不经过微信层，只在 Unity 内部完成，彼此隔离。\n\n---\n\n### 小结\n\n* **小程序**：多页面、原生组件、微信负责渲染与路由；\n* **小游戏**：单 Canvas、游戏引擎全权负责渲染与逻辑，不存在微信层面的页面栈；\n* **页面跳转**：仅属于小程序的业务模型，小游戏省略了这层、依赖引擎场景管理；\n* **嵌入关系**：在小程序模式下，你可把 Unity WebGL 当作一个“页面”载入；在小游戏模式下，Unity 完全接管，微信只提供最底层的运行时支持。\n\n这样就能理解为什么在小游戏里永远拿不到 `wx.navigateTo` / `wx.redirectTo`，也不需要它们来做场景切换。\n"
}
