一文带你彻底搞定小程序分包和预加载

news2024/9/19 22:04:57

小程序分包

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

在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。

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

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

  • 整个小程序所有分包大小不超过 20M
  • 单个分包/主包大小不能超过 2M

对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作。

官方所提供的文档分为如下 3 个内容:

  • 使用分包
  • 独立分包
  • 分包预加载

所以这里不再照搬官网做介绍,详细了可以参阅官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html

本文我们主要来看一下分包的实际操作。

这里以【applet-subcontracting】项目为例。

根据官网的介绍,分包主要是将小程序的页面进行分门别类,例如:

├── app.js
├── app.json
├── app.wxss
├── packageA 
│   └── pages
│       ├── cat
│       └── dog
├── packageB
│   └── pages
│       ├── apple
│       └── banana
├── pages
│   ├── index
│   └── logs
└── utils

然后在 app.json 文件中使用 subpackages 字段来声明项目分包结构:

{
  "pages":[
    "pages/index",
    "pages/logs"
  ],
  "subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ]
    }
  ]
}

subpackages 字段对应的值为一个数组,数组里面记录了分几个包,每个包对应一个对象,对象可以设置如下的属性值。如下:

image-20230214085459929

来看【applet-subcontracting】项目实际的操作示例。

image-20230214085516276

首先是我们的项目目录,以前我们所有的页面,都是放在 pages 目录下面的。现在要进行分包的话,虽然也都是放在 pages 目录下,但是 pages 目录下面又分为了 package1、package2package3

这里我们其实就是分成了 3 个包,每个包有自己的目录,展开后如下图所示:

image-20230214085544467

接下来我们就需要在 app.json 里面进行配置了。配置代码片段如下:

{
  "pages":[
    "pages/package1/pages/index/index",
    "pages/package1/pages/cat/cat",
    "pages/package1/pages/dog/dog",
    "pages/package1/pages/apple/apple",
    "pages/package1/pages/banana/banana"
  ], 
  "subpackages": [
    {
      "root": "pages/package2",
      "name": "pack2",
      "pages": [
        "pages/cat/cat",
        "pages/dog/dog"
      ]
    }, {
      "root": "pages/package3",
      "name": "pack3",
      "pages": [
        "pages/apple/apple",
        "pages/banana/banana"
      ]
    }
  ],
  // ...
}

可以看到,pages 里面配置第一次要加载的页面,这里我们加载的是 package1 里面的所有页面。

package2package3 则采取的是分包的形式,被写入到了 subpackages 里面。

在开发工具的详情中,可以看到当前的分包情况,如下图所示:

image-20230214085619380

独立分包

独立分包就是这个包是独立的,不依赖于主包就能用,当设置为独立分包时,我们从独立分包进入 “不会加载主包”,只有进入主包页面或者非独立分包页面是才加载主包。

使用的方法也很简单,只需要在配置包的时候,把 independent 设置为 true 就会成为独立分包。

例如:

{
    // ...
    "subpackages": [{
        "root": "pages/package2",
        "name": "pack2",
        "pages": [
          "pages/cat/cat",
          "pages/dog/dog"
        ],
        "independent": true
      }, {
        "root": "pages/package3",
        "name": "pack3",
        "pages": [
          "pages/apple/apple",
          "pages/banana/banana"
        ]
    }],
    // ...
}

在上面的代码中,我们将 pack2 设置为了独立分包。

独立分包注意事项:

  • 从独立分包进入的时候,由于没有加载主包,因此通过 getApp 方法拿到的是 undefined。只有在加载主包回来这个页面以后才能通过 getApp 拿到全局参数 ⚠️。

  • 独立分包不能共享其他包样式,包括 app.wxss 样式 ⚠️。

  • 独立分包不支持使用插件 ⚠️

  • 在低于 6.7.2 的微信版本的小程序独立分包当成普通分包对待,不具备独立分包的能力 ⚠️。

为了兼容独立分包进入无法全局管理变量的能力,官方在基础版本库 2.4.4 以后做了兼容,使用 getApp({allowDefault: true}) 可以预先写入变量,当主包加载的时候会同步到 app 里面 ⚠️。

const app = getApp({allowDefault: true});
 
app.name = "CoderJoon"; // 等主包加载的时候会同步进去

分包预加载

所谓分包预加载,就是在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度。这就需要你去判断了 预判用户的下一步操作 提前进行预加载!

例如:

{
  // 注意 这里的packages 可以写为 subpackages 中起的name 作为别名
  "preloadRule": {
      //进入 "pages/package1/pages/cat/cat" 然后预加载 pack2
    "pages/package1/pages/cat/cat": {
      "network": "all",
      "packages": ["pack2"]
    },
    "pages/package1/pages/apple/apple": {
        //进入 "pages/package1/pages/apple/apple" 然后预加载 pack3
      "network": "all",
      "packages": ["pack3"]
    }
  },
  // ...
}

在上面的配置中,表明进入 cat 页面时,就加载 pack2 这个包,进入 apple 这个页面时,就加载 pack3 这个包。

network 对应的 all 代表在指定网络下预下载,可选值有 all(不限网络)和 wifi(仅 wifi 下预下载)。

分包异步化(建议看看官方文档 很详细!)

在小程序中,不同的分包对应不同的下载单元

不同的包之间无法相互使用自定义组件或者 require。

subpackA // 我们在subpackA中自定义了 item 组件
	
subpackB // 在这里你就不能用  item 组件

这样就很鸡肋 我写组件的目的就是为了 复用 现在不让我用了 我很烦 这时候我们就可以使用 分包异步化 来复用组件了

跨分包自定义组件引用(占位渲染)

有点类似于骨架屏,先用内置组件或者本包中的组件进行一个占位渲染,之后在其他包加载之后再渲染为对应的组件。

要使用此特性,直接在当前包对应的 json 文件中进行配置即可:

{
  "componentPlaceholder": { //配置您的占位组件
    "button": "view",
    "list": "simple-list"
  }
}

跨分包 JS 代码引用

在当前包如果要使用其他包的代码,首先通过 require 来引入,然后注意这个过程是异步的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思码逸 信通院联合发布:《研发效能基准报告》解读

页数:47页 免费下载:https://fs80.cn/go7exq 本文共计6000字,建议阅读时间:5-10分钟。 阅读本文你将收获: 研发效能基准指标 研发效能基准指标数据:交付速率、交付质量、交付能力 研发效能综合分析&…

基于springboot+vue+uniapp的英语学习交流平台小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

视觉SLAM中的数学基础01 -3D空间的位置表示

在视觉SLAM中,理解和表示3D空间中的位置是至关重要的。这涉及到多种数学概念和工具,如坐标系、向量、矩阵、旋转和平移等。这些数学基础构成了视觉SLAM算法的核心。以下是3D空间位置表示的基本数学概念。 这是一个表示世界坐标系和相机坐标系之间关系的3…

以差异化运营高亮建材企业品牌优势,多层级孵化客户成交

建筑建材业作为国民经济的支柱产业之一,行业周期性明显,其发展情况与宏观经济走势高度相关。过去一年,随着供应链上下游的发展滑坡,建筑建材企业的流动性压力进一步显现,市场格局逐渐两级分化,头部企业甚至能在出口旺季一举收割将近80%的盈利份额。 对于非集团性门窗企业来说,…

人力资源外包项目适合哪些人做?

人力资源外包(RPO)项目在现代企业管理中扮演了重要角色。然而,成功运营RPO项目需要具备特定技能和背景的人员。以下是适合从事人力资源外包项目的几类人群,他们的特点和能力使他们能够在这一领域中取得成功。 1. 具备人力资源管理经验的专业人士 具备丰富…

Spring IOC and DI

1.什么是IOC (1)在Spring的MVC中我们学习了,让我们知道了将对象如何交给Spring进行管理类 (2)Spring是一个开源框架,是包含众多方法容器的IOC容器 (3)那么什么事IOC,我…

条理最清楚的最常用的 Git 管理指令

基础提交操作 git init # 将本地文件夹变为一个git仓库 git clone #将远程仓库克隆到本地 git log 查看提交记录 git fetch 命令更新remote索引,解决git branch -a没有最新分支的问题 git add # 将单个文件从工作区添加到暂存区 git add . # 将所有文件添加到暂存…

Win11(23H2)Copilot电脑重启会修改注册表解决办法

基础条件:科学上网 参考这两篇文章开启Copilot 参考一 参考二 成功后,如果你电脑每次重启,Copilot图标都会消失,那就是注册表被修改了,可以用一个取巧的办法解决 解决办法如下: 1. 桌面上新建一个文本&…

2024年【烟花爆竹经营单位主要负责人】找解析及烟花爆竹经营单位主要负责人复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位主要负责人找解析参考答案及烟花爆竹经营单位主要负责人考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹经营单位主要负责人操作证已考过的学员汇总,相对有效帮助烟花爆竹经营单…

vue3引入模块报错:无法找到模块“xxx”的声明文件

使用vue3ts导入vue文件的时候,报错:找不到模块“./XXX.vue”或其相应的类型声明 这是由于:Vue 文件并不是标准的 JavaScript 模块,因此 TypeScript 需要通过这种声明方式来理解和处理这些文件 我是使用vite创建的项目&#xff0…

工作随记:oracle中偶发遇到存储过程编辑,删除等卡死问题

文章目录 一、查询session是否占用二、通过对象名称定位对应SID三、通过对应的SID查询session信息四、kill掉session 最近有几个客户也询问过:我的存储过程怎么编译、调试有时候就卡死不动了,而且还没办法删除,本次又碰到实际情况&#xff0c…

【NLP】文本处理的基本方法【jieba分词、命名实体、词性标注】

文章目录 1、本章目标2、什么是分词3、jieba的使用3.1、精确模式分词3.2、全模式分词3.3、搜索引擎模式分词3.4、中文繁体分词3.5、使用用户自定义词典 4、什么是命名实体识别5、什么是词性标注6、小结7、jieba词性对照表⭐ 🍃作者介绍:双非本科大三网络…

打卡第34天------动态规划-01背包

我目前刷leetcode上的题的时候,不仅每天按照代码随想录的算法训练营的进度来刷题,也会自己开始在leetcode上刷题了,有些简单的题目,不用看题解就能做出来了,这也是一种进步呀。希望可以尽快找到下家工作单位&#xff0…

前端全屏错误窗错解决方案

如果你的项目全屏错误窗报错,可以在vue.config.js中进行设置 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,lintOnSave: false,devServer: {client: {overlay: false,},} })

doxygen制作接口文档

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、代码注释四、使用doxygen生成文档 前言 每次手动写接口文档太痛苦了,现在福利来了–doxygen Doxygen是软件开发中广泛使用的文档生成器工具。它自动从源代码注释生成文档,解析有关类、函数和…

上播狂卖下播全退!用户抛弃直播间,网红们疯狂刷单注水……

最近,直播带货行业瓜好像多的有点吃不动了!‍ 头部的一哥二哥三哥们,卖课的卖课、分家的分家,吵架的吵架……好不热闹。 就好比国民女婿董宇辉,在和东方甄选、俞敏洪周旋了小半年后,终于还是从打工人变成…

【送激活码,免费升级】GuitarPro发布8.1.3新版 guitar pro最新版中文官网下载 guitar pro激活码

打谱神器 Guitar Pro 迎来了 2024 最新版!所有购买过 Guitar Pro 8 的用户,现在就可以免费升级 V8.1.3 了,您可以通过软件内的升级提醒进行升级,或者直接下载下面的新包覆盖安装。 Guitar Pro8.13最新安装包下载(Win&…

【JVM】深入JIT优化机制

1.JIT优化技术 在将高级语言转化为计算机可识别的机器语言时,常用的两种方式是编译和解释。Java在编译过程中,首先将代码编译成字节码。但是,字节码并不能直接在机器上执行。因此,JVM中内置了解释器(Interpreter&…

汇编语言1 - 什么是汇编语言?

1. 什么是汇编语言? 1.1. 汇编语言的定义1.2. 汇编语言与机器语言 1.2.1. 相同点1.2.2. 不同点 2. 汇编语言的主要特点3. 汇编语言的基本组成4. 汇编器 4.1. 主要工作流程4.2. 常见的汇编器 4.2.1. NASM(Netwide Assembler)4.2.2. MASM&…

PPT免费图片素材网站分享

一、Pixabay 网址:https://pixabay.com/ 图片类型:高清、免费、商用 使用方法:找到想要的图片之后,右键复制之后粘贴到PPT即可使用。同时,点击下载可以找到不同尺寸的PPT素材 二、花瓣网 网址:https://…