import fs from 'fs' import path from 'path' import chalk from 'chalk' import { createLogger, createServer as createViteServer, ServerOptions, } from 'vite' import express from 'express' import { printHttpServerUrls } from 'vite' import { parseManifestJson } from '@dcloudio/uni-cli-shared' import { CliOptions } from '.' import { addConfigFile, cleanOptions } from './utils' export async function createServer(options: CliOptions & ServerOptions) { const server = await createViteServer( addConfigFile({ root: process.env.VITE_ROOT_DIR, logLevel: options.logLevel, clearScreen: options.clearScreen, server: cleanOptions(options) as ServerOptions, }) ) await server.listen() const info = server.config.logger.info info( chalk.cyan(`\n vite v${require('vite/package.json').version}`) + chalk.green(` dev server running at:\n`), { clear: !server.config.logger.hasWarned, } ) server.printUrls() } export async function createSSRServer(options: CliOptions & ServerOptions) { const app = express() /** * @type {import('vite').ViteDevServer} */ const vite = await createViteServer( addConfigFile({ root: process.env.VITE_ROOT_DIR, logLevel: options.logLevel, clearScreen: options.clearScreen, server: { middlewareMode: true, watch: { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, interval: 100, }, }, }) ) // use vite's connect instance as middleware app.use(vite.middlewares) app.use('*', async (req, res) => { try { const { h5 } = parseManifestJson(process.env.UNI_INPUT_DIR) const base = (h5 && h5.router && h5.router.base) || '' const url = req.originalUrl.replace(base, '') const template = await vite.transformIndexHtml( url, fs.readFileSync( path.resolve(process.env.VITE_ROOT_DIR!, 'index.html'), 'utf-8' ) ) const render = ( await vite.ssrLoadModule( path.resolve(process.env.UNI_INPUT_DIR, 'entry-server.js') ) ).render const [appHtml, preloadLinks, appContext, title] = await render(url) const icon = template.includes('rel="icon"') ? '' : '\n' const html = template .replace(/