Skip to content

Commit 16b76ac

Browse files
committed
fix: size checking scripts
1 parent 0053f2e commit 16b76ac

File tree

8 files changed

+160
-11
lines changed

8 files changed

+160
-11
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,12 @@
3131
"build:sourcemap": "pnpm build --sourcemap",
3232
"build:type": "./scripts/build.sh",
3333
"build:typed": "pnpm build core-base vue-i18n-core --withTypes",
34-
"check-install": "tsx ./scripts/playwright.ts",
34+
"size": "tsx ./scripts/build.ts --size && tsx ./scripts/size.ts",
3535
"clean": "run-p clean:*",
3636
"clean:coverage": "rm -rf ./coverage",
3737
"clean:dist": "rm -rf ./dist ./packages/**/dist ./docs/.vitepress/dist",
3838
"clean:docs": "trash './docs/api/!(injection).md'",
3939
"clean:type": "rm -rf ./temp",
40-
"coverage": "opener coverage/index.html",
4140
"dev": "tsx ./scripts/dev.ts",
4241
"dev:e2e": "cross-env TZ=UTC vitest -c ./vitest.e2e.config.ts",
4342
"dev:eslint": "npx @eslint/config-inspector",
@@ -73,6 +72,8 @@
7372
"preview:size-petite-vue-i18n": "pnpm --filter @intlify/size-check-petite-vue-i18n preview",
7473
"preview:size-vue-i18n": "pnpm --filter @intlify/size-check-vue-i18n preview",
7574
"release": "bumpp package.json packages/**/package.json --commit \"release: v\" --push --tag",
75+
"check-install": "tsx ./scripts/playwright.ts",
76+
"coverage": "opener coverage/index.html",
7677
"test": "run-s lint test:cover check-install test:e2e",
7778
"test:cover": "pnpm test:unit --coverage",
7879
"test:e2e": "cross-env TZ=UTC vitest run -c ./vitest.e2e.config.ts",
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { brotliCompressSync, gzipSync } from 'node:zlib'
2+
import { build } from 'vite'
3+
4+
const generated = await build({
5+
logLevel: 'silent',
6+
build: {
7+
minify: true
8+
}
9+
})
10+
const bundled = generated.output[0].code
11+
12+
const size = bundled.length
13+
const gzip = gzipSync(bundled).length
14+
const brotli = brotliCompressSync(bundled).length
15+
16+
const report = {
17+
name: '@intlify/core',
18+
size,
19+
gzip,
20+
brotli
21+
}
22+
console.log(JSON.stringify(report))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { brotliCompressSync, gzipSync } from 'node:zlib'
2+
import { build } from 'vite'
3+
4+
const generated = await build({
5+
logLevel: 'silent',
6+
build: {
7+
minify: true
8+
}
9+
})
10+
const bundled = generated.output[0].code
11+
12+
const size = bundled.length
13+
const gzip = gzipSync(bundled).length
14+
const brotli = brotliCompressSync(bundled).length
15+
16+
const report = {
17+
name: 'petite-vue-i18n',
18+
size,
19+
gzip,
20+
brotli
21+
}
22+
console.log(JSON.stringify(report))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { brotliCompressSync, gzipSync } from 'node:zlib'
2+
import { build } from 'vite'
3+
4+
const generated = await build({
5+
logLevel: 'silent',
6+
build: {
7+
minify: true
8+
}
9+
})
10+
const bundled = generated.output[0].code
11+
12+
const size = bundled.length
13+
const gzip = gzipSync(bundled).length
14+
const brotli = brotliCompressSync(bundled).length
15+
16+
const report = {
17+
name: 'vue-i18n',
18+
size,
19+
gzip,
20+
brotli
21+
}
22+
console.log(JSON.stringify(report))

scripts/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
set -e
44

5-
pnpm build --withTypes --size
5+
pnpm build --withTypes
66

77
tsx ./scripts/postprocess.ts

scripts/build.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import pc from 'picocolors'
2727
import {
2828
targets as allTargets,
2929
checkSizeDistFiles,
30+
displaySize,
3031
fuzzyMatchTarget,
3132
readJson
3233
} from './utils'
@@ -282,16 +283,12 @@ async function main() {
282283
const file = await fs.readFile(filePath)
283284
const filename = path.basename(filePath)
284285

285-
const minSize = (file.length / 1024).toFixed(2) + 'kb'
286286
const gzipped = gzipSync(file)
287-
const gzippedSize = (gzipped.length / 1024).toFixed(2) + 'kb'
288-
const compressed = brotliCompressSync(file)
289-
const compressedSize =
290-
compressed != null ? (compressed.length / 1024).toFixed(2) + 'kb' : 'N/A'
287+
const brotli = brotliCompressSync(file)
291288
console.log(
292-
`📦 ${pc.gray(
289+
`📦 ${pc.green(
293290
pc.bold(path.basename(filePath))
294-
)} min:${minSize} / gzip:${gzippedSize} / brotli:${compressedSize}`
291+
)} - min: ${displaySize(file.length)} / gzip: ${displaySize(gzipped.length)} / brotli: ${displaySize(brotli.length)}`
295292
)
296293

297294
if (size) {
@@ -300,7 +297,7 @@ async function main() {
300297
file: filename,
301298
size: file.length,
302299
gzip: gzipped.length,
303-
brotli: compressed.length
300+
brotli: brotli.length
304301
},
305302
null,
306303
2

scripts/size.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { spawnSync } from 'node:child_process'
2+
import { promises as fs } from 'node:fs'
3+
import path from 'node:path'
4+
import { fileURLToPath } from 'node:url'
5+
import pc from 'picocolors'
6+
import { displaySize, sizeTargets } from './utils'
7+
8+
const __dirname = fileURLToPath(new URL('.', import.meta.url))
9+
const sizeDir = path.resolve(__dirname, '../temp/size')
10+
11+
type BundleReport = {
12+
name: string
13+
size: number
14+
gzip: number
15+
brotli: number
16+
}
17+
18+
async function main() {
19+
console.log('📏 Checking bundle sizes ...')
20+
console.log()
21+
const targets = await sizeTargets()
22+
const results: BundleReport[] = []
23+
for (const target of targets) {
24+
const root = path.resolve(__dirname, `../packages/${target}`)
25+
results.push(bundle(root))
26+
}
27+
28+
for (const result of results) {
29+
console.log(
30+
`${pc.green(pc.bold(result.name))} - ` +
31+
`min: ${displaySize(result.size)} / ` +
32+
`gzip: ${displaySize(result.gzip)} / ` +
33+
`brotli: ${displaySize(result.brotli)}`
34+
)
35+
}
36+
37+
await fs.mkdir(sizeDir, { recursive: true })
38+
await fs.writeFile(
39+
path.resolve(sizeDir, '_usages.json'),
40+
JSON.stringify(Object.fromEntries(results.map(r => [r.name, r])), null, 2),
41+
'utf-8'
42+
)
43+
}
44+
45+
function bundle(target: string) {
46+
const orgDir = process.cwd()
47+
process.chdir(target)
48+
const result = spawnSync('node', ['scripts/size.mjs'])
49+
process.chdir(orgDir)
50+
return JSON.parse(result.stdout.toString()) as BundleReport
51+
}
52+
53+
main().catch(err => {
54+
console.error(err)
55+
process.exit(1)
56+
})

scripts/utils.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@ export const fuzzyMatchTarget = async (
5454
}
5555
}
5656

57+
export async function sizeTargets() {
58+
const packages = await fs.readdir('packages')
59+
const files = await Promise.all(
60+
packages.map(async f => {
61+
const stat = await fs.stat(`packages/${f}`)
62+
if (!stat.isDirectory()) {
63+
return ''
64+
}
65+
const pkg = await readJson(
66+
resolve(dirname(''), `./packages/${f}/package.json`)
67+
)
68+
if (!pkg.private) {
69+
return ''
70+
}
71+
return f
72+
})
73+
)
74+
return files.filter((_, f) => files[f]).filter(f => /size-check/.test(f))
75+
}
76+
5777
export async function checkSizeDistFiles(target: string) {
5878
const dirs = await fs.readdir(`${target}/dist`)
5979
// prettier-ignore
@@ -67,3 +87,12 @@ export async function readJson(path: string) {
6787
const data = await fs.readFile(path, 'utf8')
6888
return JSON.parse(data)
6989
}
90+
91+
const NUMBER_FORMATTER = new Intl.NumberFormat('en', {
92+
maximumFractionDigits: 2,
93+
minimumFractionDigits: 2
94+
})
95+
96+
export function displaySize(bytes: number) {
97+
return `${NUMBER_FORMATTER.format(bytes / 1000)} kB`
98+
}

0 commit comments

Comments
 (0)