微信小程序如何进行分包处理?

目录

分包是什么?

为什么要分包?

分包前后结构对比

具体操作步骤

第 1 步:规划分包结构

第 2 步:修改 app.json 进行配置

第 3 步:创建分包目录并移动文件

第 4 步:处理组件和工具函数的引用

第 5 步:重新编译并测试

进阶概念:独立分包

注意事项

已通过效果:


分包是什么?

一说到这个其实好多人就想骂了,先附上几张图(不忍直视):

小程序分包是指将完整的小程序项目划分成一个主包多个分包

  • 主包:包含小程序启动所需的核心页面(如首页、TabBar 页面)和所有分包都会用到的公共代码/资源

  • 分包:包含某些特定功能下的页面、组件、代码和资源。用户在使用到这些功能时才会下载对应的分包。

为什么要分包?

  1. 突破体积限制:小程序单个包体积限制为 2MB。使用分包后,整个小程序所有分包的总体积上限可提升至 20MB(微信小程序目前标准)。(目前一个包超过1.5mb就会提示了)

  2. 优化启动速度小程序启动时只需下载主包(通常很小),用户点击进入某个分包页面时,才去下载对应的分包代码。这大大降低了首屏加载时间。

  3. 按需加载:只有用户真正访问到某个功能时,才加载对应的代码,节省了用户流量和空间。


分包前后结构对比

举例一个电商小程序,结构如下:

(看完下面这个,我敢说基本上都能懂了,是不是简简单单?哈哈)

分包前(所有内容都在主包):

project-root/
├── app.js
├── app.json
├── app.wxss
├── pages/
│   ├── index/           # 首页 (TabBar)
│   ├── logs/            # 日志页 (TabBar)
│   ├── category/        # 分类页
│   ├── product/         # 商品详情页
│   └── profile/         # 个人中心页
├── components/
│   ├── header/          # 公共头部组件
│   └── toast/           # 公共弹窗组件
└── utils/
    └── request.js       # 公共网络请求库

分包后(按功能拆分):

project-root/
├── app.js
├── app.json
├── app.wxss
├── pages/               # 【主包】主要页面
│   ├── index/           # 首页 (TabBar,必须放主包)
│   ├── logs/            # 日志页 (TabBar,必须放主包)
│   └── profile/         # 个人中心页
├── components/          # 【主包】公共组件
│   ├── header/
│   └── toast/
├── utils/               # 【主包】公共工具库
│   └── request.js

├── packageA/            # 【分包A】商品模块
│   ├── packageA.json    # 分包A的配置文件
│   ├── pages/
│   │   ├── category/    # 分类页
│   │   └── product/     # 商品详情页
│   └── components/      # 分包A专用的组件
│       └── product-card/

└── packageB/            # 【分包B】未来可能扩展的模块
    ├── packageB.json
    └── pages/
        └── cart/        # 购物车页

具体操作步骤

第 1 步:规划分包结构

确定哪些页面是启动就必须的(放主包),哪些功能可以独立成模块(放分包)。TabBar 页面必须在主包

第 2 步:修改 app.json 进行配置

在 app.json 中新增 subpackages 或 subPackages(两者均可)字段来声明分包

// app.json
{
  "pages": [
    "pages/index/index",
    "pages/logs/logs",
    "pages/profile/profile" // 主包页面
  ],
  "subPackages": [
    {
      "root": "packageA", // 分包的根目录名
      "name": "shop", // 分包的别名,用于分包异步化时引用,可省略
      "pages": [ // 分包内的页面路径,相对于 root 根目录
        "pages/category/category",
        "pages/product/product"
      ],
      "independent": false // 是否为独立分包(默认为 false)
    },
    {
      "root": "packageB",
      "pages": [
        "pages/cart/cart"
      ]
    }
  ],
  "tabBar": {
    "list": [
      {
        "pagePath": "pages/index/index" // TabBar 页面必须在主包
      },
      {
        "pagePath": "pages/logs/logs" // TabBar 页面必须在主包
      }
    ]
  },
  // ... 其他 window 等配置
}
第 3 步:创建分包目录并移动文件

根据你在 app.json 中的配置,在项目根目录创建分包文件夹(如 packageA),然后将对应的页面、组件、资源文件移动到这个文件夹下。

重要: 移动文件后,一定要修改 app.json 中对应的路径。原来在主包 pages 里声明的分包页面路径要删除

第 4 步:处理组件和工具函数的引用
  • 公共组件/工具(如 utils/request.js:继续放在主包,所有分包都可以直接 require 或 import

  • 分包内私有组件/工具:放在分包目录下,只能被该分包内的页面引用。

第 5 步:重新编译并测试

在微信开发者工具中点击编译,检查是否有路径错误。然后通过右上角的“编译模式”,选择“添加编译模式”,单独测试每一个分包页面,确保能正常加载和显示

进阶概念:独立分包

独立分包是分包的一种特殊类型,可以独立于主包运行,不需要下载主包

  • 特点:通常用于某些广告页、活动页等上下文独立性极强的页面。用户从独立分包页面进入小程序时,不需要下载主包,速度极快。

  • 限制独立分包不能引用主包内的任何文件(公共组件、工具库都不行)。

  • 配置将 independent 属性设为 true

// app.json
{
  "subPackages": [
    {
      "root": "independentModule",
      "pages": ["pages/promotion/promotion"],
      "independent": true // 声明为独立分包
    }
  ]
}

注意事项

  1. TabBar 页面必须放在主包中,不能在分包中定义

  2. 公共代码:所有分包都会用到的 JS 库、自定义组件、样式等,尽量放在主包中。

  3. 主包体积:要时刻关注主包的大小(开发者工具详情页可查看),因为它直接影响启动速度。主包最好控制在 1.5MB 以内,预留一些空间。

  4. 分包之间的跳转

    • 跳转到分包页面:wx.navigateTo({ url: '/packageA/pages/category/category' })

    • url 路径必须以分包根目录 root 开头

  5. 引用原则

    • 分包可以引用自己包内的组件和工具。

    • 分包可以引用主包内的组件和工具。

    • 分包不能引用其他分包内的文件

    • 主包不能引用分包内的文件

  6. 分包预加载:可以使用 preloadRule 配置在进入主包某个页面时,静默预加载可能即将用到的分包,提升后续跳转流畅度。

    // app.json
    "preloadRule": {
      "pages/index/index": { // 当用户从首页启动时
        "network": "all", // 在任意网络下都预加载
        "packages": ["packageA"] // 预加载 packageA 分包
      }
    }

    已通过效果:

微信小程序分包处理可以有效优化加载性能,将代码拆分为主包和多个子包,按需加载。以下是详细实现步骤和关键注意事项: --- ### **一、分包配置步骤** #### 1. 修改 `app.json` 配置 在 `app.json` 中通过 `subPackages` 字段声明分包结构: ```json { "pages": [ "pages/index/index", // 主包页面 "pages/logs/logs" ], "subPackages": [ { "root": "subpkgA", // 子包根目录 "pages": [ "pages/detail/detail", // 子包页面路径 "pages/list/list" ] }, { "root": "subpkgB", "pages": [ "pages/profile/profile" ] } ], "window": {...} } ``` #### 2. 项目目录结构 ``` ├── app.js ├── app.json ├── app.wxss ├── pages/ # 主包页面 │ └── index/ ├── subpkgA/ # 子包A │ ├── pages/ │ │ └── detail/ │ └── utils/ # 子包私有资源 └── subpkgB/ # 子包B └── pages/ └── profile/ ``` --- ### **二、关键规则** 1. **主包大小限制**: - 主包(包括所有主包页面和公共资源)不能超过 **2MB**。 - 单个子包不能超过 **2MB**,但建议每个子包控制在 **500KB 以内**。 2. **资源隔离**: - 子包的 `js`、`wxml`、`wxss`、`json` 文件必须放在子包目录下。 - 子包可以引用 **自身目录内** 的静态资源(如图片),但引用主包资源需通过绝对路径(如 `/images/logo.png`)。 3. **分包加载时机**: - 默认首次启动时加载主包,访问子包页面时动态加载对应子包。 - 可通过 `preloadRule` 预加载子包(见下文优化技巧)。 --- ### **三、分包优化技巧** #### 1. 预加载子包 在 `app.json` 中配置 `preloadRule`,根据路由规则提前加载子包: ```json { "subPackages": [...], "preloadRule": { "pages/index/index": { // 从主包页面触发 "network": "all", // 预加载网络条件(wifi/all) "packages": ["subpkgA"] // 预加载的子包 } } } ``` #### 2. 独立分包(特殊场景) 独立分包可脱离主包独立运行(适合启动页、引导页): ```json { "subPackages": [ { "root": "standalone", "pages": ["pages/splash/splash"], "independent": true // 声明为独立分包 } ] } ``` - **限制**:独立分包不能引用主包内代码,但可引用其他子包。 #### 3. 公共模块提取 将公共工具库(如 `utils`)放在主包或通过 `npm` 安装,避免重复打包: ```javascript // 主包 utils/request.js export const request = (url) => {...}; // 子包页面中引用 import { request } from '../../utils/request'; ``` --- ### **四、常见问题解决** #### 1. **子包页面无法引用主包组件** - **错误示例**:子包页面引用主包的 `components/button`。 - **解决方案**: - 将组件复制到子包目录,或通过 `usingComponents` 全局注册(主包 `app.json` 中声明)。 #### 2. **分包后样式冲突** - **原因**:子包和主包的 `wxss` 选择器优先级相同。 - **解决方案**: - 使用 **BEM 命名规范**(如 `subpkgA-btn`)。 - 通过 `/* #ifdef MP-WEIXIN */` 条件编译隔离样式。 #### 3. **分包大小超限** - **检查工具**: - 开发者工具 → 详情 → 本地设置 → 勾选「上传时压缩代码」。 - 使用 `webpack` 或 `gulp` 进一步压缩代码。 --- ### **五、完整示例** #### 1. 主包 `app.json` ```json { "pages": ["pages/index/index"], "subPackages": [ { "root": "features", "pages": ["order/list", "user/profile"] } ], "preloadRule": { "pages/index/index": { "packages": ["features"] } } } ``` #### 2. 子包页面跳转 ```javascript // 主包页面跳转到子包页面 wx.navigateTo({ url: '/features/order/list' // 必须以子包root开头 }); ``` --- ### **六、性能监控** 1. **分包加载时间**: - 在 `App.onLaunch` 中监听 `onAppRoute` 事件: ```javascript App({ onLaunch() { wx.onAppRoute((res) => { console.log('当前路由:', res.path); }); } }); ``` 2. **工具分析**: - 使用微信开发者工具的 **Audits** 面板检查分包效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

じòぴé南冸じょうげん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值