Chapter 10

打包发布

掌握 H5、小程序、App 全平台打包流程,性能优化清单与各平台上架完整指南

10.1 发布前的准备工作

在正式打包发布前,需要完成一系列检查和准备,避免因遗漏导致审核失败或用户体验问题:

通用检查清单

环境变量配置

# .env.production — 生产环境配置
VITE_API_BASE_URL=https://api.example.com
VITE_APP_NAME=我的应用

# .env.development — 开发环境配置
VITE_API_BASE_URL=http://localhost:3000
VITE_APP_NAME=我的应用(开发版)
// vite.config.ts — 生产环境自动删除 console
export default defineConfig(({ mode }) => ({
  plugins: [uni()],
  esbuild: {
    drop: mode === 'production' ? ['console', 'debugger'] : []
  }
}))

10.2 H5 打包与部署

构建 H5

# HBuilderX:发行 → 网站 PC Web 或手机 H5
# 命令行方式:
npm run build:h5

# 产物位置:dist/build/h5/

路由模式配置

// manifest.json
{
  "h5": {
    "router": {
      "mode": "history"  // 推荐 history 模式,URL 更美观
      // hash 模式:URL 带 #,不需要服务端配置,但不利于 SEO
    }
  }
}

Nginx 部署配置

# /etc/nginx/sites-available/myapp.conf
server {
  listen 80;
  server_name example.com;

  root /var/www/h5;
  index index.html;

  # H5 history 模式:所有路由指向 index.html
  location / {
    try_files $uri $uri/ /index.html;
  }

  # 静态资源长缓存
  location ~* \.(js|css|png|jpg|gif|svg|woff2?)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
  }

  # gzip 压缩
  gzip on;
  gzip_types text/html text/css application/javascript;
  gzip_min_length 1024;
}

10.3 微信小程序打包与发布

构建小程序

# 命令行
npm run build:mp-weixin

# 产物位置:dist/build/mp-weixin/
# 用微信开发者工具打开此目录进行预览和上传

发布流程

  1. 在微信开发者工具中打开 dist/build/mp-weixin/ 目录
  2. 点击"上传",填写版本号和版本描述
  3. 在微信公众平台(mp.weixin.qq.com)的"版本管理"中提交审核
  4. 审核通过后,在版本管理页面点击"发布"
  5. 发布后约 30 分钟用户可以看到新版本

小程序体积优化

分包加载(subPackages)
将非首屏页面放入子包,主包体积控制在 2MB 以内。子包可以按功能模块划分(如订单子包、设置子包)。
分包预加载
在 pages.json 配置 preloadRule,进入首页时自动预加载常用子包,减少用户等待时间。
图片压缩
小程序内的静态图片(放在 static 目录)压缩到最小,尽量使用 CDN 图片而非本地图片。
代码分割
避免在入口文件引入体积大的库,使用动态 import 按需加载。

10.4 App 打包

App 打包有两种方式:HBuilderX 云打包(推荐,无需配置本地环境)和本地离线打包(高级定制需求)。

云打包流程

  1. 在 HBuilderX 中:发行 → 原生 App 云打包
  2. 选择 Android、iOS 或两者同时打包
  3. 配置打包证书(Android 的 keystore,iOS 的 p12 + mobileprovision)
  4. 点击打包,等待云端构建(通常 5-15 分钟)
  5. 下载 APK(Android)或 IPA(iOS)文件

Android 证书生成

# 生成 Android 签名证书(keystore)
keytool -genkey -alias myapp \
  -keyalg RSA \
  -keystore myapp.keystore \
  -validity 36500 \
  -keysize 2048

# 查看证书信息(获取 SHA1,用于微信登录等第三方 SDK 配置)
keytool -list -v -keystore myapp.keystore
证书安全警告

Android 签名证书(keystore 文件和密码)一旦丢失,将无法更新应用(应用商店会拒绝不同证书的同包名应用)。必须将证书文件备份到安全位置(加密云盘、U 盘等),绝对不能上传到 Git 仓库。

iOS 证书配置

iOS 打包需要苹果开发者账号(99 美元/年),并在 Apple Developer Portal 创建:

10.5 各平台上架指南

Google Play 上架

  1. 注册 Google Play 开发者账号(一次性费用 25 美元)
  2. 在 Google Play Console 创建应用,填写应用信息、截图、隐私政策
  3. 上传 AAB 文件(推荐)或 APK 文件
  4. 配置分级和国家/地区
  5. 提交审核(通常 1-3 个工作日)

苹果 App Store 上架

  1. 在 App Store Connect 创建 App 记录,填写元数据
  2. 通过 Xcode 或 Transporter 上传 IPA
  3. 配置定价、国家/地区
  4. 提交审核(通常 1-3 个工作日,但可能更长)
  5. 注意 Apple 审核指南,常见拒绝原因:缺少功能演示、隐私政策不完整、崩溃

各大安卓应用市场(国内)

市场开发者注册审核周期备注
华为应用市场免费1-3 天国内 Android 最大份额
小米应用商店免费1-5 天小米/Redmi 设备预装
OPPO 应用商店免费2-5 天OPPO/OnePlus/Realme
vivo 应用商店免费2-5 天需提供软著(软件著作权)
应用宝(腾讯)免费2-7 天覆盖微信用户
国内上架必备:软件著作权

在国内主流应用市场(尤其是 vivo、某些华为类目)上架,通常需要提供软件著作权登记证书。软著申请需要 1-3 个月,建议提前准备。费用约 100-300 元(找代理机构),自行申请免费但较繁琐。

10.6 性能优化清单

启动性能优化

减少主包体积
将非首屏页面移入子包,首屏不使用的组件延迟加载。主包目标控制在 1MB 以内。
首屏数据预加载
利用 preloadRule 在网络空闲时预加载数据和子包,用户进入时直接展示内容。
减少同步 API 调用
onLaunch 中避免大量同步 Storage 操作,改为异步或延迟执行。
骨架屏(Skeleton)
数据加载期间展示骨架屏,避免白屏,提升用户感知性能。

渲染性能优化

<!-- 长列表:使用虚拟滚动代替全量渲染 -->

<!-- 方案一:小程序使用 recycle-view(微信官方)-->
<recycle-view
  batch="{{batchSize}}"
  id="recycleId"
>
  <recycle-item wx:for="{{items}}" >
    <view>{{ item.name }}</view>
  </recycle-item>
</recycle-view>

<!-- 方案二:App 端(uni-app x)使用 list-view -->
<list-view
  :data-source="items"
  estimated-item-size="100"
>
  <template #item="{ item }">
    <list-item-view :data="item" />
  </template>
</list-view>

网络性能优化

// 1. 接口合并:减少请求次数
// 将首页的多个独立接口合并为一个接口,一次返回所有数据
const homeData = await http.get('/api/home')
// homeData 包含 banners、categories、hotProducts、flashSale 等

// 2. 图片懒加载
<image :src="item.cover" lazy-load />

// 3. 图片 CDN 格式转换(WebP 比 JPG 小 30%)
function toWebP(url: string, width: number): string {
  // 假设使用阿里云 OSS 的图片处理
  return `${url}?x-oss-process=image/format,webp/resize,w_${width}`
}

// 4. 预请求(在前一页提前发起下一页的请求)
// 用户在列表页点击商品时,提前请求详情页数据
function onHoverCard(productId: number) {
  // 预加载详情数据
  http.get(`/api/products/${productId}`).then(data => {
    // 存入缓存,详情页打开时直接取用
    storage.set(`product_${productId}`, data, 30000)
  })
}

10.7 条件编译最佳实践总结

经过 10 章的学习,以下是条件编译的最终最佳实践:

// ✅ 推荐:将平台差异封装在独立的 composable 或工具函数中
// composables/useShare.ts
export function useShare() {
  function shareProduct(product: Product) {
    // #ifdef APP
    uni.share({
      provider: 'weixin',
      type: 0,
      href: `https://example.com/p/${product.id}`,
      title: product.name
    })
    // #endif

    // #ifdef H5
    navigator.clipboard.writeText(`https://example.com/p/${product.id}`)
    uni.showToast({ title: '链接已复制' })
    // #endif

    // #ifdef MP-WEIXIN
    // 小程序靠 onShareAppMessage 处理,这里可以触发页面内的分享面板
    uni.showToast({ title: '点击右上角分享', icon: 'none' })
    // #endif
  }

  return { shareProduct }
}

// ❌ 不推荐:在每个页面组件中重复写条件编译逻辑

10.8 持续集成(CI/CD)集成

# .github/workflows/uniapp-build.yml
name: UniApp Build

on:
  push:
    branches: [ main ]

jobs:
  build-h5:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm install
      - run: npm run build:h5
      - name: Deploy to OSS
        uses: fangbinwei/aliyun-oss-website-action@v1
        with:
          accessKeyId: ${{ secrets.OSS_KEY_ID }}
          accessKeySecret: ${{ secrets.OSS_KEY_SECRET }}
          bucket: my-app-h5
          endpoint: oss-cn-hangzhou.aliyuncs.com
          folder: dist/build/h5

10.9 发布后监控

uni-statistics 2.0
DCloud 官方统计平台,内置于 uni-app,无需代码接入,自动统计 PV/UV、页面访问、设备分布等。在 manifest.json 中开启 "uniStatistics": { "enable": true }
错误监控
推荐接入 Sentry 或友盟错误监控,及时发现和修复生产环境中的 JS 错误和崩溃。
性能监控
微信小程序可使用「小程序助手」查看启动耗时、API 耗时等性能数据。App 端使用 uni-app 官方性能分析工具。
热更新
H5 端直接更新服务器文件即可。小程序审核发布后约 30 分钟生效。App 端可使用 uni-app 的 wgt 热更新(仅更新 JS/CSS/图片,无需重新上架)。

10.10 全教程总结

恭喜你完成了 uni-app 跨端开发的全部 10 章学习!回顾一下我们覆盖的核心知识:

学习路径回顾

  1. 生态认知:uni-app vs uni-app x,UTS 语言原理,环境搭建
  2. 项目配置:pages.json 路由,manifest.json 多端配置,条件编译
  3. 组件体系:内置组件,easycom 自动引入,列表渲染
  4. 样式系统:rpx 单位,Flexbox 布局,nvue/uvue 限制
  5. 路由导航:5 种跳转 API,页面栈管理,路由拦截
  6. 状态管理:Pinia,事件总线,持久化存储
  7. 网络数据:请求封装,拦截器,uniCloud 云开发
  8. 原生能力:位置、相机、推送,插件市场
  9. UTS 原生扩展:Android/iOS 原生 API,UTS 插件开发
  10. 打包发布:三端打包,性能优化,上架流程
下一步建议

完成基础学习后,建议:① 用 uni-app 独立完成一个完整的电商或工具类 App;② 深入研究 uni-app x 的 UTS 插件开发;③ 参与 DCloud 官方社区(ask.dcloud.net.cn)解答问题,加深理解;④ 关注 uni-app 官方文档(uniapp.dcloud.net.cn)的更新日志,紧跟框架演进。