经过对大致积文本的优化,总的体积减小了不到100KB,能够说是杯水车薪,看来仍是要从大户图片上面下手,分三个方向去处理:css
由于小程序的css文件内不容许使用本地图片,因此只须要查找html里面的引入的图片地址,再加上tab中定义的图标。以 wepy 构建的项目为例,首先,获取页面上使用了哪些图片:html
/** * 读取pages目录下面的页面文件 * * @returns {Promise} 读取到的.wpy文件 */ function getPages() { return new Promise((resolve, reject)=>{ fs.readdir(path.resolve('../src/pages/'), (err, files)=>{ if(err){ reject(err) } resolve(files) }) }) } /** * 从页面字符串中提取图片 * * @param {string} fileName 页面文件名字 * @returns {Promise} 页面提取出的图片 src 数组 */ function getImagesFormPages(fileName) { return new Promise((resolve, reject)=>{ fs.readFile(path.join('../src/pages/', fileName), (err, data)=>{ if(err){ reject(err) } let fileData = data.toString(); let imgReg = /<image.*?(?:>|\/>)/gim; var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; let images = fileData.match(imgReg) let imagePathArray = null; if(images){ imagePathArray = images.map(item=>{ var src = item.match(srcReg); return src[1] }) } resolve({ fileName: fileName, fileData: imagePathArray }) }) }) } /** * 从页面中获取图片 * * @returns */ async function getUsedImages () { let pages = await getPages(); let data = await Promise.all(pages.map(page=>{ return getImagesFormPages(page) })) return data }
再加上tab中定义的图标vue
const tabImages = [ '../images/icon_st_nor@2x.png', '../images/icon_st_sel@2x.png', '../images/icon_tk_nor@2x.png', '../images/icon_tk_sel@2x.png', '../images/icon_wd_nor@2x.png', '../images/icon_wd_sel@2x.png', ];
再获取资源文件夹下面的所有图片小程序
/** * 获取资源文件夹下面的图片 * * @returns */ function getAssets(){ return new Promise((resolve, reject)=>{ glob("../src/images/**/*.{png,jpg}", {}, function (err, files) { if(err){ reject(err) } resolve(files); }) }) }
再进行一个比对,把在资源目录,而不在html和tab中使用的图片,移动到外部文件夹里面去数组
const fs = require('fs') const path = require('path') const glob = require("glob") let find = async ()=>{ // 查找资源目录下的图片 let allImages = await getAssets(); // 查找模板中引用的图片 let usedImages = await getUsedImages(); usedImages = usedImages .filter(i=>i.fileData) // 提取图片数组 .reduce((a,b)=>a = a.concat(b.fileData), []) // 转化为一维数组 .filter(i=>i.charAt(0)!=='{') // 删除无效图片 .map(i=>path.resolve('../src/pages/', i)) // 处理图片路径 return allImages.filter(image=>{ return usedImages.indexOf(path.resolve('', image)) === -1 }) } find().then(data=>{ // 找到未使用的图片,移动到外部文件夹,避免再次打包 if(!fs.existsSync('../un-use-images')){ fs.mkdirSync('../un-use-images', 0777); } data.forEach(file=>{ let name = file.split('/').pop(); fs.writeFileSync('../un-use-images/'+name, fs.readFileSync(file)); fs.unlinkSync(file); }) })
能够经过 imagemin
库或者软件对图片文件进行批量压缩,我测验的结果是从1.08MB图片压缩到了648KB,效果很是的显著。async
从设计层面也能够减小很多图片的使用,好比等级从lv1-lv9, 若是设计为反色镂空,用背景色来区分等级,那么最多能够节约8张图片。优化
其实图片文件经过手动的方式清理和压缩很是的不方便,可是小程序自己和wepy都没有提供按引入文件打包的功能,接下来我会尝试用 mpvue
重构代码,看能不能作到自动化。ui