Nuxt/packages/nuxt3/src/builder/vite/vite.ts

125 lines
3.2 KiB
TypeScript
Raw Normal View History

import { resolve } from 'path'
import { Nuxt } from 'src/core'
import { mkdirp, writeFile } from 'fs-extra'
import vue from '@vitejs/plugin-vue'
import consola from 'consola'
import * as vite from 'vite'
interface ViteBuildContext {
nuxt: Nuxt
config: vite.InlineConfig
}
export async function bundle (nuxt: Nuxt) {
const ctx: ViteBuildContext = {
nuxt,
config: {
root: nuxt.options.buildDir,
mode: nuxt.options.dev ? 'development' : 'production',
2021-02-17 20:37:56 +00:00
logLevel: 'warn',
resolve: {
alias: {
'nuxt/app': nuxt.options.appDir,
'~build': nuxt.options.buildDir,
'~': nuxt.options.srcDir,
'@': nuxt.options.srcDir
}
},
clearScreen: false,
plugins: [
vue({})
],
build: {
emptyOutDir: false
}
}
}
await mkdirp(nuxt.options.buildDir)
2021-02-17 20:37:56 +00:00
await mkdirp(resolve(nuxt.options.buildDir, '.vite/temp'))
const callBuild = async (fn, name) => {
try {
const start = Date.now()
await fn(ctx)
const time = (Date.now() - start) / 1000
consola.success(`${name} compiled successfully in ${time}s`)
} catch (err) {
consola.error(`${name} compiled with errors:`, err)
}
}
if (nuxt.options.dev) {
await Promise.all([
callBuild(buildClient, 'Client'),
callBuild(buildServer, 'Server')
])
} else {
await callBuild(buildClient, 'Client')
await callBuild(buildServer, 'Server')
}
}
async function buildClient (ctx: ViteBuildContext) {
const clientConfig: vite.InlineConfig = vite.mergeConfig(ctx.config, {
define: {
'process.server': false,
'process.client': true
},
build: {
outDir: 'dist/client',
assetsDir: '.',
rollupOptions: {
input: resolve(ctx.nuxt.options.buildDir, './entry.client.js')
}
},
server: {
middlewareMode: true
}
} as vite.InlineConfig)
if (ctx.nuxt.options.dev) {
const viteServer = await vite.createServer(clientConfig)
await ctx.nuxt.callHook('server:devMiddleware', (req, res, next) => {
// Workaround: vite devmiddleware modifies req.url
const originalURL = req.url
viteServer.middlewares.handle(req, res, (err) => {
req.url = originalURL
next(err)
})
})
} else {
await vite.build(clientConfig)
}
}
async function buildServer (ctx: ViteBuildContext) {
const serverConfig: vite.InlineConfig = vite.mergeConfig(ctx.config, {
define: {
'process.server': true,
'process.client': false,
window: undefined
},
build: {
outDir: 'dist/server',
ssr: true,
rollupOptions: {
input: resolve(ctx.nuxt.options.buildDir, './entry.server.js')
}
}
} as vite.InlineConfig)
const serverDist = resolve(ctx.nuxt.options.buildDir, 'dist/server')
await mkdirp(serverDist)
await writeFile(resolve(serverDist, 'client.manifest.json'), 'false')
await writeFile(resolve(serverDist, 'server.js'), 'const entry = require("./entry.server.js"); module.exports = entry.default || entry;')
await vite.build(serverConfig)
if (ctx.nuxt.options.dev) {
ctx.nuxt.hook('builder:watch', () => {
vite.build(serverConfig).catch(consola.error)
})
}
}