收藏
评论

分包异步化,分包难题不用怕官方

原文来自「微信开发者」公众号。
本文主要介绍了“分包异步化”新能力的原理、组件、方法和兼容性要求。


在小程序开发过程中,你是否对分包问题感到困扰?

  • 多业务的分包难以划分
  • 分包体积膨胀
  • 下载并注入无用代码
  • 插件无法实现分包处理
  • ……

为解决上述问题,微信团队提供【分包异步化】新能力,实现跨分包组件、跨分包方法,成功解决分包难、分包不合理等问题。

• • 分包异步化原理 • •

原有的分包隔离机制导致各分包之间无法引用自定义组件或逻辑代码,因此导致分包难等一系列问题。分包异步化能力打通不同分包的引用关系,解决小程序代码包合理化的问题,支持跨分包组件、跨分包方法。


• • 跨分包组件 • •

当使用其他分包组件时,代码包需要增加占位组件 (component placeholder),实现页面高效配置。例如页面展示时,分包 (subpackageB) 仍未下载,进行以下操作实现跨分包组件:

1. 使用组件 <simple-list> 代替 <list>,使用 <view> 代替 <card>,完成页面渲染

2. 完成渲染后,开始下载和注入分包

3. 完成分包下载和注入后,将占位组件替换成真正的组件

// subPackageA/pages/index.json
{
  "usingComponents": {
    "button": "../../commonPackage/components/button",
    "list": "../../subPackageB/components/full-list",
    "simple-list": "../components/simple-list"
  },
  "componentPlaceholder": {
    "button": "view",
    "list": "simple-list"
  }
}


• • 跨分包方法 • •

在小程序开发过程中,通过require回调函数或requireAsync异步调用2种方法,分包异步化能够引用其他分包的逻辑代码。具体操作如下:

// subPackageA/index.js
// 使用回调函数风格的调用
require('../subPackageB/utils.js', utils => {
  console.log(utils.whoami) // Wechat MiniProgram
})
// 或者使用 Promise 风格的调用
require.async('../commonPackage/index.js').then(pkg => {
  pkg.getPackageName() // 'common'
})


• • 兼容性要求 • •

分包异步化能力要求基础库版本 2.17.3 及以上(正式发布需在 mp 设置最低版本基础库 2.17.3)。平台能力兼容安卓微信、iOS 微信、1.05.2104272 及以上版本的微信开发者工具。更低版本的基础库兼容工作预计在一个月后完成。


• • 总结 • •

实现分包异步化能力后,主包的「公有」性质被削弱,「前置」性质显得更重要(优先于所有分包注入运行且默认注入运行)。开发者可以根据自身业务诉求,结合分包异步化,进行小程序调优,实现更快的启动速度、按需下载和注入代码包、合理处理公有组件等效果。


如有其他小程序相关问题,可在 微信小程序交流专区 中发帖互动,将有技术专员为大家解答及进行深度交流。

最后一次编辑于  2022-03-24
赞 2
收藏

13 个评论

  • lsx
    lsx
    2022-10-21

    都什么时候了,2022年了,还用 require 那一套!

    es6规范 import() 是干什么的?

    2022-10-21
    赞同 6
    回复 1
    • MR.Z
      MR.Z
      2022-11-10
      感觉小程序原生比较推崇cjs规范
      2022-11-10
      回复
  • GP
    GP
    2023-09-10

    这篇文档写的 兼容性版本号 是2.17.3 ,另一篇文档是 2.11.2 ,辛苦官方技术人员及时核对并修正(https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/async.html

    

    2023-09-10
    赞同 2
    回复
  • Alex
    Alex
    2023-04-18

    跨分包组件支持引用分包中的插件组件吗?

    2023-04-18
    赞同 1
    回复 3
    • 阿树
      阿树
      2023-07-28
      支持的,我就把秋云echarts插件放在分包,其他分包异步化引入使用
      2023-07-28
      回复
    • 月明
      月明
      2023-08-08回复阿树
      我遇到了这个问题,能详细讲讲怎么解决的吗,我直接引用分包的插件,报错了
      2023-08-08
      回复
    • 花名
      花名
      星期四 16:48回复月明
      请问一下 解决了吗
      星期四 16:48
      回复
  • Chona
    Chona
    04-01

    加载的比较慢怎么办,其他原包都加载完了,引入的其他分包的组件就会比原包的要慢些

    04-01
    赞同
    回复
  • ···
    ···
    2023-08-17

    请问主包不引用分包pages,而引用分包js数据,如何处理呢?教程只讲了引用pages,没讲js文件呀?

    2023-08-17
    赞同
    回复
  • Doris
    Doris
    2023-02-22

    主包引入同一分包下的多个不同js ,第一引入成功后阻塞了之后的js引入

    问题:common能引入成功,hooks就引入不成功,

    调整代码执行顺序,hooks引入成功,common引入不成功

    let common
    require('../packageC/api/indexApi.js', mod => {
      common = mod
    }, ({ errMsg, mod }) => {
      console.error(`path: ${mod}, ${errMsg}`)
    })
    
    let hooks
    require('../packageC/hooks/index.js', mod => {
      hooks = mod
    }, ({ errMsg, mod }) => {
      console.error(`path: ${mod}, ${errMsg}`)
    })
    
    module.exports = {
      ...common,
      ...hooks,
    }
    
    2023-02-22
    赞同
    回复 1
    • 凉白开
      凉白开
      2023-12-18
      解决了吗
      2023-12-18
      回复
  • ninja
    ninja
    2022-11-10

    实在是老掉牙

    2022-11-10
    赞同
    回复
  • 小豬
    小豬
    2022-08-25

    一个tab的页面组件使用了异步分包的,但加载异步分包时超时timeout或者fail后 ,重新切换tab的时候怎么可以再次触发加载异步分包的组件呢???目前会出现一直空白的情况

    2022-08-25
    赞同
    回复
  • 吕士杰
    吕士杰
    2022-07-15

    如果项目中的SubA和SubB都采用分包异步化。其中SubA的分包需要引用SubB分包中的list组件。

    在SubA的.json文件内配置componentPlaceholder和usingComponents,等SubA页面渲染完成后回去下载SubB分包。

    目前不支持当SubA的list组件的wx:if 为true的时候,再去下载SubB分包。请问未来可以支持这个特性吗?

    2022-07-15
    赞同
    回复
  • Godfery
    Godfery
    2022-06-08

    好像配置这个不起作用

    2022-06-08
    赞同
    回复 1
    • 小小菜刀
      小小菜刀
      2022-10-20
      几个点检查下:
      1. 使用的基础库版本在2.17.3之上 
      2. 确保异步化引用的代码在其他的分包中
      3. 用开发者工具的“代码依赖分析”验证,异步化引用的代码不会打入调用处的分包
      另外,如果是同一分包的情况下也可使用componentPlaceholder进行“用时注入”,参考https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html
      2022-10-20
      回复

正在加载...

登录 后发表内容
课程标签