微信小程序 限制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 相关文章推荐
模拟用户操作Input元素,不会触发相应事件
May 11 Javascript
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
js网页侧边随页面滚动广告效果实现
Apr 14 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
Nov 15 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
九种js弹出对话框的方法总结
Mar 12 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
微信小程序 教程之引用
Oct 18 Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
vue模仿网易云音乐的单页面应用
Apr 24 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
Python实现FM算法解析
2019/06/18 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
python中四舍五入的正确打开方式
2021/01/18 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
《动手做做看》教学反思
2014/04/09 职场文书
全运会口号
2014/06/20 职场文书
供电工程专业求职信
2014/08/09 职场文书
学习作风建设心得体会
2014/10/22 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
导游词之河北野三坡
2019/12/11 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
delete in子查询不走索引问题分析
2022/07/07 MySQL