vigor-moon 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -18,7 +18,7 @@ var require_package = _chunkPB3TEDCEjs.__commonJS.call(void 0, {
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.0",
21
+ version: "1.1.2",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -230,6 +230,7 @@ async function renderPage(render, root, clientBundle, routes) {
230
230
  await _fsextra2.default.writeFile(_path.join.call(void 0, root, "build", fileName), html);
231
231
  })
232
232
  );
233
+ await _fsextra2.default.remove(_path.join.call(void 0, root, ".temp"));
233
234
  }
234
235
  async function build(root = process.cwd(), config) {
235
236
  const [clientBundle] = await bundle(root, config);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"names":["path","fs"],"mappings":"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","sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.0\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n // await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"names":["path","fs"],"mappings":"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","sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.2\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"]}
package/dist/cli.mjs CHANGED
@@ -18,7 +18,7 @@ var require_package = __commonJS({
18
18
  "package.json"(exports, module) {
19
19
  module.exports = {
20
20
  name: "vigor-moon",
21
- version: "1.1.0",
21
+ version: "1.1.2",
22
22
  packageManager: "pnpm@7.9.2",
23
23
  description: "SSG framework",
24
24
  main: "dist/index.js",
@@ -230,6 +230,7 @@ async function renderPage(render, root, clientBundle, routes) {
230
230
  await fs.writeFile(join(root, "build", fileName), html);
231
231
  })
232
232
  );
233
+ await fs.remove(join(root, ".temp"));
233
234
  }
234
235
  async function build(root = process.cwd(), config) {
235
236
  const [clientBundle] = await bundle(root, config);
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.0\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n // await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"],"mappings":"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","names":["path","fs"]}
1
+ {"version":3,"sources":["../package.json","../src/node/cli.ts","../src/node/build.ts","../src/node/preview.ts"],"sourcesContent":["{\n \"name\": \"vigor-moon\",\n \"version\": \"1.1.2\",\n \"packageManager\": \"pnpm@7.9.2\",\n \"description\": \"SSG framework\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./dist/*\": \"./dist/*\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"start\": \"tsup --watch --format=cjs,esm\",\n \"build\": \"tsup\",\n \"test:unit\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"playwright test\",\n \"prepare:e2e\": \"tsx scripts/e2e.ts\",\n \"release\": \"tsx scripts/release.ts\",\n \"changelog\": \"conventional-changelog -p angular -i CHANGELOG.md -s\"\n },\n \"bin\": {\n \"vigor\": \"./bin/vigor.js\"\n },\n \"keywords\": [\n \"SSG\",\n \"docs\"\n ],\n \"author\": \"sungMoon\",\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"src/runtime\",\n \"src/theme-default\",\n \"src/types\",\n \"src/core\",\n \"template.html\"\n ],\n \"devDependencies\": {\n \"@iconify-json/carbon\": \"^1.1.16\",\n \"@playwright/test\": \"1.26.1\",\n \"@types/compression\": \"^1.7.2\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/hast\": \"^2.3.4\",\n \"@types/mdast\": \"^3.0.10\",\n \"@types/node\": \"^18.13.0\",\n \"@types/polka\": \"^0.5.4\",\n \"@types/react-dom\": \"^18.0.11\",\n \"chalk\": \"^5.2.0\",\n \"conventional-changelog-cli\": \"^2.2.2\",\n \"enquirer\": \"^2.3.6\",\n \"execa\": \"5.1.1\",\n \"minimist\": \"^1.2.8\",\n \"rehype-stringify\": \"^9.0.3\",\n \"remark-parse\": \"^10.0.1\",\n \"remark-rehype\": \"^10.1.0\",\n \"rollup\": \"^3.14.0\",\n \"semver\": \"^7.5.0\",\n \"tsup\": \"^6.6.2\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\",\n \"unified\": \"^10.1.2\",\n \"unist-util-visit\": \"^4.1.2\",\n \"vitest\": \"^0.28.4\"\n },\n \"dependencies\": {\n \"@loadable/component\": \"^5.15.3\",\n \"@mdx-js/rollup\": \"2\",\n \"@mdx-js/mdx\": \"^2.1.3\",\n \"@mdx-js/react\": \"^2.1.3\",\n \"@types/react\": \"^18.0.27\",\n \"@vitejs/plugin-react\": \"^3.1.0\",\n \"acorn\": \"^8.8.2\",\n \"cac\": \"^6.7.14\",\n \"compression\": \"^1.7.4\",\n \"fast-glob\": \"^3.2.12\",\n \"fs-extra\": \"^11.1.0\",\n \"github-slugger\": \"^2.0.0\",\n \"hast-util-from-html\": \"^1.0.1\",\n \"koa\": \"^2.14.1\",\n \"mdast-util-mdxjs-esm\": \"^1.3.1\",\n \"polka\": \"^0.5.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-helmet-async\": \"1.3.0\",\n \"react-router-dom\": \"6.4.3\",\n \"rehype-autolink-headings\": \"^6.1.1\",\n \"rehype-slug\": \"^5.1.0\",\n \"remark-frontmatter\": \"^4.0.1\",\n \"remark-gfm\": \"^3.0.1\",\n \"remark-mdx\": \"^2.3.0\",\n \"remark-mdx-frontmatter\": \"^2.1.1\",\n \"remark-stringify\": \"^10.0.2\",\n \"sass\": \"^1.60.0\",\n \"serve\": \"^14.2.0\",\n \"shiki\": \"^0.14.1\",\n \"sirv\": \"^2.0.2\",\n \"unocss\": \"^0.50.4\",\n \"vite\": \"^4.1.1\"\n }\n}","import { cac } from \"cac\";\r\nimport { createDevServer } from \"./dev\";\r\nimport { build } from \"./build\";\r\nimport { preview } from \"./preview\";\r\nimport { resolve } from \"path\";\r\nimport { resolveConfig } from \"./config\";\r\nconst version = require(\"../../package.json\").version;\r\n\r\nconst cli = cac(\"vigor\").version(version).help();\r\n\r\n// terminal 指令集\r\n// 开启服务指令\r\ncli\r\n .command(\"[root]\", \"start dev server\")\r\n .alias(\"dev\")\r\n .action(async (root: string) => {\r\n try {\r\n root = root ? resolve(root) : process.cwd();\r\n const server = await createDevServer(root);\r\n await server.listen();\r\n server.printUrls();\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n });\r\n\r\n// 构建打包指令\r\ncli.command(\"build [root]\", \"build in production\").action(async (root: string) => {\r\n try {\r\n root = resolve(root);\r\n const config = await resolveConfig(root, \"build\", \"production\");\r\n await build(root, config);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n});\r\n\r\n// 本地预览产物\r\ncli\r\n .command(\"preview [root]\", \"preview production build\")\r\n .option(\"--port <port>\", \"port to use for preview server\")\r\n .action(async (root: string, { port }: { port: number }) => {\r\n try {\r\n root = resolve(root);\r\n console.log(root);\r\n await preview(root, { port });\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n });\r\n\r\ncli.parse();\r\n","import { build as viteBuild, InlineConfig } from \"vite\";\r\nimport { CLIENT_ENTRY_PATH, SERVER_ENTRY_PATH } from \"./constants/index\";\r\nimport path, { join, dirname } from \"path\";\r\nimport { PACKAGE_ROOT } from \"./constants/index\";\r\n\r\nimport type { RollupOutput } from \"rollup\";\r\nimport fs from \"fs-extra\";\r\nimport pluginReact from \"@vitejs/plugin-react\";\r\n\r\nimport { pathToFileURL } from \"url\";\r\nimport { SiteConfig } from \"types\";\r\nimport { pluginConfig } from \"./plugin/config\";\r\nimport { pluginIndexHtml } from \"./plugin/indexHtml\";\r\n\r\nimport { pluginMdx } from \"./plugin/plugin-mdx/index\";\r\nimport { Route, pluginRoutes } from \"./plugin/plugin-routes\";\r\n\r\nimport pluginUnocss from \"unocss/vite\";\r\nimport unocssOptions from \"./unocssOptions\";\r\n\r\nimport { HelmetData } from \"react-helmet-async\";\r\n\r\nconst CLIENT_OUTPUT = \"build\";\r\n\r\n// 依靠vite的打包工具\r\nexport async function bundle(root: string, config: SiteConfig) {\r\n // 使用vite进行打包,将重复逻辑进行抽离\r\n // 设定isSSR,判断是否是生产环境下,用不用多路由打包\r\n const resolveViteConfig = async (isServer: boolean, isSSR = isServer): Promise<InlineConfig> => ({\r\n mode: \"production\",\r\n root,\r\n plugins: [\r\n pluginUnocss(unocssOptions),\r\n pluginIndexHtml(),\r\n pluginReact({ jsxRuntime: \"automatic\", jsxImportSource: \"react\" }),\r\n pluginConfig(config),\r\n // 此处的isSSR和isServer其实是一个东西,但是用的结构符,所以名称需要和之前设定的一样\r\n // 所以添加了一个参数,直接让其和isServer相同\r\n pluginRoutes({ root: config.root, isSSR }),\r\n await pluginMdx(),\r\n ],\r\n // 将react-router-dom直接打包进ssr的产物中,不用再单独引入第三方包了\r\n ssr: {\r\n noExternal: [\"react-router-dom\"],\r\n },\r\n build: {\r\n minify: false,\r\n ssr: isServer,\r\n outDir: isServer ? path.join(root, \".temp\") : path.join(root, CLIENT_OUTPUT),\r\n rollupOptions: {\r\n input: isServer ? SERVER_ENTRY_PATH : CLIENT_ENTRY_PATH,\r\n output: {\r\n format: isServer ? \"cjs\" : \"esm\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n try {\r\n // // 对客户端进行打包\r\n // const clientBuild = async () => {\r\n // return viteBuild(resolveViteConfig(false));\r\n // };\r\n\r\n // // 对服务端进行打包\r\n // const serverBuild = async () => {\r\n // return viteBuild(resolveViteConfig(true));\r\n // };\r\n\r\n console.log(\"Building client and server bundles ...\");\r\n\r\n // 因为clientBuild和serverBuild是相互独立的两个函数,所以使用Promise.all进行优化将二者并行执行\r\n const [clientBundle, serverBundle] = await Promise.all([\r\n // client build\r\n viteBuild(await resolveViteConfig(false)),\r\n // server build\r\n viteBuild(await resolveViteConfig(true)),\r\n ]);\r\n const publicDir = join(root, \"public\");\r\n if (fs.pathExistsSync(publicDir)) {\r\n await fs.copy(publicDir, join(root, CLIENT_OUTPUT));\r\n }\r\n return [clientBundle, serverBundle] as [RollupOutput, RollupOutput];\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n}\r\n\r\n// 渲染页面\r\nexport async function renderPage(\r\n render: (pagePath: string, helmetContext: object) => string,\r\n root: string,\r\n clientBundle: RollupOutput,\r\n routes: Route[]\r\n) {\r\n // 水合\r\n const clientChunk = clientBundle.output.find((chunk) => chunk.type === \"chunk\" && chunk.isEntry);\r\n // 拼接为真正的html页面\r\n console.log(\"Rendering page in server side...\");\r\n\r\n // 自动化注入head\r\n const helmetContext = {\r\n context: {},\r\n } as HelmetData;\r\n\r\n // 多路由打包\r\n await Promise.all(\r\n [\r\n ...routes,\r\n {\r\n path: \"/404\",\r\n },\r\n ].map(async (route) => {\r\n const routePath = route.path;\r\n\r\n // 拿到将html渲染为字符串的结果\r\n const appHtml = render(routePath, helmetContext.context);\r\n const styleAssets = clientBundle.output.filter(\r\n (chunk) => chunk.type === \"asset\" && chunk.fileName.endsWith(\".css\")\r\n );\r\n // const code = clientBundle.output[0].code;\r\n const { helmet } = helmetContext.context;\r\n const html = `\r\n <!DOCTYPE html>\r\n <html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n ${helmet?.title?.toString() || \"\"}\r\n ${helmet?.meta?.toString() || \"\"}\r\n ${helmet?.link?.toString() || \"\"}\r\n ${helmet?.style?.toString() || \"\"}\r\n <meta name=\"description\" content=\"xxx\">\r\n ${styleAssets.map((item) => `<link rel=\"stylesheet\" href=\"/${item.fileName}\">`).join(\"\\n\")}\r\n </head>\r\n <body>\r\n <div id=\"root\">${appHtml}</div>\r\n <script src=\"/${clientChunk?.fileName}\" type=\"module\"></script>\r\n </body>\r\n </html>\r\n `.trim();\r\n // 开始写入文件\r\n const fileName = routePath.endsWith(\"/\") ? `${routePath}index.html` : `${routePath}.html`;\r\n await fs.ensureDir(join(root, \"build\", dirname(fileName)));\r\n\r\n // 将以上页面html产物写到对应的文件目录中\r\n await fs.writeFile(join(root, \"build\", fileName), html);\r\n })\r\n );\r\n\r\n // 移除掉ssr的产物\r\n await fs.remove(join(root, \".temp\"));\r\n}\r\n\r\n// feature: SSG构建页面\r\nexport async function build(root: string = process.cwd(), config: SiteConfig) {\r\n // bundle => client + server\r\n const [clientBundle] = await bundle(root, config);\r\n // 引入 server-entry 模块,也就是引入刚才打包生成的ssr产物\r\n const serverEntryPath = join(root, \".temp\", \"ssr-entry.js\");\r\n // 服务端渲染,产出HTML\r\n const { render, routes } = await import(pathToFileURL(serverEntryPath).toString()); // pathToFileURL是为了兼容windows的url格式\r\n try {\r\n await renderPage(render, root, clientBundle, routes);\r\n } catch (e) {\r\n console.log(\"Render is error\\n\", e);\r\n }\r\n}\r\n","import { resolveConfig } from \"./config\";\r\nimport path from \"path\";\r\nimport fs from \"fs-extra\";\r\nimport compression from \"compression\";\r\nimport sirv from \"sirv\";\r\nimport polka from \"polka\";\r\n\r\n// 默认运行服务器端口号\r\nconst DEFAULT_SERVER_PORT = 9999;\r\n\r\nexport async function preview(root: string, { port }: { port?: number }) {\r\n const config = await resolveConfig(root, \"serve\", \"production\");\r\n const listenPort = port ?? DEFAULT_SERVER_PORT;\r\n const outputDir = path.resolve(root, \"build\");\r\n const notFoundPage = fs.readFileSync(path.resolve(outputDir, \"404.html\"), \"utf8\");\r\n\r\n // 资源压缩\r\n const compress = compression();\r\n\r\n // 处理静态资源\r\n const serve = sirv(outputDir, {\r\n etag: true,\r\n maxAge: 31536000, // 一年\r\n immutable: true,\r\n setHeaders(res, pathname) {\r\n if (pathname.endsWith(\".html\")) {\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n }\r\n },\r\n });\r\n\r\n const onNoMatch: polka.Options[\"onNoMatch\"] = (req, res) => {\r\n res.statusCode = 404;\r\n res.end(notFoundPage);\r\n };\r\n\r\n polka({ onNoMatch })\r\n .use(compress, serve)\r\n .listen(listenPort, (err) => {\r\n if (err) {\r\n throw err;\r\n }\r\n console.log(`Preview server is running at http://localhost:${listenPort}`);\r\n });\r\n}\r\n"],"mappings":"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","names":["path","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigor-moon",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "packageManager": "pnpm@7.9.2",
5
5
  "description": "SSG framework",
6
6
  "main": "dist/index.js",
@@ -30,9 +30,9 @@ export function DocPage() {
30
30
  </div>
31
31
  <div pt="22" w="3/4" className={styles.vigorDoc} flex="~">
32
32
  <div w="2/3" className="vigor-doc">
33
- <div className="divider-bottom">
33
+ <article className="container divider-bottom">
34
34
  <Content />
35
- </div>
35
+ </article>
36
36
  <div>
37
37
  <NextPage />
38
38
  </div>
@@ -1,3 +1,5 @@
1
+ /* ---------------------------------------------------------------------------- */
2
+ /* 设置标题样式 */
1
3
  .vigor-doc h1,
2
4
  .vigor-doc h2,
3
5
  .vigor-doc h3,
@@ -32,7 +34,6 @@
32
34
  font-size: 20px;
33
35
  }
34
36
 
35
-
36
37
  .toc-container {
37
38
  position: sticky;
38
39
  top: 10vh;
@@ -63,15 +64,22 @@
63
64
  float: left;
64
65
  }
65
66
 
66
- // /* 设置段落样式 */
67
+ /* 设置段落样式 */
67
68
  .vigor-doc p {
68
- margin: 0 0 16px;
69
+ margin: 0 0 15px;
69
70
  padding: 0;
70
71
  }
71
72
 
73
+ /* ---------------------------------------------------------------------------- */
72
74
 
73
75
  /* 设置代码块样式 */
76
+ .vigor-doc div[class*='language-'] {
77
+ position: relative;
78
+ overflow-x: auto;
79
+ }
80
+
74
81
  .vigor-doc pre {
82
+ position: relative;
75
83
  margin: 0 0 16px;
76
84
  padding: 16px;
77
85
  background-color: #f8f8f8;
@@ -82,7 +90,8 @@
82
90
  overflow: auto;
83
91
  }
84
92
 
85
- .vigor-doc p code {
93
+ .vigor-doc p code,
94
+ .vigor-doc ul li code {
86
95
  font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
87
96
  font-size: 0.9em;
88
97
  color: var(--main-color);
@@ -95,18 +104,7 @@
95
104
  font-family: Consolas, Monaco, 'Andale Mono', monospace;
96
105
  font-size: 14px;
97
106
  }
98
-
99
-
100
- /* 设置块引用样式 */
101
- .vigor-doc blockquote {
102
- margin: 0 0 16px;
103
- padding: 16px;
104
- background-color: #f8f8f8;
105
- border-left: 4px solid #007bff;
106
- color: #666;
107
- font-style: italic;
108
- }
109
-
107
+ /* ---------------------------------------------------------------------------- */
110
108
  /* 设置强调样式 */
111
109
  .vigor-doc em, strong {
112
110
  font-style: italic;
@@ -116,6 +114,8 @@
116
114
  font-weight: 600;
117
115
  }
118
116
 
117
+ /* ---------------------------------------------------------------------------- */
118
+
119
119
  /* 设置表格样式 */
120
120
  .vigor-doc table {
121
121
  border-collapse: collapse;
@@ -134,21 +134,64 @@
134
134
  background-color: #f8f8f8;
135
135
  }
136
136
 
137
+ /* ---------------------------------------------------------------------------- */
138
+
139
+ /* 设置块引用样式 */
140
+ .vigor-doc blockquote {
141
+ margin: 16px 0;
142
+ border-left: 2px solid var(--vigor-c-blockquote-border);
143
+ padding-left: 16px;
144
+ transition: border-color 0.5s;
145
+ }
146
+
147
+ .vigor-doc blockquote > p {
148
+ margin: 0;
149
+ font-size: 16px;
150
+ color: var(--vigor-c-blockquote-text);
151
+ transition: color 0.5s;
152
+ }
153
+ /* ---------------------------------------------------------------------------- */
154
+
155
+ // 设置链接样式
156
+ .vigor-doc p a {
157
+ font-weight: 700;
158
+ color: var(--vigor-c-a-main);
159
+ text-decoration-style: dotted;
160
+ transition: color 0.25s;
161
+ }
162
+
163
+ .vigor-doc p a:hover {
164
+ color: var(--vigor-c-a-hover);
165
+ }
166
+
167
+ /* ---------------------------------------------------------------------------- */
137
168
 
138
- /* 代码块 */
139
- // pre {
140
- // background-color: var(--light-color);
141
- // border: 1px solid var(--main-color);
142
- // padding: 1em;
143
- // margin: 1em 0;
144
- // overflow: auto;
145
- // }
169
+ // 设置列表样式
170
+ .vigor-doc article ul,
171
+ .vigor-doc article ol {
172
+ padding-left: 1.25rem;
173
+ margin: 16px 0;
174
+ }
146
175
 
176
+ .vigor-doc article ul {
177
+ list-style: disc;
178
+ }
147
179
 
148
- // .vigor-doc p code:hover {
149
- // background-color: var(--main-color);
150
- // color: var(--light-color);
151
- // cursor: pointer
152
- // }
180
+ .vigor-doc article ol {
181
+ list-style: decimal;
182
+ }
153
183
 
184
+ .vigor-doc article li + li {
185
+ margin-top: 8px;
186
+ }
154
187
 
188
+ .vigor-doc article li > ol,
189
+ .vigor-doc article li > ul {
190
+ margin: 8px 0 0;
191
+ }
192
+
193
+ .vigor-doc article img {
194
+ width: 100%;
195
+ border: 1px solid var(--vigor-c-divider-light);
196
+ border-radius: 10px;
197
+ }
@@ -23,7 +23,7 @@ export function Nav() {
23
23
  <a href="/" className="w-full h-full text-1rem flex items-center" hover="opacity-60">vigor.js</a>
24
24
  </div>
25
25
  <div flex="~">
26
- <div flex="~">
26
+ <div flex="~" className="divider-right">
27
27
  {
28
28
  nav.map(item => (
29
29
  <MenuItem {...item} key={item.text} />
@@ -31,7 +31,7 @@ export function Nav() {
31
31
  }
32
32
  </div>
33
33
  <div>{ /*主题切换按钮*/ }</div>
34
- <div className={styles.socialLinkIcon}>
34
+ <div className={`${styles.socialLinkIcon} pl-3`}>
35
35
  <a href = { GITHUB_LINK_HREF } >
36
36
  <div className="i-carbon-logo-github w-5 h-5 fill-current"></div>
37
37
  </a>
@@ -1,34 +1,42 @@
1
1
  .prev-page {
2
2
  float: left;
3
+ display: flex;
4
+ flex-wrap: wrap;
3
5
  border: 1px solid;
4
6
  border-radius: 5px;
5
7
  &:hover {
6
8
  border-color: var(--vigor-c-nextPage-border);
7
9
  }
8
10
  transform: border-color 0.2s;
9
- padding: 1vh 19vw 1vh 1vw;
11
+ padding: 1vh 1vw;
12
+ width: 20rem;
10
13
  }
11
14
 
12
15
  .next-page {
13
16
  float: right;
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ text-align: end;
20
+ justify-content: end;
14
21
  border: 1px solid;
15
22
  border-radius: 5px;
16
23
  &:hover {
17
24
  border-color: var(--vigor-c-nextPage-border);
18
25
  }
19
26
  transform: border-color 0.2s;
20
- padding: 1vh 1vw 1vh 19vw;
27
+ padding: 1vh 1vw;
28
+ width: 20rem;
21
29
  }
22
30
 
23
31
  .prev-page-title {
24
- display: flex;
25
32
  opacity: 70%;
33
+ width: 100%;
26
34
  font-size: 0.8rem;
27
35
  }
28
36
 
29
37
  .next-page-title {
30
- display: flex;
31
38
  opacity: 70%;
39
+ width: 100%;
32
40
  font-size: 0.8rem;
33
41
  }
34
42
 
@@ -44,7 +44,7 @@ export function NextPage() {
44
44
  {
45
45
  prevPage &&
46
46
  <a href={prevPage.link} className={styles.prevPage} >
47
- <span mr="5" className={styles.prevPageTitle}>上一页</span>
47
+ <span className={styles.prevPageTitle}>上一页</span>
48
48
  <span className={ styles.prevPageContent }>{ prevPage.text }</span>
49
49
  </a>
50
50
  }
@@ -53,7 +53,7 @@ export function NextPage() {
53
53
  {
54
54
  nextPage &&
55
55
  <a href={nextPage.link} className={styles.nextPage} >
56
- <span mr="5" className={styles.nextPageTitle}>下一页</span>
56
+ <span className={styles.nextPageTitle}>下一页</span>
57
57
  <span className={ styles.nextPageContent }>{ nextPage.text } </span>
58
58
  </a>
59
59
  }
@@ -26,7 +26,7 @@ export function Sidebar(props: SidebarType) {
26
26
  // 渲染一个sidebar组
27
27
  const renderItems = (item: SidebarGroup) => {
28
28
  return (
29
- <section key={item.text} className="divider-bottom pb-3">
29
+ <section key={item.text} className="divider-bottom py-3">
30
30
  <div>
31
31
  <h2 className="font-semibold">{ item.text }</h2>
32
32
  </div>
@@ -38,7 +38,7 @@ export function TocComponent(props: TocType) {
38
38
  )
39
39
  }
40
40
  return (
41
- <div>
41
+ <div className="">
42
42
  <div>
43
43
  {
44
44
  tocLength && (
@@ -90,3 +90,15 @@ ul {
90
90
  margin: 0;
91
91
  padding: 0;
92
92
  }
93
+
94
+ /* 在此处设置一点代码块的lang部分的样式 */
95
+ .lang {
96
+ position: absolute;
97
+ top: 6px;
98
+ right: 12px;
99
+ z-index: 2;
100
+ font-size: 12px;
101
+ font-weight: 500;
102
+ color: azure;
103
+ text-align: left;
104
+ }
@@ -25,6 +25,7 @@
25
25
  --vigor-c-light-green: #4cd137;
26
26
  --vigor-c-deep-green: #44bd32;
27
27
  --vigor-c-deep-mo-green: #008080;
28
+ --vigor-c-deepest-green: #004643;
28
29
 
29
30
  --vigor-c-grey-blue: #487eb0;
30
31
  --vigor-c-grey-deep-blue: #40739e;
@@ -108,4 +109,10 @@
108
109
 
109
110
  --vigor-c-nextPage-content: var(--vigor-c-deep-mo-green);
110
111
  --vigor-c-nextPage-border: var(--vigor-c-deep-mo-green);
112
+
113
+ --vigor-c-a-main: var(--vigor-c-deep-mo-green);
114
+ --vigor-c-a-hover: var(--vigor-c-deepest-green);
115
+
116
+ --vigor-c-blockquote-border: var(--vigor-c-grey-blue);
117
+ --vigor-c-blockquote-text: var(--vigor-c-grey-deep-blue);
111
118
  }