Cocos Creator 打包 Windows exe 与 NSIS 安装包实战指南
发布时间:2026/9/19 4:15:02 作者:尧图编辑部 阅读量:1,286

1. 从 Creator 到桌面端为什么值得折腾这条链路把 Cocos Creator 做的游戏或互动应用打包成 Windows 上能直接双击运行的 exe再进一步做成一个带安装向导的安装包这件事听起来像是发布环节的收尾工作但真正动过手的人都知道坑几乎全集中在这一段。编辑器里预览一切正常构建出来的东西一放到别人电脑上就白屏、缺 DLL、路径找不到、资源加载失败——这类问题我在过去几年里反复遇到也反复帮人排查过。这篇内容面向的是已经能用 Cocos Creator 做出可运行项目、准备把它交付给 Windows 用户的开发者。不管你是要做一款独立小游戏发给朋友测试还是要给客户交付一个双击就能装的桌面应用这条链路都绕不开。核心关键词就几个Cocos Creator 构建、Windows exe、Electron 壳、NSIS 安装包。我会把从构建配置到最终生成安装包的完整过程拆开讲重点放在那些官方文档一笔带过、但实际会卡住你半天的地方。先给一个整体认知避免你走弯路。Cocos Creator 本身构建出来的是Web 技术栈的产物HTML JS 资源它并不直接产出原生 exe。所以打包成 exe这件事本质上是用一个桌面容器把 Web 产物包起来。目前主流有两条路一条是用 Electron 做壳另一条是用 Creator 原生构建配合原生工程。前者通用、跨平台、生态成熟后者性能更好但配置复杂。这篇主要走 Electron 这条线因为它对绝大多数中小项目来说性价比最高也是社区里讨论最多的方案。至于安装包Electron 官方推荐的是electron-builder它内部可以调用NSIS来生成 Windows 安装向导。所以你最终拿到的东西是一个 exe 主程序 一个安装包 exe。下面我按实际操作的顺序把每一步的选择理由和踩坑点都摊开讲。2. 构建前的工程配置决定后面顺不顺的关键一步2.1 构建平台与渲染后端的取舍在 Creator 的构建面板里第一步要选的就是构建平台。这里有个容易混淆的点很多人以为要选 Windows 平台但实际上如果你走 Electron 路线应该选 Web Mobile 或 Web Desktop因为你要的是 Web 产物再由 Electron 去加载它。选 Web Desktop 还是 Web Mobile取决于你的项目交互方式。Web Desktop 会默认按桌面分辨率适配鼠标事件处理更自然Web Mobile 则偏向触摸。如果你的项目本来就是给 PC 玩的选 Web Desktop 更省事。我一般会选 Web Desktop然后在项目里自己控制分辨率适配策略。渲染后端这块Creator 3.x 提供了 WebGL 和 WebGL2 的选项。实测下来优先用 WebGL2因为 Electron 内置的 Chromium 版本足够新WebGL2 支持没问题性能也更好。但如果你的项目里用了某些老旧的第三方库可能会在 WebGL2 下出问题那就退回 WebGL。这个不用纠结构建一次跑一下就知道。2.2 资源路径与首屏加载的隐患构建配置里有一个非常关键但经常被忽略的选项资源服务器地址和资源加载模式。默认情况下Creator 构建出来的产物会假设资源通过 HTTP 服务加载。但 Electron 加载本地文件时用的是file://协议这两者的路径解析规则不一样。我的做法是在构建时把资源加载模式设为本地加载并且确保构建产物里的index.html能通过相对路径找到所有资源。如果你发现打包后白屏八成就是这里的问题。可以在 Electron 里打开开发者工具看控制台如果报的是一堆 404 或者 CORS 错误那就是路径没配对。另外一个坑是首屏资源体积。Web 产物如果首包太大Electron 启动时会有一段明显的白屏时间。建议在构建前把图片做一轮压缩把不必要的首屏资源改成远程加载或延迟加载。这个优化在浏览器里可能感觉不明显但在桌面端用户对启动速度的容忍度更低。2.3 构建产物的目录结构确认构建完成后你会得到一个build目录里面通常有web-desktop这样的子目录包含index.html、assets、src、cocos-js等。先别急着往 Electron 里塞先用一个本地静态服务器跑一下这个目录确认在浏览器里能正常打开、能玩。这一步是基线验证如果浏览器里都跑不起来Electron 里更不可能跑起来。我习惯用npx serve或者 Python 自带的http.server快速起一个服务验证。确认没问题后再进入 Electron 环节。这个先验证再打包的习惯帮我省下了大量排查时间因为一旦进了 Electron问题来源就变成了两层Web 层 容器层定位难度翻倍。3. Electron 壳的搭建把 Web 产物装进桌面容器3.1 初始化 Electron 工程的最小结构Electron 工程不需要多复杂最小结构就三个东西package.json、main.js主进程、以及你的 Web 产物目录。我一般会在项目根目录下单独建一个electron文件夹把构建产物复制到electron/app下保持结构清晰。package.json里最关键的是main字段指向主进程文件以及scripts里配置启动和打包命令。依赖上electron作为开发依赖electron-builder也作为开发依赖。这里有个版本选择的经验Electron 版本不要盲目追新选一个稳定的大版本即可因为新版本有时会引入一些和 Creator 产物不兼容的行为。我通常选比最新版落后一到两个大版本的稳定版。主进程main.js的核心工作是创建一个BrowserWindow然后加载你的index.html。这里有几个参数必须注意webPreferences里的nodeIntegration和contextIsolation。为了安全现代 Electron 默认contextIsolation: true、nodeIntegration: false这对纯 Web 产物来说是好事保持默认即可。但如果你的项目需要调用原生能力比如读写文件就得通过预加载脚本preload来暴露接口而不是直接开nodeIntegration。3.2 加载本地文件时的路径陷阱这是整个环节里最容易翻车的地方。在main.js里加载页面有两种写法loadURL(file://...)和loadFile(...)。强烈建议用loadFile因为它会自动处理路径转义和跨平台差异而手写file://在 Windows 上遇到中文路径或空格时经常出问题。还有一个隐藏坑Creator 构建产物里的index.html可能引用了绝对路径的资源比如/assets/xxx。在file://协议下绝对路径会被解析到磁盘根目录直接 404。解决办法有两个一是构建时确保用相对路径二是在 Electron 里注册一个自定义协议把请求映射到本地目录。前者更简单优先用前者。如果确实遇到了必须用绝对路径的情况可以在主进程里用protocol.registerFileProtocol旧版或protocol.handle新版来拦截请求。这个方案稍微复杂但能彻底解决路径问题。我一般会先尝试相对路径方案实在不行才上自定义协议。3.3 窗口配置与用户体验细节BrowserWindow的配置直接影响用户第一眼看到的东西。几个我必调的参数width和height设成你游戏的目标分辨率resizable根据需求决定autoHideMenuBar: true可以隐藏默认菜单栏除非你需要菜单backgroundColor设成你游戏的背景色这样启动时不会闪白。还有一个体验优化点禁用默认的缩放和右键菜单。桌面游戏通常不需要浏览器的 Ctrl滚轮缩放也不希望用户右键看到检查元素。可以在主进程里监听webContents的事件来屏蔽这些行为。不过开发阶段建议保留开发者工具的快捷键方便调试发布前再关掉。启动白屏的问题除了前面说的资源路径还有一个原因是 Electron 窗口创建后立即显示但页面还没加载完。可以用show: false创建窗口等ready-to-show事件触发后再show()这样用户看到的就是已经渲染好的画面体验好很多。4. 用 electron-builder 生成 exe 与 NSIS 安装包4.1 electron-builder 的配置要点electron-builder的配置可以写在package.json的build字段里也可以单独放一个electron-builder.yml。我倾向于单独文件因为配置项多混在package.json里太乱。核心配置项包括appId应用唯一标识建议用反向域名格式、productName显示名称、directories.output输出目录、files要打包进应用的文件、winWindows 平台专属配置。win里最关键的是target可以指定nsis、portable、zip等。要生成安装包就选nsis。这里有个细节files字段决定了哪些文件会被打进最终的 asar 包。默认它会包含项目里很多东西导致包体积虚高。我一般会显式指定只包含app目录和必要的main.js、preload.js把源码、构建脚本、node_modules 里用不到的东西都排除掉。包体积从几百兆降到几十兆往往就是这一步的功劳。4.2 NSIS 安装向导的定制electron-builder内置了 NSIS 支持默认会生成一个标准的安装向导。但默认向导的界面比较朴素而且有些行为不符合国内用户习惯。可以通过nsis配置项来定制比如oneClick: false让用户可以选择安装路径allowToChangeInstallationDirectory: true开启路径选择createDesktopShortcut: true创建桌面快捷方式createStartMenuShortcut: true创建开始菜单项。oneClick这个选项值得说一下。默认是true也就是一键安装用户双击后直接装到默认目录没有选择余地。对于面向普通用户的软件一键安装体验更顺滑但对于需要装到特定盘符的场景就得设成false。我一般会根据交付对象来定给内部测试用一键给外部用户用可选路径。还有一个中文用户常遇到的问题安装向导的语言。默认可能是英文可以通过installerLanguages和language配置成中文。不过要注意NSIS 的中文支持需要对应的语言文件electron-builder一般会处理好但偶尔会有编码问题导致乱码。如果遇到乱码检查一下配置里的语言代码是否正确。4.3 打包过程中的常见报错与处理打包时最常见的报错是下载依赖失败。electron-builder在打包时会去下载对应平台的 Electron 二进制包和 NSIS 工具如果网络环境不好就会卡住或报错。解决办法是配置镜像源或者提前把需要的包缓存到本地。这个在配置里可以通过electronDownload指定镜像地址。另一个常见问题是签名相关。Windows 对未签名的 exe 会弹 SmartScreen 警告用户看到未知发布者会犹豫。如果只是内部使用可以忽略如果要正式发布建议购买代码签名证书。electron-builder支持配置签名但证书申请和配置是另一套流程这里不展开。还有一个坑是杀毒软件误报。NSIS 生成的安装包有时会被某些杀毒软件标记为可疑尤其是打包了脚本类内容的应用。这个没有完美的解决办法只能通过签名、提交白名单等方式缓解。实测下来加了代码签名后误报率会明显下降。5. 实测中反复出现的几个典型问题5.1 白屏与资源加载失败的排查链路白屏是最高频的问题我总结了一套排查顺序。第一步在 Electron 里打开开发者工具开发阶段可以在主进程里加win.webContents.openDevTools()看控制台报什么错。如果是 404就是路径问题如果是 CORS就是协议问题如果是 JS 报错就是代码兼容性问题。第二步确认index.html是否被正确加载。可以在主进程里监听did-fail-load事件把失败原因打出来。很多时候是loadFile的路径写错了或者构建产物没被正确复制到 Electron 目录。第三步检查 Creator 构建时的配置。特别是资源加载模式和首包资源这两个是白屏的重灾区。我遇到过好几次都是因为构建时选了远程加载模式结果 Electron 里没有对应的服务器资源全部加载失败。5.2 中文路径与空格路径的兼容处理Windows 用户把软件装在C:\Program Files\或者带中文的目录下是很常见的。如果你的代码里硬编码了路径或者用了不安全的路径拼接就会在这些场景下崩溃。解决办法是全程用 Node.js 的path模块处理路径避免手动拼字符串。在 Electron 里获取应用路径用app.getAppPath()获取用户数据目录用app.getPath(userData)这些都是跨平台安全的。Creator 产物里如果有动态加载资源的逻辑也要注意路径编码。有些老版本的加载器对中文路径处理不好建议在构建时就把资源目录名改成纯英文。5.3 安装包体积与启动速度的平衡包体积和启动速度是一对矛盾。包越大安装越慢启动时解压和加载也越慢。我的经验是把能外置的资源外置把能压缩的压缩。图片用 WebP 或压缩后的 PNG音频用合适的码率视频尽量走流式加载而不是打进包。Electron 本身的体积就不小一个空壳就上百兆这是它的固有代价。如果对体积极度敏感可以考虑用 Tauri 这类更轻量的方案但 Tauri 用的是系统 WebView兼容性又会有新问题。所以选型时要在体积、兼容性、开发成本之间权衡。对大多数项目来说Electron 的体积是可以接受的。6. 从开发到交付一些实战经验6.1 版本管理与构建产物的隔离我强烈建议把 Electron 工程和 Creator 工程分开管理构建产物通过脚本自动复制过去而不是手动拖拽。手动操作迟早会出错比如忘了更新某个文件导致打包出来的版本和预期不一致。写一个简单的 Node 脚本在 Creator 构建完成后自动把产物复制到 Electron 目录再触发打包整个流程就能一键完成。版本号也要统一管理。Creator 工程里的版本、Electron 的package.json版本、安装包显示的版本这三者最好保持一致否则用户装完看到的版本和实际不符排查问题时会很混乱。6.2 测试环节不能省打包出来的 exe 一定要在干净的 Windows 环境里测试最好是没有装过开发工具的机器或虚拟机。因为开发机上往往装了各种运行时和依赖很多问题在开发机上不会暴露。我见过太多次开发机上跑得好好的一到用户机器上就缺 DLL 或者报错。测试清单至少包括能否正常安装、能否正常启动、核心功能是否可用、卸载是否干净、桌面和开始菜单快捷方式是否正确。如果涉及存档或配置还要测试读写权限特别是装在Program Files下的情况因为那个目录默认需要管理员权限才能写入。6.3 后续更新的考虑如果这个应用后续还要更新最好在架构设计时就考虑好。Electron 应用常见的更新方案是electron-updater配合一个静态文件服务器或对象存储来分发更新包。这个方案需要在打包时生成latest.yml之类的元数据文件客户端启动时检查更新。不过更新方案会增加复杂度如果只是小范围分发手动发新安装包也够用。我的建议是第一版先跑通打包和安装把更新留到确实有需求时再加。过早引入更新机制反而会让打包配置变复杂增加出错概率。6.4 一个容易被忽略的细节图标Windows 应用的图标不只是好看的问题。任务栏、桌面快捷方式、安装向导、exe 文件本身用的都是不同尺寸的图标。electron-builder支持配置.ico文件建议准备一个包含多尺寸16x16 到 256x256的 ico 文件否则在某些场景下图标会模糊或者显示默认图标。这个细节很小但直接影响用户对软件专业度的第一印象。另外安装向导的图标和 exe 的图标是分开配置的nsis配置里有installerIcon和uninstallerIconwin配置里有icon。这几个都配上整个交付物看起来才完整。7. 关于这条链路的一点个人体会走完这一整套流程你会发现真正花时间的不是写代码而是配置和排查。Cocos Creator 负责把内容做出来Electron 负责把它装进桌面容器electron-builder 和 NSIS 负责把它变成用户能双击安装的东西。每一层都有自己的一套规则层与层之间的衔接就是坑最多的地方。我的经验是把每一层单独验证通过再做集成。Web 产物先在浏览器里跑通Electron 壳先加载一个最简单的 HTML 跑通再换成真实产物最后再打包。这样出问题时你能快速定位是哪一层的锅。反过来如果一上来就全链路一起跑出了问题只能靠猜效率极低。还有一点构建配置一定要用版本控制管起来。electron-builder的配置项多且相互影响改一个可能影响另一个。用 Git 管理每次改动都能回溯出问题能快速回滚。这个习惯在多人协作时尤其重要否则别人改了一个配置你这边打包就挂了还找不到原因。最后别怕打包出来的东西大。Electron 的体积是它的固有特性与其纠结能不能再小几十兆不如把精力放在启动速度和稳定性上。用户能接受一个稍大但启动快、不崩溃的软件接受不了一个小巧但动不动白屏的东西。这个取舍做过交付的人都懂。