# 按需注入和用时注入

在小程序启动的过程中，除了代码包下载以外，代码注入也是一个主要的耗时环节。注入代码量的大小与内存占用与注入耗时正相关。

利用「**按需注入**」和「**用时注入**」的特性，可以优化代码注入环节的耗时和内存占用。

## 按需注入

> 基础库 2.11.1 及以上版本支持，2.11.1 以下兼容但无优化效果。
> 工具调试请使用 1.05.2111300 及以上版本，基础库选 2.20.1 及以上版本。

通常情况下，在小程序启动时，启动页面依赖的所有代码包（主包、分包、插件包、扩展库等）的所有 JS 代码会全部合并注入，包括其他未访问的页面以及未用到自定义组件，同时所有页面和自定义组件的 JS 代码会被立刻执行。这造成很多没有使用的代码在小程序运行环境中注入执行，影响注入耗时和内存占用。

自基础库版本 2.11.1 起，小程序支持通过配置，有选择地注入必要的代码，以降低小程序的启动时间和运行时内存。

```json
{
  "lazyCodeLoading": "requiredComponents"
}
```
### 注意事项
- 启用按需注入后，小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化，对应代码文件将不被执行。**请开发者修改配置后务必确认小程序的表现正常**。
- 启用按需注入后，页面 JSON 配置中定义的所有组件和 `app.json` 中 `usingComponents` 配置的全局自定义组件，都会被视为页面的依赖并进行注入和加载。建议开发者**及时移除 JSON 中未使用自定义组件的声明**，并尽量**避免在全局声明使用率低的自定义组件**，否则可能会影响按需注入的效果。
- 插件包和扩展库目前暂不支持按需注入。如果需要实现插件按需加载，可以考虑将插件置于一个分包，并通过「[分包异步化](/miniprogram/dev/framework/subpackages/async)」的形式**异步引入**。

## 用时注入

> 基础库 2.11.2 及以上版本支持，2.11.2 以下和未配置的效果相同。
> 工具调试请使用 1.05.2111300 及以上版本，基础库选 2.20.1 及以上版本。

在开启「按需注入」特性的前提下，「用时注入」可以指定一部分自定义组件不在小程序启动时注入，而是在真正渲染的时候才进行注入。

在已经指定 `lazyCodeLoading` 为 `requiredComponents` 的情况下，为自定义组件配置 [占位组件](/miniprogram/dev/framework/custom-component/placeholder)，组件就会自动被视为用时注入组件：

1. 每个页面内，第一次渲染该组件前，该组件都不会被注入；
2. 每个页面内，第一次渲染该组件时，该组件会被渲染为其对应的占位组件，渲染流程结束后开始注入；
3. 注入结束后，占位组件被替换回对应组件。
