微信小程序分包异步化,分包之间可以互相使用自定义组件

本文介绍了如何在uni构建的微信小程序中启用分包功能,包括在manifest.json和pages.json中配置,创建并使用子包中的自定义组件,以及处理子包未下载时的占位组件设置。

官网链接

转载

uni构建的微信小程序中使用

1.开启分包
  • 在manifest.json文件中对应平台开启分包
{
    "mp-weixin": { /* 微信小程序特有相关 */
        "optimization": {
            // 开启分包
            "subPackages": true
        },
        "appid": "",
        "setting": {
            "urlCheck": false
        },
        "usingComponents": true
    },
}
  • pages同级创建文件夹packageA
├── App.vue
├── main.js
├── manifest.json
├── pages.json
├── uni.scss
├── packageA     
├── pages
    ├── index
  • 在pages.json文件配置subPackages字段
{
    "pages": [...],
    "subPackages": [{
        "root": "packageA",
        "pages": [...]
    }],
    "globalStyle": [...],
}
2.分包创建自定义组件
  • 在/packageA/components/下创建自定义组件package-com
├── App.vue
├── main.js
├── manifest.json
├── pages.json
├── uni.scss
├── packageA  // 分包
│   ├── pages
│   └── components
│       ├── package-com.vue
│       
├── pages  // 主包
    ├── index
  • package-com.vue
<template>
	<view class="content">packageCom</view>
</template>
 
<script>
 
export default {
	data() {
		return {
                
           }
    },
    mounted(){
           
           
    },
    methods:{
 
    }
}
</script>
 
<style lang="scss">
 
</style>
3.使用

导入组件 - 注册组件 - 使用组件 - 设置占位组件
/pages/index.vue

<template>
	<view class="content">
		<view class="title">{{title}}</view>
		<!-- 3.使用组件 -->
		<package-com />
	</view>
</template>
 
<script>
	// 1.导入组件
	import packageCom from '../packageA/components/package-com.vue'
	export default {
		components: { packageCom }, // 2.注册组件
		data() {
			return {
				title: 'pages/index',
			}
		},
		onLoad() {
 
		},
		methods: {
			
		}
	}
</script>
 
<style>
	
</style>

pages.json

{
    "pages": [{
        "path": "pages/index",
        "style": {
              "navigationBarTitleText": "uni-app",
               // 4.设置占位组件
               "componentPlaceholder": {
                    // "其他分包自定义组件": "占位组件"
                   "package-com": "view"
               }
         }
 
     }],
    "subPackages": [...],
    "globalStyle": [...],
}

注:分包(pages)使用其他分包(packageA)的自定义组件时,由于其他分包(packageA)还未下载或注入,其他分包(packageA)的组件处于不可用的状态。所以先设置占位组件渲染,在其他分包(packageA)下载结束后再替换。

<think>根据用户问题,我们需要在主包中使用分包里的组件。结合引用内容,特别是引用[3]和[4]提到了主包引用分包组件的方法和可能出现的错误。 关键点: 1. 在页面或组件的json配置中,通过"usingComponents"字段引入分包组件,路径为分包路径(如:`"select-box": "/pagesB/components/selectBox"`)。 2. 注意:分包路径需要正确,并且组件所在的目录不能被打包忽略(引用[2]提到忽略打包的问题)。 3. 引用[4]中的报错信息表明,如果直接引用分包组件可能会报错,可能需要配置"componentPlaceholder"(占位组件)。 官方文档说明:微信小程序从基础库2.2.1开始支持分包,但不支持直接跨分包使用自定义组件。但是,可以通过以下方式在主包中使用分包组件: - 方法1:将组件移到主包中(但这样会增加主包大小,不推荐)。 - 方法2:使用分包异步化(从基础库2.11.1开始支持),通过`require`或`import`异步引入,但这种方式在模板中无法直接使用。 - 方法3:使用占位组件(componentPlaceholder)。 根据引用[3]和[4]的信息,具体步骤: 1. 在需要引用分包组件的页面(主包页面)的json文件中,配置usingComponents来引入分包组件,同时需要配置componentPlaceholder(占位组件)以避免找不到组件的错误。 2. componentPlaceholder的作用是在主包中先使用一个占位组件,当分包加载后再替换为实际组件。 示例步骤: 1. 在分包中创建一个组件(比如在分包pagesB中,组件路径为`/pagesB/components/selectBox`)。 2. 在主包页面的json文件中(比如pages/index/index.json): ```json { "usingComponents": { "select-box": "/pagesB/components/selectBox" }, "componentPlaceholder": { "select-box": "view" // 这里用view作为占位,也可以用其他简单组件 } } ``` 3. 这样,在页面加载时,先用一个view组件占位,等pagesB分包加载后,再替换为实际的selectBox组件。 注意:确保组件路径正确,并且分包配置正确(在pages.json中配置分包)。 另外,引用[2]中提到的文件被忽略的问题,需检查项目配置,确保分包目录不被忽略(如unpackage目录是被忽略的,不要将分包放在该目录下)。 如果按照以上配置仍然报错,检查: - 分包是否配置正确(在pages.json中是否有subPackages配置)。 - 组件的路径是否正确(特别注意大小写和实际目录结构)。 - 是否在分包加载之前就使用了该组件(此时占位组件会显示,等分包加载后才会替换)。 因此,具体步骤总结如下: 1. 在分包中编写组件。 2. 在需要引用该组件的主包页面的json文件中,同时配置usingComponents和componentPlaceholder。 3. 确保项目配置正确(分包配置、忽略打包列表等)。 注意:此功能需要基础库版本支持(微信开发者工具中可设置基础库版本,建议2.11.1以上)。 </think>在Uniapp微信小程序中,主包使用分包组件的核心方法是**通过占位组件机制 (`componentPlaceholder`)** 实现。结合引用内容,具体操作步骤如下: ### ✅ 正确操作步骤 1. **组件路径配置** 在需要调用分包组件的**主包页面/组件**的 JSON 文件中添加: ```json { "usingComponents": { "sub-component": "/分包路径/组件名" // 例:"/pagesB/components/selectBox" }, "componentPlaceholder": { "sub-component": "view" // ⭐ 关键:设置临时占位组件 } } ``` 引用[3]和[4]证实此配置结构 2. **分包路径规则** - 路径必须以 `/` 开头,指向分包目录 - 分包必须在 `pages.json` 的 `subPackages` 中正确定义: ```json { "subPackages": [{ "root": "pagesB", // 分包根目录 "pages": [ ... ] // 分包页面列表 }] } ``` 3. **文件位置检查** - 确保组件**不在**打包忽略目录内(如 `unpackage`, `hybrid`) - 验证 `project.config.json` 中的 `miniprogramRoot` 配置正确 - ▶️ 引用[2]强调:若组件路径被忽略会导致加载失败 4. **预加载优化(可选)** 在 `pages.json` 添加预加载规则加速组件加载: ```json "preloadRule": { "主包页面路径": { "network": "all", "packages": ["分包名"] // 例:["pagesB"] } } ``` 引用[3]展示了预加载配置示例 ### ⚠️ 常见错误解决 - **报错 `Component is not found`**: 1. 检查是否遗漏 `componentPlaceholder` 2. 确认组件路径是否被忽略(引用[2]) 3. 验证分包名称是否与 `subPackages` 定义一致(引用[4]) - **组件加载慢**: 使用 `preloadRule` 预加载分包(引用[3]) ### 📝 完整示例 主包页面 `pages/index/index.json`: ```json { "usingComponents": { "course-card": "/pagesB/components/courseCard" }, "componentPlaceholder": { "course-card": "view" } } ``` 分包配置 `pages.json`: ```json { "subPackages": [{ "root": "pagesB", "pages": [ {"path": "components/courseCard"} ] }], "preloadRule": { "pages/index/index": { "network": "all", "packages": ["pagesB"] } } } ``` > **原理说明**:微信小程序分包独立加载,主包无法直接访问分包资源。`componentPlaceholder` 会在分包加载前显示临时组件分包加载后自动替换为真实组件(类似懒加载)[^3][^4]。 --- ### 🔍 相关问题 1. 如何解决主包调用分包组件时的 `Component not found` 错误? 2. 分包组件的预加载规则 (`preloadRule`) 有哪些配置选项? 3. Uniapp分包后如何优化小程序的首次加载速度? 4. 微信小程序分包大小的限制是多少?超过限制如何处理? [^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值