当前位置:   article > 正文

小程序中使用分包

小程序分包异步化

de558b7ade2a53e5fbfb700bfdcf05c6.png

分包

支持分包的小程序目录结构如下:

  1. ├── app.js
  2. ├── app.json
  3. ├── app.wxss
  4. ├── packageA
  5. │ └── pages
  6. │ ├── cat
  7. │ └── dog
  8. ├── packageB
  9. │ └── pages
  10. │ ├── apple
  11. │ └── banana
  12. ├── pages
  13. │ ├── index
  14. │ └── logs
  15. └── utils

开发者通过在 app.json subpackages 字段声明项目分包结构:

  1. {
  2. "pages":[
  3. "pages/index",
  4. "pages/logs"
  5. ],
  6. "subpackages": [
  7. {
  8. "root": "packageA",
  9. "pages": [
  10. "pages/cat",
  11. "pages/dog"
  12. ]
  13. }, {
  14. "root": "packageB",
  15. "name": "pack2",
  16. "pages": [
  17. "pages/apple",
  18. "pages/banana"
  19. ]
  20. }
  21. ]
  22. }

引用原则

1.packageA 无法 require packageB JS 文件,但可以 require 主包、packageA 内的 JS 文件;使用 分包异步化 时不受此条限制2.packageA 无法 import packageB 的 template,但可以 require 主包、packageA 内的 template3.packageA 无法使用 packageB 的资源,但可以使用主包、packageA 内的资源

分包异步化能有效解决主包大小过度膨胀的问题。

分包异步化

「分包异步化」将小程序的分包从页面粒度细化到组件甚至文件粒度。这使得本来只能放在主包内页面的部分插件、组件和代码逻辑可以剥离到分包中,并在运行时异步加载,从而进一步降低启动所需的包大小和代码量。

e72b4b1dc8ccfb6c181483688d94f868.png

跨分包自定义组件引用

一个分包使用其他分包的自定义组件时,由于其他分包还未下载或注入,其他分包的组件处于不可用的状态。通过为其他分包的自定义组件设置 占位组件,我们可以先渲染占位组件作为替代,在分包下载完成后再进行替换。

例如:

  1. // subPackageA/pages/index.json
  2. {
  3. "usingComponents": {
  4. "button": "../../commonPackage/components/button",
  5. "list": "../../subPackageB/components/full-list",
  6. "simple-list": "../components/simple-list"
  7. },
  8. "componentPlaceholder": {
  9. "button": "view",
  10. "list": "simple-list"
  11. }
  12. }

在这个配置中,button 和 list 两个自定义组件是跨分包引用组件,其中 button 在渲染时会使用内置组件 view 作为替代,list 会使用当前分包内的自定义组件 simple-list 作为替代进行渲染;在这两个分包下载完成后,占位组件就会被替换为对应的跨分包组件。

跨分包 JS 代码引用

一个分包中的代码引用其它分包的代码时,为了不让下载阻塞代码运行,我们需要异步获取引用的结果。

如:

  1. // subPackageA/index.js
  2. // 使用回调函数风格的调用
  3. require('../subPackageB/utils.js', utils => {
  4. console.log(utils.whoami) // Wechat MiniProgram
  5. }, ({mod, errMsg}) => {
  6. console.error(`path: ${mod}, ${errMsg}`)
  7. })
  8. // 或者使用 Promise 风格的调用
  9. require.async('../commonPackage/index.js').then(pkg => {
  10. pkg.getPackageName() // 'common'
  11. }).catch(({mod, errMsg}) => {
  12. console.error(`path: ${mod}, ${errMsg}`)
  13. })

独立分包

独立分包是小程序中一种特殊类型的分包,可以独立于主包和其他分包运行。从独立分包中页面进入小程序时,不需要下载主包。当用户进入普通分包或主包内页面时,主包才会被下载。

开发者可以按需将某些具有一定功能独立性的页面配置到独立分包中。当小程序从普通的分包页面启动时,需要首先下载主包;而独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度。

fabc6b774853dd6767cfb04d36452a8e.jpeg

一个小程序中可以有多个独立分包。

开发者通过在app.json的subpackages字段中对应的分包配置项中定义independent字段声明对应分包为独立分包。

  1. {
  2. "pages":[
  3. "pages/index",
  4. "pages/logs"
  5. ],
  6. "subpackages": [
  7. {
  8. "root": "packageA",
  9. "pages": [
  10. "pages/cat",
  11. "pages/dog"
  12. ]
  13. }, {
  14. "root": "packageB", // 分包根目录
  15. "name": "pack2", // 分包别名,分包预下载时可以使用
  16. "independent": true // 分包是否是独立分包
  17. "pages": [ // 分包页面路径,相对于分包根目录
  18. "pages/apple",
  19. "pages/banana"
  20. ]
  21. }
  22. ]
  23. }

分包预下载

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

9a0d453d0382f33fd88533ad712ec9a0.jpeg

预下载分包行为在进入某个页面时触发,通过在 app.json 增加 preloadRule 配置来控制。

  1. {
  2. "pages":[
  3. "pages/index",
  4. "pages/logs"
  5. ],
  6. "subpackages": [
  7. {
  8. "root": "packageA",
  9. "pages": [
  10. "pages/cat",
  11. "pages/dog"
  12. ]
  13. }, {
  14. "root": "packageB",
  15. "name": "pack2",
  16. "independent": true
  17. "pages": [
  18. "pages/apple",
  19. "pages/banana"
  20. ]
  21. }
  22. ],
  23. "preloadRule": { // 分包预下载
  24. "pages/index": {
  25. "network": "all",
  26. "packages": ["packageA"]
  27. },
  28. "packageB/pages/apple": {
  29. "packages": ["__APP__"] // 对于独立分包,也可以预下载主包
  30. }
  31. }
  32. }

packages 进入页面后预下载分包的 root 或 name。__APP__ 表示主包。network 在指定网络下预下载,可选值为:all: 不限网络,wifi: 仅 wifi 下预下载。

双十一好物推荐

现在下手,优惠力度大,赶快点击上面链接抢购吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/326365
推荐阅读
相关标签
  

闽ICP备14008679号