微信小程序 限制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 相关文章推荐
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
jQuery中hover方法和toggle方法使用指南
Feb 27 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
jqGrid表格应用之新增与删除数据附源码下载
Dec 02 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
Angularjs中使用layDate日期控件示例
Jan 11 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
微信小程序 简易计算器实现代码实例
Sep 02 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
Jan 17 Javascript
js+css3实现简单时钟特效
Sep 13 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中反射的应用
2013/06/18 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
Js中sort()方法的用法
2006/11/04 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
python对象及面向对象技术详解
2016/07/19 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
python 实现超级玛丽游戏
2020/11/25 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
公司承诺书范文
2014/05/19 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
诚信承诺书
2015/01/19 职场文书
商务英语求职信范文
2015/03/19 职场文书
起诉书范文
2015/05/20 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
python垃圾回收机制原理分析
2022/04/13 Python
python神经网络Xception模型
2022/05/06 Python