Codex项目打包为PWA需三步:一、在public/下创建含规范icons和绝对路径的manifest.json;二、放置sw.js并手动注入注册脚本到index.html;三、用codex serve加--static与--mime-types参数启动服务,确保响应头Content-Type正确,最后通过Chrome Application面板验证并安装。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

将Codex项目打包为可安装的PWA应用,不是简单改个图标或加个manifest就完事——它要求你显式声明离线资源范围、注册Service Worker并完成可信上下文校验,否则用户点击“添加到主屏幕”后仍会打开普通网页标签页。
准备PWA必备三要素
进入Codex项目根目录,确认已有 public/ 子目录;若无,请新建。所有静态资源(HTML、CSS、JS、图标)必须放在 public/ 下,否则后续缓存策略无法命中。
在 public/ 目录下创建 manifest.json 文件,内容至少包含 name、short_name、start_url、display、icons 字段;其中 icons 数组必须含至少一个 192×192 和一个 512×512 PNG 图标,路径需以 / 开头(如 "/icons/icon-192.png"),否则 Chrome 会拒绝安装提示。
在 public/ 目录下创建 sw.js 文件,这是 Service Worker 脚本;它不能放在 src/ 或其他非 public 目录,否则注册时浏览器报错 "Failed to register a ServiceWorker: The script has an unsupported MIME type ('text/html')"。
注入Service Worker注册逻辑
打开 public/index.html,在 </body> 标签前插入以下脚本块:
<script>if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/sw.js').then(reg => console.log('SW registered:', reg.scope)).catch(err => console.error('SW registration failed:', err)); }); }</script>
这一步必须手动写进 index.html,不能靠构建工具自动注入;Vite 或 Next.js 的 sw 插件在 Codex CLI 启动的 dev server 下默认不生效,硬套会静默失败。
通过 Codex CLI 生成图片,支持尺寸控制和批量模式。依赖:codex (npm)。代理默认启用。用 generate.sh 生成单张,batch_generate.sh 批量生成游戏 UI 素材,gen_size.sh 指定尺寸。所有输出保存至 ~/.codex/generated_images/。
确保 index.html 的 <head> 中已包含 <link rel="manifest" href="/manifest.json">,且 href 值是绝对路径;相对路径如 "manifest.json" 在 Codex 的本地 HTTP server 下会被解析为 http://localhost:3000/manifest.json → 404。
配置Codex服务端支持PWA头部
启动 Codex 本地服务时,需强制启用静态文件托管与 MIME 类型校验:执行 codex serve --static public --mime-types json=application/manifest+json,js=application/javascript。
如果不加 --mime-types 参数,manifest.json 会被返回为 text/plain,Chrome 拒绝解析;sw.js 若被误判为 text/html,注册直接抛异常且控制台只显示“registration failed”,不提示具体原因。
验证是否生效:打开 http://localhost:3000/manifest.json,响应头中必须含 Content-Type: application/manifest+json;访问 http://localhost:3000/sw.js,Content-Type 必须为 application/javascript。
触发安装提示并完成安装
第一步:用 Chrome 或 Edge 浏览器访问 http://localhost:3000,F12 打开 Application 面板 → Manifest 标签页,确认显示“已加载清单”,且图标预览正常;若显示“清单未找到”,检查 manifest.json 路径和响应头。
第二步:切换到 Application → Service Workers 标签页,确认 sw.js 显示“Activated and is running”,右侧有“Update on reload”勾选;若状态为 “Waiting” 或 “Redundant”,点击右上角“Skip waiting”按钮。
第三步:刷新页面,待地址栏右侧出现 【+ 添加】 图标,点击它 → 弹出安装弹窗 → 点击“安装”;此时系统会创建独立窗口应用,进程名显示为 manifest.json 中的 name 值,而非“Chrome”。

















