为你的微信小程序体积瘦身详解


Posted in Javascript onMay 20, 2017

前言

众所周知,微信小程序在发布的时候,对提交的代码有1M大小的限制!所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及这个底线了。

在设计一个小程序之初,我们就需要重点考虑这一点,采取一些方法,来避免太早的遭遇这个问题。

避免使用本地大图片、大资源文件

  • 请避免在小程序的UI上使用大图片,应该尽可能的通过颜色样式来装点你的小程序
  • 或者,使用小而精致的小图标来点缀
  • 如果实在想用大图片,那请不要将图片放进小程序的本地代码中,应该采用从一个远程URL地址加载图片的方式

这样就可以避免把大图片、大资源文件等打包进小程序的发布包中去了。

不要让你的代码太???/strong>

在JavaScript代码层面,请审慎的考虑你的代码逻辑,不要把一个很简单的逻辑洋洋洒洒的写了一大堆,请优化和精简你的代码。
在视图层面,尽量避免不必要的组件嵌套,能用一个view做到的,就不要再多套一层view。这对减少代码尺寸和代码性能都是有好处的:)

使用工具压缩优化代码

在当今HTML5等Web前端项目的开发和发布中,我们通常会通过使用一些前端工程化工具来处理我们的代码,比如使用Gulp,结合一些功能插件,如:uglify, cssnano, htmlmin等。使用这些工具,可以让我们的代码尺寸小上那么一大截(约20%~30%)。

而幸运的是,这些工具对小程序开发来说,也完全管用!通过简单的使用这些工具,就能让我们的代码减小那么多,何乐而不为呢?!

在小程序中,我们大致有这么几类可以使用工具进行优化的文件:

1、JSON文件

我们可以使用jsonminify来压缩JSON文件,去处JSON文件中多余的空格

2、JavaScript文件

使用uglify,对JS代码进行语法优化和文本压缩

3、WXML文件

使用htmlmin,可以对WXML文件中多余的空格,注释等进行清理

4、WXSS文件

可以使用LESS提供的特性,对小程序中的全局WXSS进行合并;使用cssnano对WXSS文件进行清理和压缩;使用autoprefixer对WXSS添加不同环境下的前缀,达到良好的兼容性

5、Image文件

通过使用imagemin,可以用来优化图片文件的大小

以下是一个我自己用的Gulp脚本,可以供大家参考一下:

package.json

{
 "name": "myproject",
 "version": "1.0.0",
 "description": "my project",
 "author": "Kevin Zhang <zarknight@gmail.com>",
 "scripts": {
 "build:prod": "gulp build:prod",
 "build:clean": "gulp build:clean",
 "watch:clean": "gulp watch:clean",
 "start": "npm run watch:clean"
 },
 "devDependencies": {
 "autoprefixer": "^6.6.0",
 "babel-eslint": "^7.1.1",
 "babel-preset-latest": "^6.16.0",
 "del": "^2.2.2",
 "gulp": "^3.9.1",
 "gulp-babel": "^6.1.2",
 "gulp-cssnano": "^2.1.2",
 "gulp-eslint": "^3.0.1",
 "gulp-htmlmin": "^3.0.0",
 "gulp-if": "^2.0.2",
 "gulp-jsonlint": "^1.2.0",
 "gulp-jsonminify": "^1.0.0",
 "gulp-less": "^3.3.0",
 "gulp-load-plugins": "^1.4.0",
 "gulp-postcss": "^6.2.0",
 "gulp-rename": "^1.2.2",
 "gulp-sourcemaps": "^2.2.1",
 "gulp-uglify": "^2.0.0",
 "run-sequence": "^1.2.2"
 }
}

gulpfile.js

const gulp = require('gulp')
const del = require('del')
const runSequence = require('run-sequence')
const autoprefixer = require('autoprefixer')
const $ = require('gulp-load-plugins')()

let prod = false

// -------------------- Clean --------------------------

gulp.task('clean', () => {
 return del(['./dist/**'])
})

// -------------------- Lint ---------------------------

gulp.task('eslint', () => {
 return gulp.src(['./src/**/*.js'])
 .pipe($.eslint())
 .pipe($.eslint.format())
 .pipe($.eslint.failAfterError())
})

gulp.task('jsonlint', () => {
 return gulp.src(['./src/**/*.json'])
 .pipe($.jsonlint())
 .pipe($.jsonlint.reporter())
 .pipe($.jsonlint.failAfterError())
})

// -------------------- JSON ---------------------------

gulp.task('json', ['jsonlint'], () => {
 return gulp.src('./src/**/*.json')
 .pipe($.if(prod, $.jsonminify()))
 .pipe(gulp.dest('./dist'))
})

gulp.task('json:watch', () => {
 gulp.watch('./src/**/*.json', ['json'])
})

// -------------------- Assets --------------------------

gulp.task('assets', () => {
 return gulp.src('./src/assets/**')
 .pipe(gulp.dest('./dist/assets'))
})

gulp.task('assets:watch', () => {
 gulp.watch('./src/assets/**', ['assets'])
})

// -------------------- WXML -----------------------------

gulp.task('templates', () => {
 return gulp.src('./src/**/*.wxml')
 .pipe($.if(prod, $.htmlmin({
 collapseWhitespace: true,
 removeComments: true,
 keepClosingSlash: true
 })))
 .pipe(gulp.dest('./dist'))
})

gulp.task('templates:watch', () => {
 gulp.watch('./src/**/*.wxml', ['templates'])
})

// -------------------- WXSS ------------------------------

gulp.task('styles', () => {
 return gulp.src(['./src/**/*.wxss', '!./src/styles/**'])
 .pipe($.less())
 .pipe($.postcss([
 autoprefixer([
 'iOS >= 8',
 'Android >= 4.1'
 ])
 ]))
 .pipe($.if(prod, $.cssnano()))
 .pipe($.rename((path) => path.extname = '.wxss'))
 .pipe(gulp.dest('./dist'))
})

gulp.task('styles:watch', () => {
 gulp.watch('./src/**/*.wxss', ['styles'])
})

// -------------------- JS --------------------------------

gulp.task('scripts', ['eslint'], () => {
 return gulp.src('./src/**/*.js')
 .pipe($.babel())
 .pipe($.if(prod, $.uglify()))
 .pipe(gulp.dest('./dist'))
})

gulp.task('scripts:watch', () => {
 gulp.watch('./src/**/*.js', ['scripts'])
})

// ---------------------------------------------------------

gulp.task('build', [
 'json',
 'assets',
 'templates',
 'styles',
 'scripts'
])

gulp.task('watch', [
 'json:watch',
 'assets:watch',
 'templates:watch',
 'styles:watch',
 'scripts:watch'
])

gulp.task('build:clean', (callback) => {
 runSequence('clean', 'build', callback)
})

gulp.task('watch:clean', (callback) => {
 runSequence('build:clean', 'watch', callback)
})

gulp.task('build:prod', (callback) => {
 prod = true
 runSequence('build:clean', callback)
})

gulp.task('default', ['watch:clean'])

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JQuery 插件制作实践 xMarquee插件V1.0
Apr 02 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
JS小功能(button选择颜色)简单实例
Nov 29 Javascript
jquery操作select方法汇总
Feb 05 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
最新最热最实用的15个jQuery插件汇总
Jul 05 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
Aug 14 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 Javascript
Node.js 中判断一个文件是否存在
Aug 24 Javascript
React实现评论的添加和删除
Oct 20 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 #jQuery
使用node.js搭建服务器
May 20 #Javascript
layui表格实现代码
May 20 #Javascript
微信小程序新增的拖动组件movable-view使用教程
May 20 #Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 #jQuery
深入理解Angularjs中$http.post与$.post
May 19 #Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 #jQuery
You might like
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python如何在终端里面显示一张图片
2016/08/17 Python
Python实现基本线性数据结构
2016/08/22 Python
python 实现敏感词过滤的方法
2019/01/21 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
采购内勤岗位职责
2013/12/10 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
母亲节寄语大全
2015/02/27 职场文书
中学社团活动总结
2015/05/07 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL