-
Notifications
You must be signed in to change notification settings - Fork 896
Expand file tree
/
Copy pathbuild.ts
More file actions
114 lines (101 loc) · 3.34 KB
/
Copy pathbuild.ts
File metadata and controls
114 lines (101 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { rspack } from '@rspack/core'
import type { MultiRspackOptions } from '@rspack/core'
import { createVueServerApp, getSsrTemplate } from '@vuepress/bundlerutils'
import type { App, Bundler } from '@vuepress/core'
import { colors, debug, fs, logger, withSpinner } from '@vuepress/utils'
import { resolveRspackConfig } from '../resolveRspackConfig.js'
import type { RspackBundlerOptions } from '../types.js'
import {
CLIENT_MANIFEST_FILENAME,
createClientConfig,
} from './createClientConfig.js'
import { createServerConfig } from './createServerConfig.js'
import { renderPage } from './renderPage.js'
import { resolveClientManifestMeta } from './resolveClientManifestMeta.js'
import type { ClientManifest } from './types.js'
const log = debug('vuepress:bundler-rspack/build')
export const build = async (
options: RspackBundlerOptions,
app: App,
): ReturnType<Bundler['build']> => {
// plugin hook: extendsBundlerOptions
await app.pluginApi.hooks.extendsBundlerOptions.process(options, app)
// rspack compile
log('compiling start')
await withSpinner('Compiling with rspack')(async () => {
// create rspack config
const clientConfig = resolveRspackConfig({
config: await createClientConfig(app, options),
options,
isServer: false,
isBuild: true,
})
const serverConfig = resolveRspackConfig({
config: await createServerConfig(app, options),
options,
isServer: true,
isBuild: true,
})
await new Promise<void>((resolve, reject) => {
rspack(
[clientConfig, serverConfig] as MultiRspackOptions,
(err, stats) => {
if (err) {
reject(err)
} else {
if (stats) {
const { warnings, errors } = stats.toJson('errors-warnings')
errors?.forEach((item) => {
logger.error(item)
})
warnings?.forEach((warning) => {
logger.warn(warning)
})
if (stats.hasErrors())
reject(new Error('Failed to compile with errors'))
}
resolve()
}
},
)
})
})
log('compiling finish')
// render pages
await withSpinner(`Rendering ${app.pages.length} pages`)(async (spinner) => {
// load the client manifest file
const clientManifestPath = app.dir.temp(CLIENT_MANIFEST_FILENAME)
const clientManifest = (await fs.readJson(
clientManifestPath,
)) as ClientManifest
// resolve client files meta
const { initialFilesMeta, asyncFilesMeta, moduleFilesMetaMap } =
resolveClientManifestMeta(clientManifest)
// create vue ssr app and get ssr template
const { vueApp, vueRouter } = await createVueServerApp(
app.dir.temp('.server/app.cjs'),
)
const ssrTemplate = await getSsrTemplate(app)
// pre-render pages to html files
for (const page of app.pages) {
if (spinner) {
spinner.text = `Rendering pages ${colors.magenta(page.path)}`
}
await renderPage({
app,
page,
vueApp,
vueRouter,
ssrTemplate,
initialFilesMeta,
asyncFilesMeta,
moduleFilesMetaMap,
})
}
})
// keep the server bundle files in debug mode
if (!app.env.isDebug) {
// remove server temp directory after pages rendered
await fs.remove(app.dir.temp('.server'))
}
}