微信小程序 限制1M的瘦身技巧与方法详解


Posted in Javascript onJanuary 06, 2017

微信小程序瘦身方法:

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

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

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

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

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

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

在JavaScript代码层面,请审慎的考虑你的代码逻辑,不要把一个很简单的逻辑洋洋洒洒的写了一大堆,请优化和精简你的代码。

在视图层面,尽量避免不必要的组件嵌套,能用一个view做到的,就不要再多套一层view。这对减少代码尺寸和代码性能都是有好处的:)

使用工具压缩优化代码

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

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

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

JSON文件

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

JavaScript文件

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

WXML文件

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

WXSS文件

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

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 编程笔记 无名函数
Jun 28 Javascript
js常用数组操作方法简明总结
Jun 20 Javascript
jQuery中first()方法用法实例
Jan 06 Javascript
jQuery的实例及必知重要的jQuery选择器详解
May 20 Javascript
JavaScript实现打开链接页面的方式汇总
Jun 02 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
JS分页的实现(同步与异步)
Sep 16 Javascript
深入理解js 中async 函数的含义和用法
May 13 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
vue-列表下详情的展开与折叠案例
Jul 28 Javascript
Javascript新手入门之字符串拼接与变量的应用
Dec 03 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 #Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 #Javascript
JS调用Android、Ios原生控件
Jan 06 #Javascript
JS正则匹配中文的方法示例
Jan 06 #Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
Jan 06 #Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 #Javascript
JavaScript用JSONP跨域请求数据实例详解
Jan 06 #Javascript
You might like
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
PHP中的类型约束介绍
2015/05/11 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python线程指南详细介绍
2017/01/05 Python
Python MD5加密实例详解
2017/08/02 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
python中最小二乘法详细讲解
2021/02/19 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
JBL英国官网:JBL UK
2018/07/04 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
综合实践教学反思
2014/01/31 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
社会实践活动总结报告
2014/04/29 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
民用住房租房协议书
2014/10/29 职场文书
Pandas数据结构之Series的使用
2022/03/31 Python