小程序分包(Taro分包案例)

本文深入探讨微信小程序分包加载方案,旨在解决2MB代码包限制带来的功能扩展难题。介绍了分包加载原理、如何配置独立分包及预下载机制,助力优化小程序启动速度。

为什么要使用小程序的“分包加载”方案

微信小程序限制了代码包不能超过 2MB,限制大小是对小程序启动速度的考虑,但是2MB 大小严重限制了小程序功能的扩展,业务需求可能需要更大的体积,综合考虑微信推出了“分包加载方案”

分包加载

某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。

在构建小程序分包项目时,构建会输出一个或多个分包。分包小程序必定含有一个主包,和多个分包。

主包:即放置默认启动页面/TabBar页面,以及一些所有分包都需用到公共资源/JS 脚本;

分包:则是根据开发者的配置进行划分。

分包原理:在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。

目前小程序分包大小有以下限制

整个小程序所有分包大小不超过 8M
单个分包/主包大小不能超过 2M
对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作

项目中使用分包

1、需要在Taro->app.jsx ,或者原生小程序的 app.json 的config配置中新增 subpackages字段声明项目分包结构
config: Config = {
//  tabBar路径+ 非分包路径
    pages: [   
      'pages/index/index',
      'pages/personal/index',
      "pages/pageC/index",
    ],
    window: {
      backgroundTextStyle: 'light',
      navigationBarBackgroundColor: '#fff',
      navigationBarTitleText: 'WeChat',
      navigationBarTextStyle: 'black'
    },
//  tabBar路径
    tabBar:{   
      "list": [{
        "pagePath": "pages/index/index",
        "text": "首页"
      }, {
        "pagePath": "pages/personal/index",
        "text": "个人中心"
      }]
    },
//  分包路径
    subPackages:[
      {
        "root": "pages/pageA/",
        "pages": [
          "index",
          "pageA1",
        ]
      }, {
        "root": "pages/pageB/",
        "pages": [
          "index",
          "pageB",
        ]
      }
    ]

  }


注意:subpackages字段中对应的分包配置项中定义independent字段声明对应分包为独立分包
2、未分包小程序、分包小程序项目目录结构对比
2.1、未分包小程序配置文件

未分包小程序配置文件.png

2.2、分包小程序项目配置文件

分包小程序项目配置.png

3、未分包小程序、分包小程序项目打包后项目分包目录对比
3.1、未分包小程序目录

未分包小程序目录.png

3.2、分包小程序分包后目录

分包小程序分包后目录.png

独立分包

独立分包属于分包的一种。普通分包的所有限制都对独立分包有效。独立分包中插件、自定义组件的处理方式同普通分包

1、独立分包中不能依赖主包和其他分包中的内容,包括js文件、模板、样式、自定义组件、插件等。主包中的样式对独立分包无效,应避免在独立分包页面中使用 公共 样式;

2、App 只能在主包内定义,独立分包中不能定义App,会造成无法预期的行为;

3、独立分包中暂时不支持使用插件。

分包预下载

开发者可以通过配置,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度。对于独立分包,也可以预下载主包。

分包预下载目前只支持通过配置方式使用,暂不支持通过调用API完成

小程序开发中,对 `node_modules` 进行分包优化是解决主包体积过大、提升加载性能的重要手段。由于小程序平台对主包大小有限制(如微信小程序主包最大为 2MB),因此合理地将部分依赖模块拆分到子包中可以有效缓解主包压力。 ### 分包机制概述 小程序分包机制允许开发者将代码和资源拆分为多个包,其中主包包含启动页面和核心逻辑,而子包则存放非核心功能模块或第三方库。对于 `node_modules` 中的依赖,如果某些模块仅在特定页面或功能中使用,可将其放入子包中以减少主包体积。 ### node_modules 分包策略 #### 1. **路径配置与依赖管理** 在进行 `node_modules` 分包时,首先需要确保依赖模块的引用路径正确。例如,在 Taro 框架中,可以通过 Webpack 配置将某些依赖单独打包到指定的分包中。以下是一个基于 Taro 的 Webpack 配置示例: ```javascript mini: { webpackChain(chain, webpack) { chain.merge({ optimization: { splitChunks: { cacheGroups: { moment: { name: 'moment', priority: 1000, test(module) { return /node_modules[\\/]moment/.test(module.context); } } } } } }); }, commonChunks: ['runtime', 'vendors', 'taro', 'common', 'moment'], } ``` 此配置将 `moment` 模块从主包中分离出来,单独打包为 `moment` 分包,适用于多个子包都需要使用的场景[^3]。 #### 2. **避免重复打包公共模块** 如果多个子包都引用了相同的模块(如 `lodash` 或 `axios`),这些模块会被默认打包到主包中。为了避免这种情况,建议将这些公共模块统一提取到一个独立的共享分包中,并通过配置告知小程序框架该分包的存在。这样可以避免重复打包,降低整体包体积。 #### 3. **异步加载非核心依赖** 对于一些非核心功能所需的依赖模块,可以在运行时按需加载。例如,在页面初始化时不立即加载相关模块,而是在用户触发某个操作后再动态引入。这种方式可以进一步延迟加载时间,提高首屏加载速度。 #### 4. **清理无用依赖** 除了分包之外,还可以结合代码清理工作,删除项目中未使用的依赖模块或字体图标库。例如,公司内部可能已有统一的字体图标库,但历史代码中仍保留了大量未使用的图标文件,清理后可显著减少 `node_modules` 体积[^3]。 ### 实际应用案例 在实际开发中,可以参考如下目录结构组织分包内容: ``` ├── app.js ├── app.json ├── app.wxss ├── packageA │ └── pages │ ├── cat │ └── dog ├── packageB │ └── pages │ ├── apple │ └── banana ├── pages │ ├── index │ └── logs └── utils ``` 在此结构下,`packageA` 和 `packageB` 可分别包含各自所需的 `node_modules` 子集,从而实现更细粒度的控制[^4]。 ### 注意事项 - **路径问题**:分包后,页面跳转路径、图片路径以及模板路径均需重新检查,确保引用正确。 - **版本一致性**:不同分包中若使用了相同依赖的不同版本,可能导致冲突,应尽量保持版本一致。 - **调试复杂性增加**:分包后,调试流程会变得更加复杂,建议使用工具辅助分析各分包内容。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值