微信小程序 限制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 相关文章推荐
需要做特殊处理的DOM元素属性的访问
Nov 05 Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
JavaScript将字符串转换成字符编码列表的方法
Mar 19 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
Apr 06 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
Mar 11 Javascript
jquery插件bootstrapValidator数据验证详解
Nov 09 Javascript
最新Javascript程序员面试试题和解题方法
Nov 23 Javascript
解决vue中post方式提交数据后台无法接收的问题
Aug 11 Javascript
原生js实现each方法实例代码详解
May 27 Javascript
Vue跨域请求问题解决方案过程解析
Aug 07 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中其实也可以用方法链
2011/11/10 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
jQuery操作cookie
2016/08/08 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Python中单例模式总结
2018/02/20 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
自我鉴定范文300字
2013/10/01 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
加拿大留学自荐信
2014/01/28 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
校园环保建议书
2014/05/14 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL