123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- module.exports = function formatStats (stats, dir, api) {
- const fs = require('fs')
- const path = require('path')
- const zlib = require('zlib')
- const ui = require('cliui')({ width: process.stdout.columns || 80 })
- const { chalk } = require('@vue/cli-shared-utils')
- const json = stats.toJson({
- hash: false,
- modules: false,
- chunks: false
- })
- let assets = json.assets
- ? json.assets
- : json.children.reduce((acc, child) => acc.concat(child.assets), [])
- const seenNames = new Map()
- const isJS = val => /\.js$/.test(val)
- const isCSS = val => /\.css$/.test(val)
- const isMinJS = val => /\.min\.js$/.test(val)
- assets = assets
- .map(a => {
- a.name = a.name.split('?')[0]
- return a
- })
- .filter(a => {
- if (seenNames.has(a.name)) {
- return false
- }
- seenNames.set(a.name, true)
- return isJS(a.name) || isCSS(a.name)
- })
- .sort((a, b) => {
- if (isJS(a.name) && isCSS(b.name)) return -1
- if (isCSS(a.name) && isJS(b.name)) return 1
- if (isMinJS(a.name) && !isMinJS(b.name)) return -1
- if (!isMinJS(a.name) && isMinJS(b.name)) return 1
- return b.size - a.size
- })
- function formatSize (size) {
- return (size / 1024).toFixed(2) + ' KiB'
- }
- function getGzippedSize (asset) {
- const filepath = api.resolve(path.join(dir, asset.name))
- const buffer = fs.readFileSync(filepath)
- return formatSize(zlib.gzipSync(buffer).length)
- }
- function makeRow (a, b, c) {
- return ` ${a}\t ${b}\t ${c}`
- }
- ui.div(
- makeRow(
- chalk.cyan.bold(`File`),
- chalk.cyan.bold(`Size`),
- chalk.cyan.bold(`Gzipped`)
- ) + `\n\n` +
- assets.map(asset => makeRow(
- /js$/.test(asset.name)
- ? chalk.green(path.join(dir, asset.name))
- : chalk.blue(path.join(dir, asset.name)),
- formatSize(asset.size),
- getGzippedSize(asset)
- )).join(`\n`)
- )
- return `${ui.toString()}\n\n ${chalk.gray(`Images and other types of assets omitted.`)}\n`
- }
|