feat: better build command output

pull/136/head
Evan You 5 years ago
parent bab1391e82
commit e435eec94a

@ -75,6 +75,7 @@
"markdown-it-emoji": "^1.4.0", "markdown-it-emoji": "^1.4.0",
"markdown-it-table-of-contents": "^0.4.4", "markdown-it-table-of-contents": "^0.4.4",
"minimist": "^1.2.5", "minimist": "^1.2.5",
"ora": "^5.1.0",
"prismjs": "^1.20.0", "prismjs": "^1.20.0",
"slash": "^3.0.0", "slash": "^3.0.0",
"vite": "^1.0.0-rc.9", "vite": "^1.0.0-rc.9",

@ -1,9 +1,10 @@
import fs from 'fs-extra' import fs from 'fs-extra'
import { bundle } from './bundle' import { bundle, okMark, failMark } from './bundle'
import { BuildConfig as ViteBuildOptions } from 'vite' import { BuildConfig as ViteBuildOptions } from 'vite'
import { resolveConfig } from '../config' import { resolveConfig } from '../config'
import { renderPage } from './render' import { renderPage } from './render'
import { OutputChunk, OutputAsset } from 'rollup' import { OutputChunk, OutputAsset } from 'rollup'
import ora from 'ora'
export type BuildOptions = Pick< export type BuildOptions = Pick<
Partial<ViteBuildOptions>, Partial<ViteBuildOptions>,
@ -16,41 +17,54 @@ export type BuildOptions = Pick<
export async function build(buildOptions: BuildOptions = {}) { export async function build(buildOptions: BuildOptions = {}) {
process.env.NODE_ENV = 'production' process.env.NODE_ENV = 'production'
const siteConfig = await resolveConfig(buildOptions.root) const siteConfig = await resolveConfig(buildOptions.root)
try { try {
const [clientResult, , pageToHashMap] = await bundle( const [clientResult, , pageToHashMap] = await bundle(
siteConfig, siteConfig,
buildOptions buildOptions
) )
console.log('rendering pages...')
const spinner = ora()
const appChunk = clientResult.assets.find( spinner.start('rendering pages...')
(chunk) =>
chunk.type === 'chunk' && chunk.fileName.match(/^app\.\w+\.js$/) try {
) as OutputChunk const appChunk = clientResult.assets.find(
(chunk) =>
const cssChunk = clientResult.assets.find( chunk.type === 'chunk' && chunk.fileName.match(/^app\.\w+\.js$/)
(chunk) => chunk.type === 'asset' && chunk.fileName.endsWith('.css') ) as OutputChunk
) as OutputAsset
const cssChunk = clientResult.assets.find(
// We embed the hash map string into each page directly so that it doesn't (chunk) => chunk.type === 'asset' && chunk.fileName.endsWith('.css')
// alter the main chunk's hash on every build. It's also embedded as a ) as OutputAsset
// string and JSON.parsed from the client because it's faster than embedding
// as JS object literal. // We embed the hash map string into each page directly so that it doesn't
const hashMapStirng = JSON.stringify(JSON.stringify(pageToHashMap)) // alter the main chunk's hash on every build. It's also embedded as a
// string and JSON.parsed from the client because it's faster than embedding
for (const page of siteConfig.pages) { // as JS object literal.
await renderPage( const hashMapStirng = JSON.stringify(JSON.stringify(pageToHashMap))
siteConfig,
page, for (const page of siteConfig.pages) {
clientResult, await renderPage(
appChunk, siteConfig,
cssChunk, page,
pageToHashMap, clientResult,
hashMapStirng appChunk,
) cssChunk,
pageToHashMap,
hashMapStirng
)
}
} catch (e) {
spinner.stopAndPersist({
symbol: failMark
})
throw e
} }
spinner.stopAndPersist({
symbol: okMark
})
} finally { } finally {
await fs.remove(siteConfig.tempDir) await fs.remove(siteConfig.tempDir)
} }
console.log('done.') console.log('done.')
} }

@ -12,6 +12,10 @@ import {
BuildConfig as ViteBuildOptions, BuildConfig as ViteBuildOptions,
BuildResult BuildResult
} from 'vite' } from 'vite'
import ora from 'ora'
export const okMark = '\x1b[32m✓\x1b[0m'
export const failMark = '\x1b[31m✖\x1b[0m'
const hashRE = /\.(\w+)\.js$/ const hashRE = /\.(\w+)\.js$/
const staticInjectMarkerRE = /\b(const _hoisted_\d+ = \/\*#__PURE__\*\/createStaticVNode)\("(.*)", (\d+)\)/g const staticInjectMarkerRE = /\b(const _hoisted_\d+ = \/\*#__PURE__\*\/createStaticVNode)\("(.*)", (\d+)\)/g
@ -143,14 +147,37 @@ export async function bundle(
minify: !process.env.DEBUG minify: !process.env.DEBUG
} }
console.log('building client bundle...') let clientResult, serverResult
const clientResult = await build(viteOptions)
console.log('building server bundle...') const spinner = ora()
spinner.start('building client bundle...')
try {
clientResult = await build(viteOptions)
} catch (e) {
spinner.stopAndPersist({
symbol: failMark
})
throw e
}
spinner.stopAndPersist({
symbol: okMark
})
spinner.start('building server bundle...')
isClientBuild = false isClientBuild = false
const serverResult = await ssrBuild({ try {
...viteOptions, serverResult = await ssrBuild({
outDir: config.tempDir ...viteOptions,
outDir: config.tempDir
})
} catch (e) {
spinner.stopAndPersist({
symbol: failMark
})
throw e
}
spinner.stopAndPersist({
symbol: okMark
}) })
return [clientResult[0], serverResult[0], pageToHashMap] return [clientResult[0], serverResult[0], pageToHashMap]

Loading…
Cancel
Save