如果你的 Next APP 一直是纯静态导出,那么恭喜你,大功告成。运行此命令可将你的 Next App 编译为静态文件:
next export
接着将编译出的代码同步到 Capacitor:
npx cap sync
大功告成!
但如果你的 Next App 使用了混合构建模式(例如使用了服务端功能),你可能无法直接执行 next export。你需要将一些依赖服务器的逻辑移动到客户端处理。例如:
客户端使用 device API 获取 locale(而不是 Next 的 Locale API)
客户端使用 hook 获取数据(而不是从 getServerProps 等方法)
从客户端获取 Locale 的示例如下:
asyncfunctiongetDeviceLanguage(){let{ value }=awaitDevice.getLanguageCode();if(value ==="en"){ value ="en-US";}if(value ==="zh"){ value ="zh-CN";}return value;}functionMainApp({Component, pageProps }:AppProps){// The auto-detected locale from NextJS// If user has no preferred locale, use autoconst[preferredLocale, setPreferredLocale]=useState(pageProps.locale);useEffect(()=>{constreadLocaleConfig=async()=>{// https://en.wikipedia.org/wiki/IETF_language_taglet preferredSet =localStorage.getItem("locale");if(preferredSet){if(preferredSet ==="auto"&&!isWeb()){setPreferredLocale(awaitgetDeviceLanguage());}elseif(preferredSet !=="auto"){// If user has spicified the languagesetPreferredLocale(preferredSet);}}};readLocaleConfig();},[]);}
尽管 Capacitor 提供了检测运行平台的 API,但在 Next 静态导出的过程中,其API总是会检测为浏览器环境。
例如,有时候我们希望某些 React 组件仅在原生平台中出现,在导出时就需要告知 Next 我们是否在为原生平台打包。
为了在 Next 导出过程中检测指定打包平台,我们可以手动添加一个环境变量指定导出目标。方便起见,你可以在 package.json 中写入以下脚本:
"scripts":{"build":"next build","build:cap":"CAPACITOR_BUILD=true next build && CAPACITOR_BUILD=true next export && npx cap sync","dev:cap":"CAPACITOR_BUILD=true next",},