
在当今的开发环境中,拥有一个响应式的网站(Web App)只是第一步。为了提供更深度的用户体验(如推送通知、离线使用、应用商店分发),将其打包为移动端 App 是许多 SaaS 产品的必经之路。
在众多方案中,Capacitor 脱颖而出。它不同于 React Native(需要重写 UI 逻辑),也不同于传统的 Cordova(性能较差且配置复杂)。
对现有项目零侵入:你可以继续使用 React, Vue 或 Next.js。
原生性能:提供高效的 JS-Native 桥接,访问底层 API 速度极快。
兼容 PWA:一套逻辑同时适配 iOS、Android 和 Web 环境。
将 Web 工程打包为 App 的过程可以概括为以下链路:
静态化 (Export):将动态的 Web 框架编译为纯 HTML/CSS/JS 静态文件。
桥接 (Bridge):Capacitor 创建一个原生的 WebView 容器来承载这些静态文件。
原生集成 (Native Integration):通过插件调用手机硬件(摄像头、通知等)。
编译 (Build):使用 Xcode 或 Android Studio 编译成最终的安装包(.ipa / .apk)。
由于 App 运行在文件系统中,没有传统的 Node.js 服务器环境,因此必须启用 静态导出 (SSG)。
修改 next.config.js:
JavaScript
const nextConfig = {
output: 'export', // 导出静态 HTML
images: { unoptimized: true }, // App 无法远程处理 Next.js 动态图
trailingSlash: true, // 确保路由路径在文件系统中正常工作
};
执行构建: npm run build。此时会生成一个 out 文件夹,这就是 App 的核心。
在项目根目录安装并初始化:
Bash
# 安装依赖
npm install @capacitor/core @capacitor/cli
# 初始化配置 (设置 App 名称和 ID)
npx cap init
# 添加原生平台支持
npm install @capacitor/ios @capacitor/android
npx cap add ios
npx cap add android
每当你修改了 Web 代码后,需要同步到原生工程中:
Bash
# 1. 编译 Web 项目
npm run build
# 2. 将代码拷贝到 iOS/Android 工程
npx cap copy
# 3. 打开原生 IDE 进行调试或打包
npx cap open ios
npx cap open android
这是 Web 搬迁到 App 最容易报错的地方。App 的请求源(Origin)通常是 capacitor://localhost(iOS) 或 http://localhost (Android)。
解决:后端 API 必须在 CORS 白名单中允许上述两个 Origin。
建议:使用 Capacitor Storage 代替 localStorage,因为原生系统可能会在磁盘空间不足时清理 Web 缓存。
手机的“刘海”和“底部横条”会遮挡 UI。
CSS 方案:
CSS
body {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
}
如果你想在 App 里调用相机,不再使用 <input type="file">,而是使用插件:
JavaScript
import { Camera, CameraResultType } from '@capacitor/camera';
const takePhoto = async () => {
const image = await Camera.getPhoto({
quality: 90,
resultType: CameraResultType.Uri
});
};
将 Web 工程打包为 App 是一个成本极低、收益极高的方案,尤其适合验证市场需求的 SaaS 产品。
如果你的逻辑较重:建议采用 SSG 全静态导出,体验最顺滑。
如果你追求极致敏捷:可以考虑使用 Live Updates 技术,绕过应用商店繁琐的审核,直接热更新你的 JS 代码。
Comments (0)