根本无法彻底消除白屏,但可压缩至用户几乎无感:关键在于确保onLaunch不阻塞、JS初始化不卡死、Vue实例及时挂载;常见原因包括未await异步调用、pages.json路径或style非法、manifest.json与publicPath配置错位、iOS WKWebView初始化延迟等。

根本去不掉白屏等待时间,但能把它压缩到用户几乎感知不到的程度——关键不是“去掉”,而是让 JS 初始化、资源加载、Vue 挂载这三步不卡死、不阻塞、不静默失败。
onLaunch 里漏 await 就会卡死主线程
这是最隐蔽也最普遍的白屏原因:JS 线程停在 onLaunch,Vue 实例压根没挂载,页面连 DOM 都没开始生成。
-
uni.getStorage({ key: 'token' })必须写成await uni.getStorage({ key: 'token' }),否则 Promise 被丢弃,后续逻辑跳过,控制台还不报错 -
uni.getSystemInfoSync()返回对象后,别直接访问res.model(iOS 16+ 已改用res.deviceModel),取不到就undefined,链式调用一崩到底 - 所有
uni.xxx异步方法(request、getNetworkType、checkIsSupportSoterAuthentication)在onLaunch中必须await - 真机调试时,在
onLaunch开头加console.log('onLaunch start'),如果这句都不输出,问题在更早阶段(比如main.jsimport 失败或 store 循环依赖)
pages.json 首页路径或 style 格式错一个字符就白屏
小程序和 App 端对 pages.json 容错率极低,错位、大小写、斜杠方向、空 style 都会导致路由系统初始化失败,且控制台静默无提示。
- 确认
"list"第一项的"path"真实存在,例如"pages/index/index"对应src/pages/index/index.vue,不能是Pages/Index/Index.vue(大小写敏感) -
"style"字段必须是合法 JSON 对象,禁止写成"style": ""或"style": {};至少写"style": {"navigationBarTitleText": "首页"} - H5 端可手动访问
/pages/index/index.html测试是否 404;App 端打包后白屏,优先检查该页面是否被构建进unpackage/dist/build/app-plus/ - 删掉
unpackage和node_modules,重装依赖再打包——HBuilderX 4.66.2025051912+ 有已知缓存 bug,旧基座残留会引发白屏
manifest.json 和 publicPath 配置错位导致资源全 404
开发时跑得通,打包后白屏?90% 是环境路径没切到生产模式,app-service.js 加载失败,WebView 不报错,只留白屏。
-
manifest.json中"app-plus"下的启动图路径必须是绝对路径,且文件真实存在于unpackage/dist/build/app-plus/static/,例如"image": "/static/splash.png" -
vue.config.js若存在,生产环境的publicPath必须设为'./';设成'/'或完整域名会导致 JS/CSS 加载 404 -
manifest.json的"h5"节点中,"router":{"base":"./"}必须存在,尤其部署到子目录时,否则路由跳转 404 - Android 推荐用
.9.png,iOS 必须用 Storyboard 启动图,两者路径、格式、适配方式完全不同,混用必白屏
iOS WKWebView 初始化延迟需兜底刷新
iOS 首次冷启动时,WKWebView 加载 JS 引擎比 Android 慢得多,常导致 Vue 尚未 ready 就开始 render,结果 DOM 空白。
- 在
App.vue的onLaunch中加兜底逻辑:if (uni.getSystemInfoSync().platform === 'ios') setTimeout(() => location.reload(), 800) - 首页组件必须极简:不
import大型图表库、不发多个并发请求、不加载未压缩的字体文件 - 避免在
onReady发起网络请求——此时页面虽已渲染,但数据还没来,视觉上仍是白屏;应提前到onLoad或onLaunch(带await)中处理
真正难处理的是那些不报错、不输出、不加载的“静默白屏”:它往往藏在 main.js 的 import 顺序、store 的循环依赖、或鸿蒙平台对 /static/ 路径的解析异常里——这些地方没有日志,只能靠删减法逐层排除。


















