uni微信小程序优化,几行代码就能省100kb的主包空间?
不是标题党,我们公司的项目确确实实是省下了100kb的主包空间,而且还是在没有牺牲任何的性能和业务的前提下实现的。
但是100kb是根据项目大小,所以你用这个插件可能省下超过100kb或者更少。
直接上代码看效果
一个名为fixMiniCssPlugin的插件,在vue.config.js使用它
class fixMiniCssPlugin {
constructor() {}
apply(compiler) {
compiler.hooks.thisCompilation.tap('remo', compilation => {
const {
mainTemplate
} = compilation;
mainTemplate.hooks.localVars.intercept({
register: (tapInfo) => {
if (tapInfo.name === 'mini-css-extract-plugin') {
tapInfo.fn = function (params) {};
}
return tapInfo;
}
});
mainTemplate.hooks.requireEnsure.intercept({
register: (tapInfo) => {
if (tapInfo.name === 'mini-css-extract-plugin') {
tapInfo.fn = function (params) {};
}
return tapInfo;
}
});
});
}
}
module.exports = fixMiniCssPlugin;
vue.config.js直接引用这个插件就可以打包看看项目的主包节省了多少kb
var minicss = require('./src/plugins/fix-mini-css-plugin');
module.exports = {
chainWebpack: config => {
config
.plugin('minicss')
.use(minicss)
},
}
打包如果确实省下了不少的主包空间,你可能还有一些疑问。
是什么原理能省下这么大的空间?
这个插件安不安全,uni官方都没有省下的空间,用这个插件会不会有什么隐藏的问题?
插件实现原理
插件节省的空间来源于dist\build\mp-weixin\common\runtime.js文件,这个文件是webpack运行时使用的文件。
为什么项目里的runtime文件会比uni新建的项目模板里的大很多?看了之后发现是mini-css-extract-plugin往里面插入了大量的组件路径。
不管是主包的还是分包的组件只要写了样式代码都会加入到runtime,所以项目里的组件越多,组件路径越长,runtime越大。
插件安全性
runtime里大量的组件路径到底能不能删?
我通过了以下几点来确认是可以删除的。
1 先在runtime里使用路径的地方打断点,看断点是否生效,如果生效了那就没必要写这个文章了。。。
2 把插入路径的mini-css-extract-plugin这个插件的代码读一遍,这个需要对webpack有一定的了解,
大概的原理是uni把我们平时写的同步import利用ast改写成为异步import,作用是为了让页面和组件不会同时打包成一个文件,
但是也导致了一些副作用,比如说mini-css-extract-plugin这个插件有针对异步css做处理的,所以就把路径加入到了runtime中。
3 把runtime里使用路径的代码读一下,也就是mini-css-extract-plugin插件如何处理异步css的,跟处理异步js是一样的方法,
网上有很多文章我就不扩展了,关键字有document.createElement,看到这里基本就可以确定这段是没用的了,因为微信小程序里
是没用document的,它的加载方式跟网页不一样是分包加载的,所以断点才没进去。
更好的方案
知道了路径可以删除,如何更简单安全的删除我做了一些研究,最后得出的结论就是这个插件方案最好,不感兴趣可以不接着看了。
1 简单粗暴直接利用vue-cli的css.extract配置把mini-css-extract-plugin这个插件关了就好,
结果是uni利用了vue-cli的插件强制把mini-css-extract-plugin打开
2 不信邪,我也写了个vue-cli的插件强制把css.extract配置关闭,结果是确实关闭了mini-css-extract-plugin插件,
但是导致微信的wxss没有了(后面才知道uni是利用这个插件生成wxss),看了uni强制打开的配置是有原因的。。。
3 注释mini-css-extract-plugin的相关源码,自己一个人开发倒是可以,但是团队开发确实不太建议。
uni微信小程序优化,几行代码就能省100kb的主包空间?的更多相关文章
- uni微信小程序优化,多个分包在用的公共代码该放在哪?
公共的代码包括公用的vue组件和js代码,从维护性的角度来说应该放到主包才对, 但是主包有大小限制,如果把2个分包都在用的代码放到主包里面那2M很快就满了. 所以该放在哪?我的方案是从维护的角度放在主 ...
- uni微信小程序优化,打包后的import vue路径是可删除的
这次的优化我公司项目主包只减小了32kb,但是减小的不仅仅是主包,所有分包均在没有改动任何业务代码的情况下完成了压缩空间的优化. 主包分包压缩空间的优化都要视项目而定,32kb只是我公司的小程序项目. ...
- 微信小程序优化
setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口.在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理. 工作原理 小程序的视图层目前使用 ...
- 微信小程序「官方示例代码」浅析【上】
从某个微信群里,拿到了这个IDE的下载地址,然后就有了这个: 根本登不上去,怎么办,怎么办呢? 看代码啊... 反正我又没有保密协议,解压缩一看NodeWebkit + React: 好啦 ,逛逛呗, ...
- 微信小程序背景音乐官方实例代码无效问题解决及音乐src获取方法
最近在学习微信小程序时遇到了个问题:官方的背景音乐的api实例代码中的音乐src不管用(可能有期限,后面的方法获取的src同样可能有期限),因此本人只能自己去寻找办法获取src,现将方法记录在下面.( ...
- 微信小程序模板消息后端代码
利用spring 事件发送模板消息 1.定义事件 import com.ruoyi.project.salerauth.domain.TemplateMessage; import org.sprin ...
- 微信小程序开发——上传代码片段到git仓库
微信开发者工具除了自带的git版本管理(本地服务)之外,还可以推送到在线git仓库中去,这样别人也可以通过git来拉取你的代码片段或小程序. 一.1.登录git 一.2.点击创建项目 一.3.填写项 ...
- 微信小程序上传图片(附后端代码)
几乎每个程序都需要用到图片. 在小程序中我们可以通过image组件显示图片. 当然小程序也是可以上传图片的,微信小程序文档也写的很清楚. 上传图片 首先选择图片 通过wx.chooseImage(OB ...
- 微信小程序 实现多行文字 超出部分省略号显示
在开发小程序: 澳买 的 时候 遇到一个棘手的问题: 当搜索澳洲产品,获取产品列表的时候,有时候产品的名称翻译成中文特别长 我们不能全部在有限的列表里面把产品名都显示出来,这样格式不好控制,显示 出来 ...
随机推荐
- Saving Beans(hud3037)
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- codevs 1300:文件排版(DP)
题目描述 写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序. 完成这个任务最简单的办法是在太短的行中的单 ...
- vue 设置请求超时时间处理
Vue.http.post('http://114.214.164.77:2222/crptorgraphy',{msg:JSON.stringify(req)},{emulateJSON:true, ...
- 编写Java程序,演练匿名内部类应用
返回本章节 返回作业目录 需求说明: 定义一个抽象类 Bird,创建使用匿名内部类的操作类Action. 实现思路: 定义抽象类Bird.在其中定义一个String类型的name属性,一个返回类型是i ...
- x86-1-32位x86 处理器编程架构
x86(32位)-1-32位x86 处理器编程架构 Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit) x86是指intel的86系列的CPU统称,比如 ...
- Log4j2进阶使用(Pattern Layout详细设置)
1.进阶说明 通过配置Layout打印格式化的日志, Log4j2支持很多的Layouts: CSV GELF HTML JSON Pattern Serialized Syslog XML YAML ...
- Swoole 中使用 Atomic 实现进程间无锁计数器
使用示例: $atomic = new Swoole\Atomic(); $serv = new Swoole\Server('127.0.0.1', '9501'); $serv->set([ ...
- Java时间格式化原来这么多玩法
时间过得真是快,现在已经是2022年了.作为开发来说,时间处理是非常繁琐的.从Java 8开始有了新的时间API.时间的处理更加优雅,不再需要借助三方类库,而且线程安全.今天来梳理一下新API的格式化 ...
- 原型模式(python)
原型模式也叫克隆模式,通过拷贝自身的属性来创建一个新的对象,基本方法就是调用copy模块下的 (浅拷贝)copy() 和(深拷贝)deepcopy() #!/usr/bin/env python3 # ...
- react中prop-types的使用
什么是prop-types?prop代表父组件传递过来的值,types代表类型.简单来说就是用来校验父组件传递过来值的类型 import PropTypes from 'prop-types'; To ...