UNPKG

@mini-umi/preset-umi

Version:
289 lines (287 loc) 11.2 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/commands/ssr.ts var ssr_exports = {}; __export(ssr_exports, { default: () => ssr_default }); module.exports = __toCommonJS(ssr_exports); var import_fs = __toESM(require("fs")); var import_path = __toESM(require("path")); var import_express = __toESM(require("express")); var import_utils = require("@umijs/utils"); var import_http = __toESM(require("http")); var import_plugin_vue = __toESM(require("@vitejs/plugin-vue")); var import_plugin_vue_jsx = __toESM(require("@vitejs/plugin-vue-jsx")); var import_getRoutes = require("./getRoutes.js"); var import_utils2 = require("./utils.js"); var isTest = process.env.VITEST; var virtualFile = "@virtual-file"; var virtualId = "\0" + virtualFile; var nestedVirtualFile = "@nested-virtual-file"; var nestedVirtualId = "\0" + nestedVirtualFile; var base = "./"; globalThis.__vite_test_filename = __filename; globalThis.__vite_test_dirname = __dirname; var ssr_default = (api) => { api.registerCommand({ name: "ssr", async fn() { let vite; const cwd = process.cwd(); async function resolveRoutes() { const routesDirPath = await api.applyPlugins({ key: "modifyRoutesDir", initialValue: api.userConfig.routesDir }); const userRoutes = api.userConfig.routes ? api.userConfig.routes : []; const routes = (0, import_utils.deepmerge)((0, import_getRoutes.getRoutes)({ dirPath: routesDirPath || "./pages" }), userRoutes); return (0, import_utils2.getRoutesString)(routes); } function layout() { try { const layoutContent = import_utils.fsExtra.readFileSync((0, import_utils.winPath)(import_path.default.join(cwd, "./layout/index.vue")), "utf-8"); import_utils.fsExtra.writeFileSync((0, import_utils.winPath)(import_path.default.join(cwd, "./.mini-umi-ssr/App.vue")), layoutContent); } catch (err) { console.log(`${err}: ${cwd}`); } } let hmrPort = 8006; async function createServer(root = process.cwd(), isProd = process.env.NODE_ENV === "production") { const generate = new import_utils.BaseGenerator({ path: (0, import_utils.winPath)(import_path.default.join(__dirname, "../../ssrtemplate")), target: import_path.default.join(cwd, "./.mini-umi-ssr/"), data: { routes: await resolveRoutes() }, questions: [] }); await generate.run(); layout(); const resolve = (p) => import_path.default.resolve(process.cwd(), p); const indexProd = isProd ? import_fs.default.readFileSync(resolve("dist/client/index.html"), "utf-8") : ""; const manifest = isProd ? JSON.parse( import_fs.default.readFileSync(resolve("dist/client/ssr-manifest.json"), "utf-8") ) : {}; const app2 = (0, import_express.default)(); const defaultViteConfig = { base, plugins: [ (0, import_plugin_vue.default)(), (0, import_plugin_vue_jsx.default)(), { name: "virtual", resolveId(id) { if (id === "@foo") { return id; } }, load(id, options) { const ssrFromOptions = (options == null ? void 0 : options.ssr) ?? false; if (id === "@foo") { return `export default { msg: '${command === "build" && !!ssrBuild !== ssrFromOptions ? `defineConfig ssrBuild !== ssr from load options` : "hi"}' }`; } } }, { name: "virtual-module", resolveId(id) { if (id === virtualFile) { return virtualId; } else if (id === nestedVirtualFile) { return nestedVirtualId; } }, load(id) { if (id === virtualId) { return `export { msg } from "@nested-virtual-file";`; } else if (id === nestedVirtualId) { return `export const msg = "[success] from conventional virtual file"`; } } }, function() { const queryRE = /\?.*$/s; const hashRE = /#.*$/s; const cleanUrl = (url) => url.replace(hashRE, "").replace(queryRE, ""); let config; const virtualId2 = "\0virtual:ssr-vue-built-url"; return { name: "built-url", enforce: "post", configResolved(_config) { config = _config; }, resolveId(id) { if (id === virtualId2) { return id; } }, load(id) { if (id === virtualId2) { return { code: `export const __ssr_vue_processAssetPath = (url) => '${base}' + url`, moduleSideEffects: "no-treeshake" }; } }, transform(code, id) { const cleanId = cleanUrl(id); if (config.build.ssr && (cleanId.endsWith(".js") || cleanId.endsWith(".vue")) && !code.includes("__ssr_vue_processAssetPath")) { return { code: `import { __ssr_vue_processAssetPath } from '${virtualId2}';__ssr_vue_processAssetPath;` + code, sourcemap: null }; } } }; }() ], experimental: { renderBuiltUrl(filename, { hostType, type, ssr }) { if (ssr && type === "asset" && hostType === "js") { return { runtime: `__ssr_vue_processAssetPath(${JSON.stringify(filename)})` }; } } }, build: { minify: false }, ssr: { noExternal: [ "example-external-component" ] }, optimizeDeps: { exclude: ["example-external-component"] }, resolve: { alias: { "@": "../" } } }; const userViteConfig = await api.applyPlugins({ key: "modifyViteConfig", initialValue: api.config.viteConfig }); const viteConfig = (0, import_utils.deepmerge)(userViteConfig, defaultViteConfig); if (!isProd) { vite = await (await import("vite")).createServer({ ...viteConfig, configFile: false, base: "./", root, logLevel: isTest ? "error" : "info", server: { middlewareMode: true, watch: { usePolling: true, interval: 100 }, hmr: { port: hmrPort } }, appType: "custom" }); app2.use(vite.middlewares); } else { app2.use((await import("compression")).default()); app2.use( "/test/", (await import("serve-static")).default(resolve("dist/client"), { index: false }) ); } app2.use("*", async (req, res) => { try { let template, render; if (!isProd) { template = import_fs.default.readFileSync(resolve("./.mini-umi-ssr/index.html"), "utf-8"); template = await vite.transformIndexHtml(req.originalUrl, template); render = (await vite.ssrLoadModule(import_path.default.join(process.cwd(), "/.mini-umi-ssr/entry-server.js"))).render; } else { template = indexProd; render = (await import("./dist/server/entry-server.js")).render; } const [appHtml, preloadLinks] = await render(req.originalUrl, manifest); const html = template.replace(`<!--preload-links-->`, preloadLinks).replace(`<!--app-html-->`, appHtml); res.status(200).set({ "Content-Type": "text/html" }).end(html); } catch (e) { vite && vite.ssrFixStacktrace(e); console.log(e.stack); res.status(500).end(e.stack); } }); return { app: app2, vite }; } const { app } = await createServer(); let server; if (!isTest) { server = import_http.default.createServer(app); server.listen(8005, () => { console.log(); console.log(); console.log( import_utils.chalk.greenBright("\u{1F389}\u{1F389}\u{1F389}\u606D\u559C\u4F60\uFF0Cmini-umi + Vue3.2 + Vite \u542F\u52A8\u6210\u529F\uFF01") ); console.log(); console.log(); console.log( import_utils.chalk.blueBright(" . \u{1F389} SSR\u6A21\u5F0F\u542F\u52A8---------------------- ") ); console.log( import_utils.chalk.yellowBright(" . \u{1F389} \u8BF7\u8BBF\u95EEhost: http://localhost:8005") ); console.log( import_utils.chalk.redBright(" . \u{1F389} \u8BF7\u8BBF\u95EEhost: http://localhost:8005") ); console.log(); console.log(); }); } import_utils.chokidar.watch(import_path.default.join(cwd, "./pages"), { ignoreInitial: true }).on("all", async () => { await resolveRoutes(); }); console.log(import_path.default.join(cwd, "./layout")); import_utils.chokidar.watch(import_path.default.join(cwd, "./layout"), { ignoreInitial: true }).on("all", async () => { hmrPort++; await createServer(); }); } }); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = {}); //# sourceMappingURL=ssr.js.map