小程序分包加载

news/2024/7/20 2:56:14 标签: 小程序, apache

分包加载

1. 什么是分包加载

什么是分包加载

小程序的代码通常是由许多页面、组件以及资源等组成,随着小程序功能的增加,代码量也会逐渐增加,体积过大就会导致用户打开速度变慢,影响用户的使用体验。

分包加载是一种小程序优化技术。将小程序不同功能的代码,分别打包成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载,在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。每个分包可以包含多个页面、组件、样式和逻辑等。当小程序需要使用某个分包时,才会加载该分包中的代码。

**主包:**包含默认启动页面 / TabBar 页面 以及 所有分包都需用到公共资源的包

**分包:**根据开发者的配置进行划分出来的子包

小程序分包后如何加载

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

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

  1. 整个小程序所有分包大小不超过 20MB
  2. 单个分包/主包大小不能超过 2MB

📌 注意事项

​ 整个小程序所有分包大小可能会随时调整,截止到目前整个小程序所有分包大小不超过 20M

###2. 分包的基本使用

知识点:

在进行分包加载之前,需要对小程序的业务逻辑进行分析,将代码划分成多个模块。每个模块应该有一个明确的功能,并与其他模块之间有明确的依赖关系

需要按照功能拆分分包,并且每个分包都需要与其他包有依赖关系(可以通过 a 分包跳转到 b 分包)

开发者在小程序的配置文件 app.json 中,通过 subPackages 或者 subpackages字段声明项目分包结构。

每个分包需要指定 root 字段、name 字段和 pages 字段

  1. root 字段指定了分包的根目录,该目录下的所有文件都会被打包成一个独立的包
  2. name 字段为分包的名称,用于在代码中引用该分包
  3. pages 字段指定了该分包中包含的页面,可以使用通配符 * 匹配多个页面

落地代码:

{

  "subPackages": [
    {
      "root": "modules/goodModule",
      "name": "goodModule",
      "pages": [
        "pages/list/list",
        "pages/detail/detail"
      ]
    },
    {
      "root": "modules/marketModule",
      "name": "marketModule",
      "pages": [
        "pages/market/market"
      ]
    }
  ]

}

3. 打包和引用原则(注意事项)

打包原则:

  1. tabBar 页面必须在主包内

  2. 最外层的 pages 字段,属于主包的包含的页面

  3. 按 subpackages 配置路径进行打包,配置路径外的目录将被打包到主包中

  4. 分包之间不能相互嵌套,subpackage 的根目录不能是另外一个 subpackage 内的子目录

引用原则:

  1. 主包不可以引用分包的资源,但分包可以使用主包的公共资源

  2. 分包与分包之间资源无法相互引用, 分包异步化时不受此条限制

4. 独立分包的配置

什么是独立分包

独立分包:独立分包是小程序中一种特殊类型的分包,可以独立于主包和其他分包运行

从独立分包中页面进入小程序时,不需要下载主包,但是当用户进入普通分包或主包内页面时,主包才会被下载 !

开发者可以将功能相对独立的页面配置到独立分包中,因为独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度

如果是独立分包,不需要下载主包,直接就能够访问,独立分包是自己独立运行的

而如果是其他分包,需要先下载主包,通过路径访问,才能加载对应路径的分包

📌 注意事项:

  1. 独立分包中不能依赖主包和其他分包中的资源

  2. 主包中的 app.wxss 对独立分包无效

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

如何配置独立分包:

开发者在app.json中找到需要配置为独立分包的subpackages字段

在该字段配置项中定义independent字段声明对应分包为独立分包。

落地代码:

{

  "subPackages": [
    {
      "root": "modules/goodModule",
      "name": "goodModule",
      "pages": [
        "pages/list/list",
        "pages/detail/detail"
      ]
    },
    {
      "root": "modules/marketModule",
      "name": "marketModule",
      "pages": [
        "pages/market/market"
      ],
+       "independent": true
    }
  ]
}

5. 分包预下载

知识点:

分包预下载是指访问小程序某个页面时,预先下载分包中的代码和资源,以提高用户的使用体验。当用户需要访问分包中的页面时,已经预先下载的代码和资源可以直接使用,通过分包预下载加快了页面的加载速度和显示速度。

小程序的分包预下载需要在 app.json 中通过 preloadRule 字段设置预下载规则。preloadRule 是一个对象,对象的 key 表示访问哪个路径时进行预加载,value 是进入此页面的预下载配置,具有两个配置项:

字段类型必填默认值说明
packagesStringArray预下载的分包名称,进入页面后预下载分包的 rootname
__APP__ 表示主包。
networkStringwifi在指定网络下预下载,
可选值为: all: 不限网络 wifi: 仅wifi下预下载
{
  "subPackages": [
    {
      "root": "modules/goodModule",
      "name": "goodModule",
      "pages": [
        "pages/list/list",
        "pages/detail/detail"
      ]
    },
    {
      "root": "modules/marketModule",
      "name": "marketModule",
      "pages": [
        "pages/market/market"
      ],
      "independent": true
    }
  ],
  "preloadRule": {
    "pages/index/index": {
      "network": "all",
      "packages": ["modules/goodModule"]
    },
    "modules/marketModule/pages/market/market": {
      "network": "all",
      "packages": ["__APP__"]
    }
  }
}

落地代码

{
  "pages": [
    "pages/index/index",
    "pages/user/user"
  ],
  "subPackages": [
    {
      "root": "pages/music",
      "name": "music",
      "pages": [
        "player/player",
        "lyric/lyric"
      ]
    },
    {
      "root": "pages/settings",
      "name": "settings",
      "pages": [
        "theme/theme",
        "language/language"
      ]
    }
  ],
  "preloadRule": {
    "pages/music/player/player": {
      "packages": ["settings"],
      "network": "wifi"
    }
  }
}

http://www.niftyadmin.cn/n/5401204.html

相关文章

MATLAB实现图像gamma校正

在MATLAB中进行gamma校正通常可以使用imadjust函数来实现。下面是一个简单的示例代码以及对应的说明: % 读取图像 image imread(lena.png);% 设置gamma值 gamma_value 1.5;% 进行gamma校正 gamma_corrected_image imadjust(image, [], [], gamma_value);% 显示原…

Flutter学习8 - 网络编程 Http

1、配置 Http 依赖 在 pubspec.yaml 中引入 http 插件 dependencies:flutter:sdk: flutterhttp: ^0.13.4 # 请检查并使用最新版本命令行中输入 “ flutter pub get” 在 Dart 文件中导入 import package:http/http.dart as http;2、发送 Get 请求 import package:http/http…

mac-docker-php容器连接mac中的pgsql数据库失败以及出现table_msg存错误时的解决方法

以php中的thinkphp 5.1为例,php容器连接mac中的pgsql数据库失败时,出现如下错误 [7] PDOException in Connection.php line 528 SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost&…

pyspark(一) DataFrame结合jupyter入门

DataFrame描述 DataFrame是一个二维表结构,包括行、列以及schema(元数据) 在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,是一种特殊的RDD,是一个分布式的表,类似于传统数据库中的…

【论文阅读】《PRODIGY: Enabling In-context Learning Over Graphs》

文章目录 0、基本介绍1、研究动机2、创新点3、挑战4、准备4.1、图上分类任务4.2、少样本提示4.3、提示图表示4.3.1、Data graph G D \mathcal{G}^D GD4.3.2、task graph G T \mathcal{G}^T GT 5、方法论5.1、提示图上的信息传播架构5.1.1、Data graph Message Passing5.1.2、…

【vscode提取函数快捷键】提取函数,减少大方法的复杂度

在 Visual Studio Code 中,提取函数的快捷键取决于你所使用的编程语言和安装的插件。以下是一些常用的快捷键组合,可以用来在 Visual Studio Code 中提取函数: 执行以下步骤来提取函数: 选中要提取的代码块。右键单击选中的代码…

Linux--Redis 群集

9.1.1 关系型数据库与非关系型数据库 数据库按照其结构可以分为关系型数据库与其他数据库,而这些其他数据库我们将其统称为非 关系型数据库。Redis数据库是一个非关系型数据库。 1、关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型基础上…

20240301-2-ZooKeeper面试题(二)

11. Chroot 特性 3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。 通过设置 Chroot&#xff…