Skip to content

Commit dff001c

Browse files
ilhamsyahidszhengjitf
authored andcommitted
[DevTools] Optimize Images yarn command (part 2) (facebook#21968)
1 parent c13fe4e commit dff001c

File tree

3 files changed

+1460
-32
lines changed

3 files changed

+1460
-32
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import fs from 'fs'
2+
import find from 'find'
3+
import filesize from 'filesize'
4+
import imagemin from 'imagemin'
5+
import imageminGifsicle from 'imagemin-gifsicle'
6+
import imageminJpegtran from 'imagemin-jpegtran'
7+
import imageminOptipng from 'imagemin-optipng'
8+
import imageminSvgo from 'imagemin-svgo'
9+
import parseFilepath from 'parse-filepath'
10+
import chalk from 'chalk'
11+
12+
const plugins = [
13+
imageminGifsicle({}),
14+
imageminJpegtran({}),
15+
imageminOptipng({}),
16+
imageminSvgo({})
17+
]
18+
19+
let savedSize = 0
20+
21+
const run = async () => {
22+
const regex = new RegExp(/\.gif|\.jpeg|\.jpg|\.png$/)
23+
24+
const files = find.fileSync(regex, 'icons/');
25+
26+
for (const file of files) {
27+
await optimized(file)
28+
}
29+
30+
if (savedSize > 0) {
31+
console.info(`\n🎉 You saved ${readableSize(savedSize)}.`)
32+
} else {
33+
console.info(`\n🎉 Nothing to optimize.`)
34+
}
35+
}
36+
37+
const size = (filename) => {
38+
return fs.statSync(filename).size
39+
}
40+
41+
const readableSize = (size) => {
42+
return filesize(size, { round: 5 })
43+
}
44+
45+
const optimized = async (filename) => {
46+
let output = parseFilepath(filename).dir || './'
47+
48+
const fileSizeBefore = size(filename)
49+
50+
if (fileSizeBefore === 0){
51+
console.info(chalk.blue(`Skipping ${filename}, it has ${readableSize(fileSizeBefore)}`))
52+
return
53+
}
54+
55+
const pluginsOptions = {
56+
destination: output,
57+
plugins
58+
}
59+
60+
const filenameBackup = `${filename}.bak`
61+
fs.copyFileSync(filename, filenameBackup)
62+
63+
try {
64+
await imagemin([filename], pluginsOptions)
65+
66+
const fileSizeAfter = size(filename)
67+
const fileSizeDiff = fileSizeBefore - fileSizeAfter
68+
if (fileSizeDiff > 0){
69+
savedSize += fileSizeDiff
70+
console.info(chalk.green(`Optimized ${filename}: ${chalk.yellow(readableSize(fileSizeAfter))}`))
71+
} else { // file after same or bigger
72+
// restore previous file
73+
fs.renameSync(filenameBackup, filename)
74+
75+
console.info(`${filename} ${chalk.red(`already optimized`)}`)
76+
}
77+
78+
} catch (err) {
79+
console.info(chalk.red(`Skip ${filename} due to error when optimizing`));
80+
}
81+
82+
// delete backup file
83+
if (fs.existsSync(filenameBackup)) {
84+
fs.unlinkSync(filenameBackup)
85+
}
86+
}
87+
88+
(async () => {
89+
await run();
90+
})();

packages/react-devtools-extensions/package.json

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"test:chrome": "node ./chrome/test",
1717
"test:firefox": "node ./firefox/test",
1818
"test:edge": "node ./edge/test",
19+
"improve-images": "node ./improveImages.mjs",
1920
"update-mock-source-maps": "node ./src/__tests__/updateMockSourceMaps.js"
2021
},
2122
"devDependencies": {
@@ -33,18 +34,27 @@
3334
"babel-eslint": "^9.0.0",
3435
"babel-loader": "^8.0.4",
3536
"babel-preset-minify": "^0.5.1",
37+
"chalk": "^4.1.1",
3638
"child-process-promise": "^2.2.1",
3739
"chrome-launch": "^1.1.4",
3840
"crx": "^5.0.0",
3941
"css-loader": "^1.0.1",
4042
"file-loader": "^6.1.0",
43+
"filesize": "^6.0.1",
44+
"find": "^0.3.0",
4145
"firefox-profile": "^1.0.2",
4246
"fs-extra": "^4.0.2",
47+
"imagemin": "^8.0.0",
48+
"imagemin-gifsicle": "^7.0.0",
49+
"imagemin-jpegtran": "^6.0.0",
50+
"imagemin-optipng": "^7.0.0",
51+
"imagemin-svgo": "^7.0.0",
4352
"jest-fetch-mock": "^3.0.3",
4453
"node-libs-browser": "0.5.3",
4554
"nullthrows": "^1.0.0",
4655
"open": "^7.0.2",
4756
"os-name": "^3.1.0",
57+
"parse-filepath": "^1.0.2",
4858
"raw-loader": "^3.1.0",
4959
"rollup": "^1.19.4",
5060
"rollup-plugin-babel": "^4.0.1",

0 commit comments

Comments
 (0)