import type { NextHandleFunction } from 'connect'; import createDebug from 'debug'; import { CLIENT_PUBLIC_PATH } from '../../constants'; import { cleanUrl, isCSSRequest, isImportRequest, isInternalRequest, isJSRequest } from '../../utils'; import type { ServerContext } from '../index'; const debug = createDebug('dev'); export async function transformRequest(url: string, serverContext: ServerContext): Promise { const { moduleGraph, pluginContainer } = serverContext; url = cleanUrl(url); let mod = await moduleGraph.getModuleByUrl(url); if (mod && mod.transformResult) { return mod.transformResult; } const resolvedResult = await pluginContainer.resolveId(url); let transformResult; if (resolvedResult?.id) { let code = await pluginContainer.load(resolvedResult.id); if (typeof code === 'object' && code != null) { code = code.code; } mod = await moduleGraph.ensureEntryFromUrl(url); if (code) { transformResult = await pluginContainer.transform(code as string, resolvedResult?.id); } } if (mod) { mod.transformResult = transformResult; } return transformResult; } export function transformMiddleware(serverContext: ServerContext): NextHandleFunction { return async (req, res, next) => { if (req.method !== 'GET' || !req.url) { return next(); } const url = req.url; debug('transformMiddleware: %s', url); // transform JS and CSS request if ( isJSRequest(url) || isCSSRequest(url) || // 静态资源的 import 请求,如 import logo from './logo.svg'; isImportRequest(url) ) { let result = await transformRequest(url, serverContext); if (!result) { return next(); } if (result && typeof result !== 'string') { result = result.code; } res.statusCode = 200; res.setHeader('Content-Type', 'application/javascript'); return res.end(result); } next(); }; }