执行 npm run build:h5 不生成 dist/h5 是因 package.json 缺失对应脚本或插件版本过低;需配置 "build:h5": "cross-env node_env=production uni_platform=h5 vue-cli-service uni-build" 并升级 @dcloudio/vue-cli-plugin-uni。

uni-app 编译 H5 时 npm run build:h5 不生成 dist/h5 目录?
多数人卡在这一步:执行命令后没输出,或报错找不到脚本。根本原因是项目未正确初始化 H5 构建能力——uni-app 的构建脚本不是默认全平台启用的。
-
package.json中必须存在"build:h5"脚本,标准写法是:"build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build" - 如果用的是
@dcloudio/vue-cli-plugin-uni低版本(如 2.0.0-α 之前),可能不带uni-build命令,需升级插件:npm install @dcloudio/vue-cli-plugin-uni@latest - 别用
npm run serve:h5混淆——它只起本地服务,不产出静态文件;build:h5才真正打包
H5 输出的 dist/h5 部署到 Nginx 报 404 或白屏?
这不是路径问题,而是路由模式和服务器配置双重作用的结果。uni-app 默认用 hash 模式,但很多人误配成 history 模式又没配服务器重写。
- 检查
vue.config.js是否写了router: { mode: 'history' };如果写了,Nginx 必须加try_files $uri $uri/ /index.html;,否则子路由刷新就 404 - 若不想改服务器,直接删掉
router.mode配置,保持默认hash模式(URL 带#),部署即可用,无重写要求 - 确保
public/index.html中的base路径正确:上线到子目录(如https://a.com/myapp/)时,vue.config.js需设publicPath: '/myapp/',否则资源 404
为什么 H5 版本点击跳转没反应、uni.navigateTo 失效?
这是运行时环境判断出错导致的典型表现——uni-app 在 H5 平台会把 uni.navigateTo 映射为 window.location.href 或 router.push,但前提是你没在非 Vue 组件里乱调用,也没手动覆盖了路由实例。
- 只在
.vue文件的setup()或methods中调用uni.navigateTo;在普通 JS 工具函数里直接调会报Cannot read property 'push' of undefined - 确认
main.js中是否漏了Vue.use(VueRouter)(旧版 Vue 2 + vue-router 3)或createApp(App).use(router)(Vue 3) - H5 下
uni.switchTab只对tabBar页面生效,且必须在pages.json的tabBar.list里声明过,否则静默失败
上线前必须检查的三个 H5 兼容性坑
uni-app 生成的 H5 本质是 Vue 应用,但编译层做了抽象,很多底层差异会被掩盖,直到上线才暴露。
-
uni.getSystemInfoSync()在 iOS 微信内置浏览器返回的platform是devtools而非ios,判断系统类型别只看这个字段,建议结合navigator.userAgent - 真机调试时能用
uni.chooseImage,但部署后 Chrome 80+ 会拦截非 HTTPS 站点的摄像头/相册访问——H5 必须走 HTTPS,否则媒体 API 直接被禁用 - 某些安卓 WebView(尤其国内定制版)不支持
Promise.finally,uni-app 默认不 polyfill,需在main.js开头加import 'core-js/stable/promise/finally';










