Update build feedback with dots indicating activity (#8382)
* Add progress for analyzing and auto-prerendering * Add typing for tty-aware-progress and use stdout * Add fancier spinners * Update spinner and add handling for logs while spinning * Remove un-needed types package * Remove progress and combine analyzing/prerendering messages
This commit is contained in:
parent
44bbf9ad27
commit
204028d6ab
6 changed files with 144 additions and 13 deletions
|
@ -69,6 +69,7 @@
|
|||
"@babel/preset-react": "7.0.0",
|
||||
"@mdx-js/loader": "0.18.0",
|
||||
"@types/jest": "24.0.13",
|
||||
"@types/ora": "3.2.0",
|
||||
"@types/string-hash": "1.1.1",
|
||||
"@zeit/next-css": "1.0.2-canary.2",
|
||||
"@zeit/next-sass": "1.0.2-canary.2",
|
||||
|
|
|
@ -39,6 +39,7 @@ import {
|
|||
import getBaseWebpackConfig from './webpack-config'
|
||||
import { getPageChunks } from './webpack/plugins/chunk-graph-plugin'
|
||||
import { writeBuildId } from './write-build-id'
|
||||
import createSpinner from './spinner'
|
||||
|
||||
const fsUnlink = promisify(fs.unlink)
|
||||
const fsRmdir = promisify(fs.rmdir)
|
||||
|
@ -69,8 +70,9 @@ export default async function build(dir: string, conf = null): Promise<void> {
|
|||
recordNextPlugins(path.resolve(dir))
|
||||
)
|
||||
|
||||
console.log('Creating an optimized production build ...')
|
||||
console.log()
|
||||
const buildSpinner = createSpinner({
|
||||
prefixText: 'Creating an optimized production build',
|
||||
})
|
||||
|
||||
const config = loadConfig(PHASE_PRODUCTION_BUILD, dir, conf)
|
||||
const { target } = config
|
||||
|
@ -158,6 +160,10 @@ export default async function build(dir: string, conf = null): Promise<void> {
|
|||
}
|
||||
|
||||
const webpackBuildEnd = process.hrtime(webpackBuildStart)
|
||||
if (buildSpinner) {
|
||||
buildSpinner.stopAndPersist()
|
||||
}
|
||||
console.log()
|
||||
|
||||
result = formatWebpackMessages(result)
|
||||
|
||||
|
@ -206,6 +212,11 @@ export default async function build(dir: string, conf = null): Promise<void> {
|
|||
)
|
||||
}
|
||||
|
||||
const postBuildSpinner = createSpinner({
|
||||
prefixText: 'Automatically optimizing pages',
|
||||
})
|
||||
|
||||
const distPath = path.join(dir, config.distDir)
|
||||
const pageKeys = Object.keys(mappedPages)
|
||||
const manifestPath = path.join(
|
||||
distDir,
|
||||
|
@ -405,6 +416,8 @@ export default async function build(dir: string, conf = null): Promise<void> {
|
|||
await fsRmdir(exportOptions.outdir)
|
||||
await fsWriteFile(manifestPath, JSON.stringify(pagesManifest), 'utf8')
|
||||
}
|
||||
if (postBuildSpinner) postBuildSpinner.stopAndPersist()
|
||||
console.log()
|
||||
|
||||
const analysisEnd = process.hrtime(analysisBegin)
|
||||
backgroundWork.push(
|
||||
|
|
58
packages/next/build/spinner.ts
Normal file
58
packages/next/build/spinner.ts
Normal file
|
@ -0,0 +1,58 @@
|
|||
import ora from 'ora'
|
||||
|
||||
const dotsSpinner = {
|
||||
frames: ['.', '..', '...'],
|
||||
interval: 200,
|
||||
}
|
||||
|
||||
export default function createSpinner(
|
||||
text: string | { prefixText: string },
|
||||
options: ora.Options = {}
|
||||
) {
|
||||
let spinner: undefined | ora.Ora
|
||||
let prefixText = text && typeof text === 'object' && text.prefixText
|
||||
|
||||
if (process.stdout.isTTY) {
|
||||
spinner = ora({
|
||||
text: typeof text === 'string' ? text : undefined,
|
||||
prefixText: typeof prefixText === 'string' ? prefixText : undefined,
|
||||
spinner: dotsSpinner,
|
||||
stream: process.stdout,
|
||||
...options,
|
||||
}).start()
|
||||
|
||||
const origLog = console.log
|
||||
const origWarn = console.warn
|
||||
const origError = console.error
|
||||
const origStop = spinner.stop.bind(spinner)
|
||||
const origStopAndPersist = spinner.stopAndPersist.bind(spinner)
|
||||
|
||||
const logHandle = (method: any, args: any[]) => {
|
||||
origStop()
|
||||
method(...args)
|
||||
spinner!.start()
|
||||
}
|
||||
|
||||
console.log = (...args: any) => logHandle(origLog, args)
|
||||
console.warn = (...args: any) => logHandle(origWarn, args)
|
||||
console.error = (...args: any) => logHandle(origError, args)
|
||||
|
||||
const resetLog = () => {
|
||||
console.log = origLog
|
||||
}
|
||||
spinner.stop = (): ora.Ora => {
|
||||
origStop()
|
||||
resetLog()
|
||||
return spinner!
|
||||
}
|
||||
spinner.stopAndPersist = (): ora.Ora => {
|
||||
origStopAndPersist()
|
||||
resetLog()
|
||||
return spinner!
|
||||
}
|
||||
} else if (prefixText || text) {
|
||||
console.log(prefixText || text)
|
||||
}
|
||||
|
||||
return spinner
|
||||
}
|
|
@ -6,7 +6,6 @@ import mkdirpModule from 'mkdirp'
|
|||
import { resolve, join } from 'path'
|
||||
import { API_ROUTE } from '../lib/constants'
|
||||
import { existsSync, readFileSync } from 'fs'
|
||||
import createProgress from 'tty-aware-progress'
|
||||
import { recursiveCopy } from '../lib/recursive-copy'
|
||||
import { recursiveDelete } from '../lib/recursive-delete'
|
||||
import { formatAmpMessages } from '../build/output/index'
|
||||
|
@ -22,9 +21,52 @@ import {
|
|||
CLIENT_PUBLIC_FILES_PATH,
|
||||
CLIENT_STATIC_FILES_PATH
|
||||
} from '../next-server/lib/constants'
|
||||
import createSpinner from '../build/spinner'
|
||||
|
||||
const mkdirp = promisify(mkdirpModule)
|
||||
|
||||
const createProgress = (total, label = 'Exporting') => {
|
||||
let curProgress = 0
|
||||
let progressSpinner = createSpinner(`${label} (${curProgress}/${total})`, {
|
||||
spinner: {
|
||||
frames: [
|
||||
'[ ]',
|
||||
'[= ]',
|
||||
'[== ]',
|
||||
'[=== ]',
|
||||
'[ ===]',
|
||||
'[ ==]',
|
||||
'[ =]',
|
||||
'[ ]',
|
||||
'[ =]',
|
||||
'[ ==]',
|
||||
'[ ===]',
|
||||
'[====]',
|
||||
'[=== ]',
|
||||
'[== ]',
|
||||
'[= ]'
|
||||
],
|
||||
interval: 80
|
||||
}
|
||||
})
|
||||
|
||||
return () => {
|
||||
curProgress++
|
||||
|
||||
const newText = `${label} (${curProgress}/${total})`
|
||||
if (progressSpinner) {
|
||||
progressSpinner.text = newText
|
||||
} else {
|
||||
console.log(newText)
|
||||
}
|
||||
|
||||
if (curProgress === total && progressSpinner) {
|
||||
progressSpinner.stop()
|
||||
console.log(newText)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default async function (dir, options, configuration) {
|
||||
function log (message) {
|
||||
if (options.silent) return
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
"node-fetch": "2.6.0",
|
||||
"path-to-regexp": "2.1.0",
|
||||
"pnp-webpack-plugin": "1.5.0",
|
||||
"ora": "3.4.0",
|
||||
"prop-types": "15.7.2",
|
||||
"prop-types-exact": "1.2.0",
|
||||
"raw-body": "2.4.0",
|
||||
|
@ -108,7 +109,6 @@
|
|||
"strip-ansi": "5.2.0",
|
||||
"styled-jsx": "3.2.2",
|
||||
"terser": "4.0.0",
|
||||
"tty-aware-progress": "1.0.4",
|
||||
"unfetch": "4.1.0",
|
||||
"url": "0.11.0",
|
||||
"watchpack": "2.0.0-beta.5",
|
||||
|
|
35
yarn.lock
35
yarn.lock
|
@ -2248,6 +2248,13 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c"
|
||||
integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==
|
||||
|
||||
"@types/ora@3.2.0":
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/ora/-/ora-3.2.0.tgz#b2f65d1283a8f36d8b0f9ee767e0732a2f429362"
|
||||
integrity sha512-jll99xUKpiFbIFZSQcxm4numfsLaOWBzWNaRk3PvTSE7BPqTzzOCFmS0mQ7m8qkTfmYhuYbehTGsxkvRLPC++w==
|
||||
dependencies:
|
||||
ora "*"
|
||||
|
||||
"@types/prompts@2.0.1":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.1.tgz#afae5a8b0616a33cd31557bec74e2fd4a32f4afe"
|
||||
|
@ -4022,6 +4029,11 @@ cli-spinners@^1.1.0:
|
|||
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
|
||||
integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
|
||||
|
||||
cli-spinners@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77"
|
||||
integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==
|
||||
|
||||
cli-truncate@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
|
||||
|
@ -10239,6 +10251,18 @@ optjs@~3.2.2:
|
|||
resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee"
|
||||
integrity sha1-aabOicRCpEQDFBrS+bNwvVu29O4=
|
||||
|
||||
ora@*, ora@3.4.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
|
||||
integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
|
||||
dependencies:
|
||||
chalk "^2.4.2"
|
||||
cli-cursor "^2.1.0"
|
||||
cli-spinners "^2.0.0"
|
||||
log-symbols "^2.2.0"
|
||||
strip-ansi "^5.2.0"
|
||||
wcwidth "^1.0.1"
|
||||
|
||||
ora@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ora/-/ora-2.0.0.tgz#8ec3a37fa7bffb54a3a0c188a1f6798e7e1827cd"
|
||||
|
@ -11249,7 +11273,7 @@ process@^0.11.10:
|
|||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
||||
|
||||
progress@2.0.3, progress@^2.0.0:
|
||||
progress@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
@ -12978,7 +13002,7 @@ stringstream@~0.0.5:
|
|||
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
|
||||
integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==
|
||||
|
||||
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0:
|
||||
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
|
||||
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
|
||||
|
@ -13611,13 +13635,6 @@ tslib@^1.9.0:
|
|||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
|
||||
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
|
||||
|
||||
tty-aware-progress@1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/tty-aware-progress/-/tty-aware-progress-1.0.4.tgz#63564adf7f76a8ec1169f2ae52eaad8129031000"
|
||||
integrity sha512-ynqjeu8FOAjnv78ku9iHSS9zJB9d4SNPeUAskOsTJfwdpGjJchSVmzngTUQZpg5hXqvE3vWF5FjN5SAHiutA0w==
|
||||
dependencies:
|
||||
progress "2.0.3"
|
||||
|
||||
tty-browserify@0.0.0:
|
||||
version "0.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
|
||||
|
|
Loading…
Reference in a new issue