HbuilderX 项目打包文件过大问题优化

news2024/12/25 13:31:22

文章目录

  • HbuilderX 项目打包文件过大问题优化
    • 主要操作
    • 收效甚微,但又有那么点用的方法
    • 使用 gulp 压缩(最后一步)
        • 使用与配置
      • 网上找的 gulp 优化压缩配置
      • 还未尝试可能有用的方法
    • 尝试过程中看到的一些优质文章

HbuilderX 项目打包文件过大问题优化

此前写过的另一篇相关文章:uniapp 打包小程序体积优化思路、优先排查优化项参考-CSDN博客

  • 完全不用看了,已经整合到这篇里了

主要操作

配置开发者工具上传代码压缩

请添加图片描述


(HbuilderX)运行(R)-运行到小程序模拟器(M)-运行时是否压缩代码(C)

  • 调试的时候有用(有人说打包也有用,我感觉是玄学,不过勾上也不影响)
    • 不过要调试 js 代码建议还是取消勾选,不然可能看不懂要调试的代码

请添加图片描述


HbuilderX 的配置(manifest.json 源码视图,搜 mp-weixin)

/* 小程序特有相关 */
"mp-weixin" : {
  "appid" : "wxf137596082a7507b",
  "setting" : {
    "urlCheck" : false,
    "minified" : true,
    "postcss" : false,
    "es6" : false
  },
  "lazyCodeLoading" : "requiredComponents",
  "usingComponents" : true,
  "permission" : {},
  "optimization" : {
    "subPackages" : true
  }
},

图片等静态资源云化

  • 图片、视频、字体文件等放到服务器上,用链接的形式引入,避免被打包

使用分包

  1. 页面分包(非 tabbar 页面分包及其用到的组件)
    1. 一般 tabbar 页面是最常用页面,进入到小程序立马访问、切换的概率较大, 所以放主包,避免因为分包加载影响用户体验
  2. 组件分包(如用到的 uni 组件、uView 组件、自己写的组件)
    1. uView 配置按需引入

uni_modules 也采用分包

  • 虽然 uniapp 官方说了 uni_modules 会根据使用用到而决定是否要打包过滤,但分包前后还是有区别的,所以我估计此前是理解错了
  • 虽然会过滤没用到的,但用到了的也会打包到主包里去,就导致了主包偏大无法上传的问题,不是说放到 uni_modules 按需引用就不用管了
  • 将 uni_modules 里的部分组件分包后就小了一两百kb了
    • uni_modules组件分包(迁移)_姽式、的博客-CSDN博客
    • uni-app uni_modules 怎么打包到分包 - 我爱学习网 (5axxw.com)

各类第三方类库尽量使用按需引入的方式

  • echarts(定制化导出离线包引入/按需引入),echarts 5.X 全量引入和按需引入最终打包出的小程序测试包大小差了快30KB

删除 static 目录下的无用文件(经观察,不管用没用到都会被打包进去)



收效甚微,但又有那么点用的方法

删除无用组件、代码

  • 未用到的业务代码删除(页面文件、封装的组件、方法类、通用样式……)
    • 复用项目难免会有很多之前项目的组件、业务代码(推荐给自定义组件加上统一前缀,然后在 pages.json 里配置 easycom 自动按需引入,后续没用到的业务组件就不会自动打包了,也不需要手动删除;虽然我感觉没用到的组件打包时会被自动删除,但删了一堆文件确实打包体积有所减小,就没过多去分析具体情况)

无用 scss 文件内容删除(主包不单单是 vendor.js,vendor.js 找不到地方下手,可以考虑 scss 文件也减减体积)

  • 如 uni.scss
    • 注意事项 | uView - 多平台快速开发的UI框架
    • uni.scss中所写的一切内容,都会注入到每个声明了scss的文件中,这意味着,如果您的uni.scss如果有几百行,大小10k左右,那么这个10k都会被注入所有的 其他scss文件(页面)中,如果您的应用有50个页面,那么有可能因此导致整体的包体积多了50 * 10 = 500k的大小,这可能会导致小程序包太大而无法预览和发布, 所以,我们建议您只将scss变量相关的内容放到uni.scss中。
  • 如何解决引入uView-ui导致主包过大问题?:减少在uni.scss的样式,放入app.vue中。uni.scss的样式会导入uview每一个组件的scss中


使用 gulp 压缩(最后一步)

使用 gulp 对打包后的文件进行压缩

  • 压缩 js 和 json 文件的前后对比(以我压缩的项目来说:①总体积:2.73MB =>2.66MB;②主包:2.01MB => 1.95MB,主包减小了差不多 61.44KB

处理前后文件大小对比

微信开发者工具中代码依赖对比


使用与配置

①新建一个目录,在目录里新建下述两个文件(gulpfile.js、package.json)

②在目录下执行 npm i

  • 我的环境:node v14.18.0、npm 6.14.15

③HbuilderX 把项目打包出来,将其打包好的 mp-weixin 目录下所有文件拷到项目里去(直接放根目录的 src 里)

④终端执行 gulp,或者 npm run build

  • 好像运行完 VS Code 会卡死……但问题不大,打包了几次都没啥问题

⑤将根目录生成的 dist 目录里的文件拿去运行(至此 js、json 文件就已经压缩好了,dist 里是压缩后的完整项目代码)

⑥测试一下功能是否正常,若正常上传代码进行发布(希望你大小降到了可以发布的程度~

gulpfile.js

/*
 * @FilePath     : /test-gulp-zip/gulpfile.js
 * @Author       : suwanbin
 * @Date         : 2023-11-18 17:13:09
 */
// 基础库
const gulp = require('gulp')
const uglify = require('gulp-uglify')
// const uglifyCss = require('gulp-minify-css')
// const cleanCss = require('gulp-clean-css');
const jsonminify = require('gulp-jsonminify');
// 文件重命名
const rename = require('gulp-rename')
// 清空文件夹
const clean = require('gulp-clean')

// 删除文件夹
gulp.task('clean', function () {
  return gulp
    // read:是否读取文件,true 读取, false 不读取,加快程序
    // allowEmpty:允许文件夹为空或不存在,要不然会报错
    .src('./dist/', { read: false, allowEmpty: true })
    .pipe(clean());
})

// 打包 JS 任务
gulp.task('zipjs', function () {
  return gulp
    .src('./src/**/*.js')               // 定位需要压缩的文件
    // .pipe(babel({                // ES6 转 ES5,看需求而定
    //   presets: ['@babel/env']
    // }))
    .pipe(uglify())                 // 文件压缩
    .pipe(gulp.dest('./dist/'))     // 输出
})

// // 打包 CSS 任务
// gulp.task('zipcss', function () {
//   return gulp
//     .src(['./src/**/*.css', './src/**/*.wxss'])               // 定位需要压缩的文件
//     .pipe(cleanCss())                 // 文件压缩
//     .pipe(uglifyCss())                 // 文件压缩
//     .pipe(gulp.dest('./dist/'))     // 输出
// })

// 打包 JSON 任务
gulp.task('zipjson', function () {
  return gulp
    .src('./src/**/*.json')               // 定位需要压缩的文件
    .pipe(jsonminify())                 // 文件压缩
    .pipe(gulp.dest('./dist/'))     // 输出
})

// 不推荐压缩 HTML、WXML 网上说可能会有问题

// 发布文件移动
gulp.task('move', function () {
  return gulp
    .src('./src/**/*.*')
    .pipe(gulp.dest('./dist/'))
})

// 配置默认任务
// module.exports.default = gulp.series('clean', 'zipjs')
// gulp.task('default', gulp.series('clean', 'zipjs', 'zipcss', 'zipjson', 'move'))
gulp.task('default', gulp.series('clean', 'zipjs', 'zipjson', 'move'))

package.json

{
  "name": "gulp-zip-tools",
  "version": "1.0.0",
  "description": "gulp 压缩工具,临时压缩用",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "gulp"
  },
  "author": "suwanbin",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.23.3",
    "@babel/preset-env": "^7.23.3",
    "gulp": "^4.0.2",
    "gulp-babel": "^8.0.0",
    "gulp-clean": "^0.4.0",
    "gulp-clean-css": "^4.3.0",
    "gulp-jsonminify": "^1.1.0",
    "gulp-minify-css": "^1.2.4",
    "gulp-rename": "^2.0.0",
    "gulp-uglify": "^3.0.2"
  }
}

优质文章:使用gulp打包js/scss/less/font文件 - Elwin0204 - 博客园 (cnblogs.com)

  • 可以用来了解 gulp,我感觉写的挺好的

网上找的 gulp 优化压缩配置

抛砖引玉,留给想要跟进一步与优化的朋友去探索

使用网友开源的压缩工具:web-dist: 传统模式开发的web站点 进行整站所有文件压缩及混淆处理 (gitee.com)【荐】

  • 好像某些情况下比我自己写这个压缩的小(虽然有时候会大一点)

使用gulp解决小程序代码包过大问题_gulp打包前端代码,修改文件支持最大容量_寂寞花如雪的博客-CSDN博客

  • 本地目录的是基于这个文章去弄的,装依赖有些问题,解决到能跑了
  • 结果打包出来的还没有我前文 只压缩 js 和 json 的小……

微信小程序——gulp处理文件_mb5fdcae83766b7的技术博客_51CTO博客

  • gulp 3.9.1 版本,暂不知道需要对应什么版本的 node,我本地 14.18.0 的不行

还未尝试可能有用的方法

HbuilderX 项目转 cli 项目

  • uni-app HBuilderX项目转为cli项目及踩坑记录

  • 记一次uni-app 小程序打包因主包太大的优化过程 - 简书 (jianshu.com)

    • 用 glup 打包

解决 vue2 + vant2 打包文件(vendor.js、app.css)过大问题_vant 打包-CSDN博客

  • ↑ 将组件库从主包里去掉,用 cdn 引入

尝试过程中看到的一些优质文章

感谢各位网友的分享~

uni-app 打包h5 同类等vender 过大体积处理 - 简书 (jianshu.com)

记一次uni-app 小程序打包因主包太大的优化过程 - 简书 (jianshu.com)

解决uni-app编译后vendor.js文件过大 - DCloud问答

uniapp-打包小程序 用分包打包 在分包中vendor.js太大 - DCloud问答

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

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

相关文章

C语言每日一题(41)循环队列

力扣 622 循环队列 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前…

Mysql8.1.0 安装问题-缺少visual studio 2019x64组件

缺少visual studio x64组件的问题 使用Mysql8以上的安装包mysql-8.1.0-winx64.msi进行安装, 提示缺少visual studio 2019 x64可再发行组件 在微软官网下载vc可再发行程序包 Microsoft Visual C 可再发行程序包最新支持的下载 在Visual Studio 2015、2017、2019 和…

SAP_ABAP_编程基础_字符转换_内存表、jsonString 相互转换

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读441次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

Linux常用命令——basename命令

在线Linux命令查询工具 basename 打印目录或者文件的基本名称 补充说明 basename命令用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。 语法 basename(选项)(参数)选项 --help&…

Java核心知识点整理大全21-笔记

目录 18.1.5.1. upstream_module 和健康检测 18.1.5.1. proxy_pass 请求转发 18.1.6. HAProxy 19. 数据库 19.1.1. 存储引擎 19.1.1.1. 概念 19.1.1.2. InnoDB(B树) 适用场景: 19.1.1.3. TokuDB(Fractal Tree-节点带数据&…

Docker容器常用命令

文章目录 启动类命令帮助类命令镜像命令列出本地主机上的镜像在远程仓库中搜索镜像下载镜像保存镜像加载 tar 包为镜像查看占据的空间删除镜像 虚悬镜像命令自动补全新建启动容器启动交互式容器启动守护式容器 列出正在运行的容器容器其他启停操作启动已经停止的容器重启容器停…

【Web】SWPUCTF 2022 新生赛 个人复现

目录 ①webdog1__start ②ez_rce ③ez_sql ④ez_1zpop ⑤file_maste ⑥Power! 挑了部分题,太简单的就没选进来(但选进来≠有难度) ①webdog1__start 进来没啥东西,右键查看源码 对于0e215962017,md5后也是以…

泗博Modbus转Profinet网关TS-180对水表流量的监控应用

应用场景: 陕西某工程技术有限公司在一民生工程项目中,需要对公园直饮水进行净化保证其水质。直饮水净化装置需根据用水量不定期的维护,通过统计各个净化装置净化的直饮水的流量,来实现提前维护目的。 应用痛点: 项目…

基于IDEA+MySQL+Tomcat开发的宠物管理系统

基于IDEAMySQLTomcat开发的宠物管理系统 项目介绍💁🏻 宠物管理系统项目背景介绍 随着社会经济的发展和人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,由于缺乏有效的管理系统,宠物饲养面临着许多挑战…

uniapp中进行地图定位

目录 一、创建map 二、data中声明变量 三、获取当前位置信息&#xff0c;进行定位 四、在methods中写移动图标获取地名地址的方法 五、最终展示效果 一、创建map <!-- 地图展示 --><view class"mymap"><!-- <view class"mymap__map"…

数据扩增(Data Augmentation)、正则化(Regularization)和早停止(Early Stopping)

数据扩增&#xff08;Data Augmentation&#xff09;、正则化&#xff08;Regularization&#xff09;和早停止&#xff08;Early Stopping&#xff09;是深度学习中常用的三种技术&#xff0c;它们有助于提高模型的泛化性能和防止过拟合 数据扩增&#xff08;Data Augmentati…

使用Git客户端向gitee免密推送项目代码(保姆级流程哦)

1.进入Git官网手动下载git的客户端可执行程序 一路next即可 2.找到安装路径下的3.进入git-bash 根据如下的代码一次执行只需要修改对应的username和自己再gitee中绑定的邮箱 4.分发私钥到邮箱 产生私钥的时候回车三次即可&#xff1b;查看私钥如下图及正常&#xff1b; 5.进…

VAE模型及pytorch实现

VAE模型及pytorch实现 VAE模型推导部分最小化KL散度推导代码部分损失函数Encoder部分Decoder部分VAE整体架构 VAE问题参考资料 VAE&#xff08;变分自编码器&#xff09;是一种生成模型&#xff0c;结合了自编码器和概率图模型的思想。它通过学习数据的潜在分布&#xff0c;可以…

Rust语言入门教程(十三) - 重要的枚举类型Option与Result

Option 首先&#xff0c;还是再列出Option的定义, 它用于任何可能为空的变量。 enum Option<T> {Some(T),None, }下面的代码展示了如何创建一个空类型&#xff1a; let mut x: Option<i32> None;注意在<>中我们指定了x如果不为空时的关联数据变量类型&am…

利用Spring Boot构建restful web service的详细流程

本文档构建一个简单的restful webservice&#xff0c; 在官网原文Getting Started | Building a RESTful Web Service (spring.io)的基础上进行操作 文章目录 一、项目创建流程1.1 创建项目1.2 创建资源表示类1.3 创建资源控制类 二、项目运行参考资料 一、项目创建流程 本文的…

手写promise A+、catch、finally、all、allsettled、any、race

目录 手写promise 同步版 1.Promise的构造方法接收一个executor()&#xff0c;在new Promise()时就立刻执行executor回调 2.executor()内部的异步任务被放入宏/微任务队列&#xff0c;等待执行 3.状态与结果的管理 状态只能变更一次 4.then()调用成功/失败回调 catch是…

简单测试大语言模型 Yi-34B 的中日英能力

简单测试大语言模型 Yi-34B 的中日英能力 0. 背景1. 中文测试2. 日文测试3. 英文测试 0. 背景 简单测试一下C-Eval 排行榜第一&#xff08;20231129时点&#xff09;的 Yi-34B 的中日英能力&#xff0c; 1. 中文测试 问题1&#xff0c;回答正确。 问题2&#xff0c;回答正确。…

monorepo多项目管理主流实现方式:1.learn + yarn/npm workspace 2.pnpm

npm域级包 随着npm包越来越多&#xff0c;而且包名也只能是唯一的&#xff0c;如果一个名字被别人占了&#xff0c;那你就不能再使用这个名字&#xff1b;假设我想要开发一个utils包&#xff0c;但是张三已经发布了一个utils包&#xff0c;那我的包名就不能叫utils了&#xff…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…

浅谈安科瑞网络电力仪表在斯里兰卡某项目的应用

摘要&#xff1a;安科瑞APM系列网络仪表适用于高低压柜&#xff0c;进线以及出线处的全电量测量及监测。 Absrtact: APM series of network power meter are suitable for full power measurement and monitoring of high and low voltage cabinets, incoming and outgoing li…