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


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 相关文章推荐
JS 强制设为首页的代码
Jan 31 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
Bootstrap源码解读导航条(7)
Dec 23 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
使用ES6语法重构React代码详解
May 09 Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
Dec 25 Javascript
原生JavaScript实现刮刮乐
Sep 29 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 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
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
JS实现分页导航效果
2020/02/19 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
使用python实现省市三级菜单效果
2016/01/20 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
哪些是python中web开发框架
2020/06/17 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
学生党员思想汇报
2013/12/28 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
业务总经理岗位职责
2014/02/03 职场文书
开业庆典策划方案
2014/02/18 职场文书
学校消防演习方案
2014/02/19 职场文书
效能风暴心得体会
2014/09/04 职场文书
群众路线对照检查材料
2014/09/22 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers