使用uniapp在打包微信小程序时主包和vendor.js过大(uniCloud的插件分包)

文章讲述了在微信小程序开发中遇到主包体积过大,尤其是vendor.js文件过大的问题,以及如何通过调整manifest.json的分包配置,特别是针对uni-app中引入的大量uni插件进行合理分包,以减小主包大小。同时,文章提到了在分包后需手动引入组件并避免全局注册,以防止vendor.js体积再次增大。通过这些方法,可以有效优化小程序的加载性能。

1.问题描述

正常的的微信小程序在编译后,主包应保持在2MB左右(限制最大2MB),其余的文件通过分包来进行加载

 但是有的情况下,微信小程序的主包能达到3MB,vendor.js会达到1.5MB

 2.问题解决

当你发现的你的微信vendor.js只有1个文件夹,且这个文件非常大时,首先需要检查manifest.json

在这个文件夹下的源码视图中,在这个文件下的mp-weixin节点有个optimization

 optimization下的subPackages节点时用来控制微信分包的,需要将此节点设为true

"optimization" : {
    "subPackages" : true
}

一般的微信小程序设置这个节点就能够解决

但是如果你的微信小程序在uni_modles下引入了非常多的uni插件,比如说:uni-id-pages,uni-im,uSearch,uni-pay等uni全家桶

这些页面默认都会在主包里,因为uni_modules是主包,所以该目录下的uni-id-pages和uni-im页面也会打包到主包里(主包里面的vendor.js会打包所有主包里面的页面与插件的js文件),所以导致了主包里面的vendor.js在分包打包后依旧过大

这时就需要我们把你项目中引用的插件也进行分包(uni-id-pages和uni-im引入时在uni_modules下)

在pagesjson中添加分包信息,将在主包中注册的插件的页面都移动到此分包中

 通过查找替换功能,将uni-id-pages等插件的路径由“uni_modules/uni-id-pages”替换为“subpackageuni/uni-id-pages”

不建议直接把uni_modules直接分包,因为其中可能包含其它组件,这些组件最好注册在主包中注册,因为子包不能引用子包的插件,所以插件如果在子包中,就只有子包中才能引用

 同理,将uni-id-pages等插件分包后,这些插件就不适用与uni-app的组件规则,就需要我们手动去引入

在uni-id-pages下有如下的组件,这些组件在经过分包之后,只能在子包内才能访问,而通过uniapp的组件引入是通过easycom组件规范来引入的,详细见如下链接:

组件使用的入门教程 | uni-app官网

 因此这些组件需要通过vue语法引入到页面(必须要在子包内引入,因为你如果把这些组件都通过注册全局组件来引入,那么到头来还是会增加vendor.js的大小,因为vendor.js会引入全局组件)

通过vue语法,将所有的组件导入到所有的页面(为了方便)

 每个页面都把这些组件复制一遍即可

 最后再进行分包你就会发现主包的vendor.js明显小了

 而由于把uni-id-pages和uni-im进行了分包,分包中的vendor.js明显变大(这样就把以前位于主包的vendor.js打包到了分包中)

 

 

 

<think>我们面对的问题是:uViewPlus打包后小程序体积过(超过2MB),需要优化方法。 根据引用内容,我们注意到uViewPlus是通过在项目中引入整个库的方式使用的,这可能导致打包体积过。因此,优化的核心思路应该是减少最终打包文件中uViewPlus所占的体积。 常见的优化方法括: 1. **按需引入**:只引入项目中实际使用的组件,而不是整个uViewPlus库。 2. **使用分包**:将uViewPlus库移到分包中,不占用体积。 3. **压缩代码资源**:通过构建工具压缩代码静态资源。 4. **使用小程序的分包异步化**:在需要再加载uViewPlus组件。 具体到uViewPlus,我们可以尝试以下步骤: ### 1. 按需引入 在uViewPlus的文档中,通常提供了按需引入的方法。我们可以修改引入方式,只引入需要的组件。 例如,在`uview.js`中,我们原本可能是这样引入的: ```javascript import uviewPlus from "uview-plus" ``` 按需引入可以改为: ```javascript import { uButton, uIcon } from 'uview-plus' // 只引入需要的组件 ``` 然后在Vue中注册这些组件: ```javascript app.component('u-button', uButton) app.component('u-icon', uIcon) ``` 这样,打包就只会含这些组件的代码。 ### 2. 使用小程序分包 将uViewPlus移动到分包中: - 在项目根目录下创建分包目录,例如`packageA`。 - 将`node_modules/uview-plus`整个复制到分包目录下(或者使用npm构建到分包,但注意小程序不支持直接引用node_modules到分包,所以需要复制)。 - 修改`pages.json`,将分包的路径配置进去。 - 在需要使用uViewPlus的页面,通过相对路径引用分包中的组件。 但是,这种方法需要调整项目结构,并且要注意组件路径的修改。 ### 3. 压缩代码资源 - 在微信开发者工具中,可以开启“上传代码自动压缩”选项。 - 使用工具如Terser进行代码压缩,但小程序构建过程通常已经做了压缩。 - 压缩图片等静态资源。 ### 4. 使用分包异步化(仅当小程序基础库版本支持分包异步化允许在需要分包中加载组件。我们可以将uViewPlus放在一个分包中,然后在中通过异步方式引用。 在`app.json`中配置分包: ```json { "subpackages": [ { "root": "packageA", "pages": [ // 这里不需要有页面,我们只是放组件 ], "plugins": { // 如果有插件,也可以配置 } } ], "preloadRule": { // 可以配置预加载规则 } } ``` 然后在的页面中,如果需要使用uViewPlus的组件,可以使用`require.async`来异步加载: ```javascript Page({ onLoad() { require.async('packageA/uview-plus/components/u-button/u-button', (comp) => { // 使用comp }) } }) ``` 但是,这种方式需要手动处理每个组件的异步加载,并且修改使用方式,较为繁琐。 ### 5. 使用小程序的分包独立化 在`app.json`中配置分包为独立分包,这样独立分包中的内容不会被打入。 但是,独立分包不能依赖其他分包,所以如果uViewPlus被多个分包使用,可能需要复制多份,或者放在一个非独立分包中。 ### 6. 检查uViewPlus的版本构建配置 - 确保使用的是最新版本的uViewPlus,可能新版本已经优化了体积。 - 检查构建配置,例如在微信小程序中,可以在`project.config.json`中设置`miniprogramRoot`,并检查是否含了不必要的文件。 根据引用内容,我们注意到在App.vue中引入了整个uViewPlus的样式: ```scss @import 'uview-plus/index.scss'; @import 'uview-plus/theme.scss'; ``` 如果uViewPlus支持按需引入样式,那么我们可以只引入需要的组件的样式。但通常样式文件是整体引入的,所以可以考虑删除未使用组件的样式(手动或通过工具)。 ### 7. 使用工具分析体积 使用微信开发者工具中的“代码依赖分析”功能,查看中哪些文件体积较,然后针对性地优化。 ### 8. 替换或精简组件 如果上述方法效果有限,可以考虑替换一些组件,比如使用小程序原生组件替代部分uViewPlus组件,或者自己实现一些简单的组件。 综上所述,最有效且常用的方法是按需引入使用分包。 下面给出一个具体的优化步骤建议: **步骤1:按需引入组件** 修改`uview.js`文件,将全局引入改为按需引入。例如: ```javascript // 按需引入部分组件 import { uButton, uIcon } from 'uview-plus' export const $toast = (message) => { uni.$u.toast(message) } export default app => { app.provide('$toast', $toast) // 注册组件 app.component('u-button', uButton) app.component('u-icon', uIcon) // ... 其他组件 } ``` **步骤2:将uViewPlus放入分包** 在项目根目录下新建一个分包目录,比如`subpackage/uview`,然后将`node_modules/uview-plus`整个目录复制到`subpackage/uview`下。 修改引入路径,将原本从`uview-plus`的引入改为相对路径引入,例如: ```javascript // 修改按需引入的路径 import { uButton, uIcon } from '@/subpackage/uview/uview-plus' ``` 注意:这样修改后,需要确保所有使用uViewPlus组件的地方都通过这个分包路径引入,或者通过配置别名简化路径。 **步骤3:配置分包** 在`pages.json`中配置分包: ```json { "subPackages": [ { "root": "subpackage", "pages": [ // 如果分包内有页面,则在这里添加,如果没有,可以留空或者添加一个空页面 ] } ] } ``` 这样,`subpackage`目录下的内容会被打包分包中,不占用体积。 **步骤4:检查并优化** 重新构建项目,查看体积是否减小。如果仍然较,继续分析其他占用体积的部分。 注意:按需引入分包可能会带来一些开发上的不便,比如需要手动管理引入的组件,但这是优化体积的有效手段。 如果以上方法仍不能满足需求,可能需要考虑更换UI库或者深入优化其他部分的代码资源。 由于具体项目情况不同,请根据实际情况调整优化方案。 相关问题: 1. 如何分析小程序体积过的原因? 2. 除了uViewPlus,还有哪些优化小程序体积的方法? 3. 使用分包后,如何解决跨分包组件通信的问题?</think>针对 uViewPlus 打包后小程序体积过的问题,以下是优化方案及实施步骤: ### 优化方案 1. **按需引入组件** 通过 `unplugin-vue-components` 插件自动按需加载组件,避免全量引入。 ```bash npm install unplugin-vue-components -D ``` ```javascript // vite.config.js import Components from 'unplugin-vue-components/vite' import { UviewPlusResolver } from 'unplugin-vue-components/resolvers' export default { plugins: [ Components({ resolvers: [UviewPlusResolver()] }) ] } ``` 2. **启用小程序分包** 将 uViewPlus 移至分包中,减少体积: ```json // pages.json { "subPackages": [ { "root": "subpackage", "pages": [ { "path": "uview-components", "style": { "navigationBarTitleText": "UI组件" } } ] } ] } ``` 将 `node_modules/uview-plus` 复制到 `subpackage/uview` 目录,引用路径改为 `@/subpackage/uview`。 3. **压缩静态资源** - **图片压缩**:使用 TinyPNG 或 `image-minimizer-webpack-plugin`。 - **代码压缩**:在构建命令中添加 `--minimize` 参数,启用 Terser 压缩。 4. **清理未使用样式** 在 `App.vue` 中仅引入必要样式: ```scss /* 只引入使用的组件样式 */ @import 'uview-plus/theme.scss'; @import 'uview-plus/components/u-button.scss'; @import 'uview-plus/components/u-icon.scss'; ``` 5. **启用小程序 CDN 资源** 将 uViewPlus 的静态资源(如字体、图片)上传至 CDN: ```scss /* 修改 uview-plus 题变量 */ $u-base-font-url: 'https://cdn.example.com/fonts/'; ``` ### 验证优化效果 1. 执行构建命令查看体积: ```bash npm run build:mp-weixin ``` 2. 使用微信开发者工具 > "详情" > "代码依赖分析" 查看占比。 ### 注意事项 - **版本兼容性**:确保 uViewPlus 版本 ≥ 1.3.0(支持按需引入)。 - **分包限制**:分包小需 ≤ 20MB(含总上限 20MB)[^1]。 - **缓存清理**:每次优化后删除 `dist` 目录重新构建。 > 通过上述组合策略,通常可减少体积 30%-60%。若仍未达标,建议审查其他第三方库或业务代码冗余。 [^1]: 微信小程序官方分包规范要求≤2MB,总≤20MB。
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值