├── .gitignore ├── README.md ├── images ├── after.png ├── before.png ├── rick.png └── rick_shrink.png ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | yarn-error.log 3 | .node-version 4 | coverage 5 | .nyc_output 6 | .idea 7 | dist/ 8 | .vscode/ 9 | !.vscode/cSpell.json 10 | npm-debug.log 11 | .DS_Store 12 | render*.gif 13 | pretty.yml 14 | package-lock.json -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # imageShrink [![npm version](https://badge.fury.io/js/super-image-shrink.svg)](//npmjs.com/package/super-image-shrink) 3 | reduce image size of your project by 60% seamlessly 4 | 5 | 6 | ## Install 7 | ``` 8 | npm install super-image-shrink 9 | ``` 10 | 11 | ## Usage 12 | in your package.json, add a line in scripts 13 | you can change 'src' to your target directory 14 | ``` 15 | { 16 | ... 17 | "scripts": { 18 | "shrink": "node node_modules/super-image-shrink src" 19 | }, 20 | ... 21 | } 22 | ``` 23 | 24 | in your project directory 25 | ``` 26 | npm run shrink 27 | ``` 28 | 29 | 30 | ## Result 31 | ##### before 32 | ![before](https://github.com/L-x-C/imageShrink/blob/master/images/before.png) 33 | 34 | ##### after 35 | ![after](https://github.com/L-x-C/imageShrink/blob/master/images/after.png) 36 | 37 | ##### before 38 | ![rick](https://github.com/L-x-C/imageShrink/blob/master/images/rick.png) 258kb 39 | 40 | ##### after 41 | ![rick_shrink](https://github.com/L-x-C/imageShrink/blob/master/images/rick_shrink.png) 42kb 42 | 43 | at least i can't see any difference with my eyes -------------------------------------------------------------------------------- /images/after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L-x-C/imageShrink/e31e74dd5af4da745896dde4b042005099b3723a/images/after.png -------------------------------------------------------------------------------- /images/before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L-x-C/imageShrink/e31e74dd5af4da745896dde4b042005099b3723a/images/before.png -------------------------------------------------------------------------------- /images/rick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L-x-C/imageShrink/e31e74dd5af4da745896dde4b042005099b3723a/images/rick.png -------------------------------------------------------------------------------- /images/rick_shrink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/L-x-C/imageShrink/e31e74dd5af4da745896dde4b042005099b3723a/images/rick_shrink.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const imagemin = require('imagemin'); 3 | const imageminPngquant = require('imagemin-pngquant'); 4 | const imageminJpegtran = require('imagemin-jpegtran'); 5 | const rmdir = require('rimraf'); 6 | 7 | function imgShrink(dir) { 8 | return new Promise((imgResolve, imgReject) => { 9 | fs.readdir(dir, (err, files) => { 10 | if (err) { 11 | throw err; 12 | } 13 | let actions = [] 14 | files.forEach((file) => { 15 | let action = () => { 16 | return new Promise((resolve, reject) => { 17 | var _src = `${dir}/${file}` 18 | fs.stat(_src, async (err, st) => { 19 | if (err) { 20 | throw err; 21 | } 22 | // 判断是否为文件 23 | if (st.isFile()) { 24 | if (file.includes('.png') || file.includes('.jpg')) { 25 | let dest = dir.split('/').splice(1).join('/') 26 | const newPic = await imagemin([_src], { 27 | destination: `_imageShrink/${dest}`, 28 | plugins: [ 29 | imageminJpegtran(), 30 | imageminPngquant({ 31 | quality: [0.6, 0.8] 32 | }) 33 | ] 34 | }); 35 | 36 | fs.unlinkSync(_src); 37 | fs.renameSync(newPic[0].destinationPath, _src) 38 | 39 | resolve() 40 | } else { 41 | resolve() 42 | } 43 | } else if (st.isDirectory()) { 44 | imgShrink(_src).then(() => { 45 | resolve() 46 | }); 47 | } 48 | }); 49 | }) 50 | } 51 | actions.push(action()) 52 | }); 53 | Promise.all(actions).then(() => { 54 | imgResolve() 55 | }); 56 | }); 57 | }) 58 | } 59 | 60 | const targetDir = process.argv[2] || 'src' 61 | imgShrink(`./${targetDir}`).then(res => { 62 | rmdir('./_imageShrink', () => { 63 | console.log('imageShrink done') 64 | }) 65 | }) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "super-image-shrink", 3 | "version": "1.0.2", 4 | "description": "reduce image size of your project by 70% seamlessly", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/L-x-C/imageShrink.git" 12 | }, 13 | "keywords": [ 14 | "image", 15 | "shrink", 16 | "reduce" 17 | ], 18 | "author": "lxc", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/L-x-C/imageShrink/issues" 22 | }, 23 | "homepage": "https://github.com/L-x-C/imageShrink#readme", 24 | "dependencies": { 25 | "imagemin": "^7.0.1", 26 | "imagemin-jpegtran": "^6.0.0", 27 | "imagemin-pngquant": "^8.0.0", 28 | "rimraf": "^2.6.2" 29 | } 30 | } 31 | --------------------------------------------------------------------------------