For the complete documentation index, see llms.txt. This page is also available as Markdown.

构建自定义

说明如何修改包裹迷你应用的 Web 层(HTML、TypeScript、npm 依赖、Vite 配置),使其能在 SDK 更新后继续生存。

改哪里

构建分为两个阶段:Unity 生成 WebGL 产物,以及将该产物包裹成 Web 项目并打包。内部实现位于 构建流水线,这里仅介绍 用户可编辑的位置

阶段
输出
编辑位置

Unity WebGL 构建

webgl/ (中间产物)

不编辑。配置在 构建配置文件

Granite 打包

ait-build/ait-build/dist/

Assets/WebGLTemplates/AITTemplate/ 子项 — 本文档

注意: webgl/ait-build/中的文件不要直接修改。 webgl/是 Unity 每次构建都会重新生成的中间产物,而打包是基于 Assets/WebGLTemplates/AITTemplate/里的模板运行的。即使改了这两个文件夹,也不会反映到最终包中,并且会在下一次构建时消失。

参考:QR 测试和实际发布使用的最终包是 ait-build/dist/。想直接查看构建结果时,请看这个文件夹。

用户区域标记

SDK 模板会在每次进入构建时与最新 SDK 版本合并。这时只会保留 标记之间的内容,标记外的内容会被 SDK 值更新。合并在什么时候、对哪个文件发生,见 构建流水线的模板合并时机一节。

HTML 标记

index.html提供两个区域。

<!-- USER_HEAD_START - 在此区域添加用户自定义脚本/样式 -->
<!-- USER_HEAD_END -->

<!-- USER_BODY_END_START - 在此区域添加用户自定义脚本 -->
<!-- USER_BODY_END_END -->

USER_HEAD<head> 中, USER_BODY_END</body> 之前插入。

TypeScript 配置文件标记

vite.config.ts, granite.config.ts, apps-in-toss.config.ts使用相同的标记对。

重要: USER_CONFIG中由 SDK 管理的配置(应用名、品牌、权限、 webViewProps 等)如果再次声明,合并时会以 SDK 值为准,因此没有任何效果。构建是正常的,但会出现如下警告——请把该键从 USER_CONFIG中删除。

相反地, SDK_GENERATED 区域里如果残留未替换的占位符,构建会因严重错误而中止。这种情况下请用 Clean Build 重新生成模板。

可定制文件

所有文件都位于 Assets/WebGLTemplates/AITTemplate/ 下。

文件
作用
合并方式

index.html

HTML 入口点

USER_HEAD / USER_BODY_END 保留标记区域

BuildConfig~/package.json

npm 依赖

dependencies / devDependencies 合并(冲突时 SDK 优先)

BuildConfig~/vite.config.ts

Vite 构建配置

USER_CONFIG 保留标记区域

BuildConfig~/granite.config.ts

Granite 打包配置(2.x)

USER_CONFIG 保留标记区域

BuildConfig~/apps-in-toss.config.ts

Apps in Toss 配置(3.x)

USER_CONFIG 保留标记区域。若为空, granite.config.tsUSER_CONFIG自动迁移

BuildConfig~/tsconfig.json

TypeScript 编译器配置

SDK 必需选项(moduleResolution, esModuleInterop)会强制使用 SDK 值,其余项优先使用项目值

BuildConfig~/pnpm-workspace.yaml

pnpm 工作区配置

如果有项目文件就用项目文件,没有则复制 SDK 文件

BuildConfig~/src/

TypeScript 入口点和模块

整个文件夹保留(递归复制)

BuildConfig~/ 其他文件

.env、静态资源等

除下面排除列表外,原样复制所有根目录文件和子文件夹

从其他文件复制中排除的内容——根文件 package.json, pnpm-lock.yaml, pnpm-workspace.yaml, vite.config.ts, tsconfig.json, unity-bridge.ts, granite.config.ts, apps-in-toss.config.ts (各自都有专用合并路径)和文件夹 node_modules/, .npm-cache/, dist/.

dependencies 冲突处理:如果添加了 SDK 已经声明的包(@apps-in-toss/web-framework, @apps-in-toss/web-analytics, vite, typescript 等)的不同版本,会优先采用 SDK 版本。SDK 未声明的包(例如: firebase, canvas-confetti)会照常添加。

参考: pnpm-workspace.yaml用于从 pnpm 的供应链保护(minimumReleaseAge)中 @apps-in-toss/*排除。因为 pnpm 只会从 pnpm-workspace.yaml读取此设置,所以必须复制到构建目录。如果没有特殊原因,请保持 SDK 默认值不变。

index.html 自定义

修改对象是 Assets/WebGLTemplates/AITTemplate/index.html必须 _START_END 之间添加才能被保留。

USER_HEAD用于静态资源声明,例如 meta 标签、字体、preload 提示、外部样式表等。

USER_BODY_END用于引用用户代码的入口点。推荐模式是把 TypeScript 入口点作为模块加载——入口点中编写的所有 import 都会经过 Vite 的树摇和压缩,打包成一个 bundle。

构建完成后, ait-build/index.html,可以打开它确认写入的代码是否已包含。如果 Unity Console 打出如下内容,就说明合并正常工作。

TypeScript 入口点

用户代码以 BuildConfig~/src/main.ts为入口点编写。由于 Vite 会打包该文件,npm 包 import、树摇、类型检查都会生效。

BuildConfig~/src/main.ts:

BuildConfig~/tsconfig.json可放入此处来自定义编译器选项。SDK 必需选项(moduleResolution, esModuleInterop)会强制使用 SDK 值。

添加外部库

推荐以 npm 包安装并在入口点中 import。这样版本固定,可保证构建可复现,不受 CDN 故障或网络阻断影响,并且支持树摇和压缩。

流程与库无关,都是一样的—— package.json在中添加依赖 → main.ts中 import → index.html中引用入口点。具体示例请看下面的 教程 部分。

另一种方式是直接从 CDN 加载

如果只是想在没有构建工具的情况下快速试用, USER_HEAD<script src="...">可以直接加载。但 CDN 故障时应用会加载失败,而且版本写死在 URL 里,复现性较差,也无法享受树摇和类型检查。不建议在日常使用中这样做。

Vite 配置自定义

BuildConfig~/vite.config.tsUSER_CONFIG 在此部分添加插件或构建选项。

granite.config.tsapps-in-toss.config.ts也提供同样的 USER_CONFIG 部分。

使用 React 组件

若要用 React 实现 UI 覆盖层,可以在添加外部库和 TypeScript 入口点流程中再加入 React 依赖与 Vite 插件。

BuildConfig~/package.json:

BuildConfig~/tsconfig.json:

BuildConfig~/vite.config.ts:

BuildConfig~/src/main.tsx:

index.html:

构建产物结构

打包完成后, ait-build/会生成如下结构。

node_modulespnpm-lock.yaml在重新构建时也会保留,从而加快构建速度。

SDK 更新时的行为

即使更新 SDK,用户自定义内容也会自动保留。

情况
行为

有标记的模板

保留用户区域,仅更新 SDK 区域

没有标记的旧模板

整个文件替换为新的 SDK 模板 + 手动迁移提醒

没有标记的旧版 index.html会整体替换,并输出如下警告。请把备份的旧文件中的自定义部分移到新模板的标记区域中。

如果合并正常,会留下如下日志。

教程

下面两个教程(#1 canvas-confetti、#2 Firebase Analytics)会被 E2E 测试实际构建并在浏览器中运行验证。代码块就是测试所期望的形式,因此建议先原样照做,再进行修改。

使用 canvas-confetti 添加屏幕特效

canvas-confetti这是一个最简单的示例:将其打包,在页面加载时显示彩纸效果。可以一次性学会添加外部库的完整流程。

1. BuildConfig~/package.json在中添加依赖

2. BuildConfig~/src/main.ts 编写

3. index.html在中引用入口点

4. 构建后确认

运行构建并在浏览器中打开产物后,页面加载后会立即出现彩纸效果。如果控制台里看到 confetti is not defined,请重新检查入口点引用或 package.json 依赖添加步骤。

Firebase Analytics 集成

将 Firebase Web SDK(Modular SDK)打包后与应用初始化和 Analytics 关联。API 密钥通过 .env注入——这样不会把密钥写死在代码里,从而避免提交到仓库,还能按环境使用不同的值。

1. BuildConfig~/package.json在中添加依赖

2. Assets/WebGLTemplates/AITTemplate/BuildConfig~/.env 编写

该文件在构建时会自动复制到 ait-build/.env,由 Vite 使用。

Vite 只会把 VITE_ 前缀的环境变量暴露给客户端 bundle。使用其他前缀时, import.meta.env无法读取。

.gitignore 设置: .env包含密钥,请把下面两个路径都加入 ignore。团队共享的默认值通常放在 .env.example中。

3. BuildConfig~/src/main.ts 编写

4. index.html在中引用入口点

5. 构建后确认

可以在浏览器开发者工具的控制台中确认如下内容。

也可以在 Firebase 控制台的 Analytics > DebugView 中确认实时事件接收(需要启用调试模式—— 官方文档 参见).

如果要同时应用两个教程: package.json在……中添加这两个依赖项,并且, main.ts在……中按顺序放入两个 import 块即可。入口点只需一个(src/main.ts)就足够了。

相关文档

这有帮助吗?