@quasar/app-vite
Version:
Quasar Framework App CLI with Vite
136 lines (117 loc) • 3.91 kB
JavaScript
import { join } from 'node:path'
import { mergeConfig as mergeViteConfig } from 'vite'
import {
createViteConfig, extendViteConfig,
createNodeEsbuildConfig, extendEsbuildConfig
} from '../../config-tools.js'
import { cliPkg } from '../../utils/cli-runtime.js'
import { getBuildSystemDefine } from '../../utils/env.js'
import { quasarPwaConfig } from '../pwa/pwa-config.js'
import { quasarVitePluginPwaResources } from '../pwa/vite-plugin.pwa-resources.js'
export const quasarSsrConfig = {
viteClient: async quasarConf => {
let cfg = await createViteConfig(quasarConf, { compileId: 'vite-ssr-client' })
const { appPaths } = quasarConf.ctx
cfg = mergeViteConfig(cfg, {
define: getBuildSystemDefine({
buildEnv: {
CLIENT: true,
SERVER: false
},
buildRawDefine: {
__QUASAR_SSR_PWA__: quasarConf.ssr.pwa === true
}
}),
appType: 'custom',
server: {
middlewareMode: true
},
build: {
ssrManifest: true,
outDir: join(quasarConf.build.distDir, 'client')
}
})
// also update pwa-config.js when changing here
if (quasarConf.ssr.pwa === true) {
cfg.plugins.push(
quasarVitePluginPwaResources(quasarConf)
)
}
// dev has js entry-point, while prod has index.html
if (quasarConf.ctx.dev) {
cfg.build.rollupOptions = cfg.build.rollupOptions || {}
cfg.build.rollupOptions.input = appPaths.resolve.entry('client-entry.js')
}
return extendViteConfig(cfg, quasarConf, { isClient: true })
},
viteServer: async quasarConf => {
let cfg = await createViteConfig(quasarConf, { compileId: 'vite-ssr-server' })
const { appPaths } = quasarConf.ctx
const ssrEntryFile = appPaths.resolve.entry('server-entry.js')
cfg = mergeViteConfig(cfg, {
target: quasarConf.build.target.node,
define: getBuildSystemDefine({
buildEnv: {
CLIENT: false,
SERVER: true
},
buildRawDefine: {
__QUASAR_SSR_PWA__: quasarConf.ssr.pwa === true
}
}),
appType: 'custom',
server: {
ws: false, // let client config deal with it
hmr: false, // let client config deal with it
middlewareMode: true,
warmup: {
ssrFiles: [ ssrEntryFile ]
}
},
ssr: {
// we don't externalize ourselves because of
// the possible imports of '#q-app/wrappers' / '@quasar/app-vite/wrappers'
noExternal: [ cliPkg.name ]
},
build: {
ssr: true,
outDir: join(quasarConf.build.distDir, 'server'),
rollupOptions: {
input: ssrEntryFile
}
}
})
return extendViteConfig(cfg, quasarConf, { isServer: true })
},
// returns a Promise
webserver: quasarConf => {
const cfg = createNodeEsbuildConfig(quasarConf, { compileId: 'node-ssr-webserver', format: 'esm' })
const { appPaths } = quasarConf.ctx
Object.assign(cfg.define, getBuildSystemDefine({
buildEnv: {
CLIENT: false,
SERVER: true
}
}))
if (quasarConf.ctx.dev) {
cfg.entryPoints = [ appPaths.resolve.entry('ssr-dev-webserver.js') ]
cfg.outfile = appPaths.resolve.entry('compiled-dev-webserver.js')
}
else {
cfg.external = [
...cfg.external,
'vue/server-renderer',
'vue/compiler-sfc',
'./render-template.js',
'./quasar.manifest.json',
'./server/server-entry.js'
]
cfg.entryPoints = [ appPaths.resolve.entry('ssr-prod-webserver.js') ]
cfg.outfile = join(quasarConf.build.distDir, 'index.js')
}
return extendEsbuildConfig(cfg, quasarConf.ssr, quasarConf.ctx, 'extendSSRWebserverConf')
},
workbox: quasarPwaConfig.workbox,
customSw: quasarPwaConfig.customSw
}
export const modeConfig = quasarSsrConfig