Skip to content

Commit f532fcd

Browse files
committed
feat: generate size info
1 parent bd08f05 commit f532fcd

File tree

8 files changed

+103
-25
lines changed

8 files changed

+103
-25
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"build": "node scripts/build.js",
99
"build-dts": "tsc -p tsconfig.build.json && rollup -c rollup.dts.config.js",
1010
"size": "run-s size-global size-baseline",
11-
"size-global": "node scripts/build.js vue runtime-dom -f global -p",
12-
"size-baseline": "node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler && cd packages/size-check && vite build && node brotli",
11+
"size-global": "node scripts/build.js vue runtime-dom -f global -p --size",
12+
"size-baseline": "node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler && node scripts/export-size.js && cd packages/size-check && vite build && node size",
1313
"check": "tsc --incremental --noEmit",
1414
"lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts",
1515
"format": "prettier --write --cache \"**/*.[tj]s?(x)\"",
@@ -77,6 +77,7 @@
7777
"eslint-plugin-jest": "^27.2.1",
7878
"estree-walker": "^2.0.2",
7979
"execa": "^4.0.2",
80+
"export-size": "^0.5.2",
8081
"jsdom": "^21.1.0",
8182
"lint-staged": "^10.2.10",
8283
"lodash": "^4.17.15",
@@ -85,6 +86,7 @@
8586
"minimist": "^1.2.0",
8687
"npm-run-all": "^4.1.5",
8788
"prettier": "^3.0.1",
89+
"pretty-bytes": "^6.1.1",
8890
"pug": "^3.0.1",
8991
"puppeteer": "~19.6.0",
9092
"rollup": "^3.26.0",

packages/size-check/brotli.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/size-check/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "@vue/size-check",
33
"version": "3.3.4",
4+
"type": "module",
45
"private": true,
56
"scripts": {
67
"build": "vite build"

packages/size-check/size.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// @ts-check
2+
import { brotliCompress, gzip } from 'node:zlib'
3+
import { promisify } from 'node:util'
4+
import { readFile, writeFile } from 'node:fs/promises'
5+
import path from 'node:path'
6+
import prettyBytes from 'pretty-bytes'
7+
8+
run()
9+
10+
async function run() {
11+
const file = await readFile('dist/index.js')
12+
13+
const gzipped = await promisify(gzip)(file)
14+
console.log(`gzip: ${prettyBytes(gzipped.length)}`)
15+
16+
const brotli = await promisify(brotliCompress)(file)
17+
console.log(`brotli: ${prettyBytes(brotli.length)}`)
18+
19+
await writeFile(
20+
path.resolve('../../temp/size/_baseline.json'),
21+
JSON.stringify({
22+
size: file.length,
23+
gzip: gzipped.length,
24+
brotli: brotli.length
25+
})
26+
)
27+
}

packages/size-check/vite.config.js renamed to packages/size-check/vite.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
export default {
1+
import { defineConfig } from 'vite'
2+
3+
export default defineConfig({
24
define: {
35
__VUE_PROD_DEVTOOLS__: false,
46
__VUE_OPTIONS_API__: true
@@ -12,4 +14,4 @@ export default {
1214
},
1315
minify: 'terser'
1416
}
15-
}
17+
})

pnpm-lock.yaml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/build.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { cpus } from 'node:os'
2727
import { createRequire } from 'node:module'
2828
import { targets as allTargets, fuzzyMatchTarget } from './utils.js'
2929
import { scanEnums } from './const-enum.js'
30+
import prettyBytes from 'pretty-bytes'
3031

3132
const require = createRequire(import.meta.url)
3233
const args = minimist(process.argv.slice(2))
@@ -38,18 +39,22 @@ const buildTypes = args.withTypes || args.t
3839
const sourceMap = args.sourcemap || args.s
3940
const isRelease = args.release
4041
const buildAllMatching = args.all || args.a
42+
const writeSize = args.size
4143
const commit = execa.sync('git', ['rev-parse', 'HEAD']).stdout.slice(0, 7)
4244

45+
const sizeDir = path.resolve('temp/size')
46+
4347
run()
4448

4549
async function run() {
50+
if (writeSize) await fs.mkdir(sizeDir, { recursive: true })
4651
const removeCache = scanEnums()
4752
try {
4853
const resolvedTargets = targets.length
4954
? fuzzyMatchTarget(targets, buildAllMatching)
5055
: allTargets
5156
await buildAll(resolvedTargets)
52-
checkAllSizes(resolvedTargets)
57+
await checkAllSizes(resolvedTargets)
5358
if (buildTypes) {
5459
await execa(
5560
'pnpm',
@@ -129,39 +134,52 @@ async function build(target) {
129134
)
130135
}
131136

132-
function checkAllSizes(targets) {
137+
async function checkAllSizes(targets) {
133138
if (devOnly || (formats && !formats.includes('global'))) {
134139
return
135140
}
136141
console.log()
137142
for (const target of targets) {
138-
checkSize(target)
143+
await checkSize(target)
139144
}
140145
console.log()
141146
}
142147

143-
function checkSize(target) {
148+
async function checkSize(target) {
144149
const pkgDir = path.resolve(`packages/${target}`)
145-
checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`)
150+
await checkFileSize(`${pkgDir}/dist/${target}.global.prod.js`)
146151
if (!formats || formats.includes('global-runtime')) {
147-
checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`)
152+
await checkFileSize(`${pkgDir}/dist/${target}.runtime.global.prod.js`)
148153
}
149154
}
150155

151-
function checkFileSize(filePath) {
156+
async function checkFileSize(filePath) {
152157
if (!existsSync(filePath)) {
153158
return
154159
}
155160
const file = readFileSync(filePath)
156-
const minSize = (file.length / 1024).toFixed(2) + 'kb'
161+
const fileName = path.basename(filePath)
162+
157163
const gzipped = gzipSync(file)
158-
const gzippedSize = (gzipped.length / 1024).toFixed(2) + 'kb'
159-
const compressed = brotliCompressSync(file)
160-
// @ts-ignore
161-
const compressedSize = (compressed.length / 1024).toFixed(2) + 'kb'
164+
const brotli = brotliCompressSync(file)
165+
162166
console.log(
163-
`${chalk.gray(
164-
chalk.bold(path.basename(filePath))
165-
)} min:${minSize} / gzip:${gzippedSize} / brotli:${compressedSize}`
167+
`${chalk.gray(chalk.bold(fileName))} min:${prettyBytes(
168+
file.length
169+
)} / gzip:${prettyBytes(gzipped.length)} / brotli:${prettyBytes(
170+
brotli.length
171+
)}`
166172
)
173+
174+
if (writeSize)
175+
await fs.writeFile(
176+
path.resolve(sizeDir, `${fileName}.json`),
177+
JSON.stringify({
178+
file: filePath,
179+
size: file.length,
180+
gzip: gzipped.length,
181+
brotli: brotli.length
182+
}),
183+
'utf-8'
184+
)
167185
}

scripts/export-size.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// @ts-check
2+
3+
import { getExportsSize } from 'export-size'
4+
import { mkdir, writeFile } from 'fs/promises'
5+
import path from 'node:path'
6+
7+
const sizeDir = path.resolve('temp/size')
8+
9+
main()
10+
11+
async function main() {
12+
const { exports } = await getExportsSize({
13+
pkg: './packages/vue',
14+
bundler: 'esbuild',
15+
output: false
16+
})
17+
await mkdir(sizeDir, { recursive: true })
18+
await writeFile(
19+
path.resolve(sizeDir, '_exports.json'),
20+
JSON.stringify(exports, null, 2),
21+
'utf-8'
22+
)
23+
}

0 commit comments

Comments
 (0)