-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
30 lines (29 loc) · 22.9 KB
/
Copy pathindex.html
File metadata and controls
30 lines (29 loc) · 22.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>VextJS</title>
<link href="/static/css/styles.63e783842e.css" rel="stylesheet">
<script defer src="/static/js/styles.9f6eb39360.js"></script>
<script defer src="/static/js/lib-react.b473cabded.js"></script>
<script defer src="/static/js/lib-router.b76a51aefb.js"></script>
<script defer src="/static/js/193.d0c921acfd.js"></script>
<script defer src="/static/js/index.925cbcbbe4.js"></script>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="Rspress v2.0.7">
<meta name="google-site-verification" content="eYbt9ZyPTFQHdpEJ8Iujlb9ndhmAcMlstxZd6106840">
<meta property="og:type" content="website">
<meta property="og:title" content="VextJS">
<meta property="og:description" content="High-performance full-stack Node.js framework with native routing, React frontend integration, three-tier hot reload, schema-dsl validation, OpenAPI, and production runtime features.">
<meta property="og:url" content="https://vextjs.github.io/">
<meta property="og:image" content="https://vextjs.github.io/og-card.svg">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<meta name="description" content="High-performance full-stack Node.js framework with native routing, React frontend integration, three-tier hot reload, schema-dsl validation, OpenAPI, and production runtime features."></head>
<body>
<div id="__rspress_root"><link rel="preload" as="image" href="/logo.svg"/><div class="vext-motion-field" aria-hidden="true"></div><div class="vext-pointer-field" aria-hidden="true"></div><nav class="vext-ecosystem-menu" aria-label="VextJS ecosystem"><button class="vext-ecosystem-trigger" type="button" aria-haspopup="true" aria-label="Open VextJS ecosystem navigation" title="Ecosystem"><span class="vext-ecosystem-trigger__grid" aria-hidden="true"><span></span><span></span><span></span><span></span></span></button><div class="vext-ecosystem-panel"><div class="vext-ecosystem-panel__header"><span class="vext-ecosystem-panel__mark"><span>VX</span></span><div><strong>VextJS Ecosystem</strong><span>Docs, packages and integration surface</span></div></div><div class="vext-ecosystem-panel__grid"><a class="vext-ecosystem-card" href="https://github.com/vextjs/vext" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>VX</span></span><span class="vext-ecosystem-card__text"><strong>vext</strong><span>High-performance API runtime</span></span></a><a class="vext-ecosystem-card" href="https://vextjs.github.io/schema-dsl/" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>S</span></span><span class="vext-ecosystem-card__text"><strong>schema-dsl</strong><span>Schema declaration and validation semantics</span></span></a><a class="vext-ecosystem-card" href="https://vextjs.github.io/monSQLize/" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>M</span></span><span class="vext-ecosystem-card__text"><strong>monSQLize</strong><span>MongoDB modeling for service projects</span></span></a><a class="vext-ecosystem-card" href="https://vextjs.github.io/flex-rate-limit/" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>FR</span></span><span class="vext-ecosystem-card__text"><strong>flex-rate-limit</strong><span>Flexible rate limiting for APIs</span></span></a><a class="vext-ecosystem-card" href="https://vextjs.github.io/permission-core/" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>PC</span></span><span class="vext-ecosystem-card__text"><strong>permission-core</strong><span>Permission primitives for application guards</span></span></a><a class="vext-ecosystem-card" href="https://github.com/vextjs" rel="noreferrer" target="_blank"><span class="vext-ecosystem-card__mark"><span>GH</span></span><span class="vext-ecosystem-card__text"><strong>GitHub Org</strong><span>Explore the vextjs organization</span></span></a></div></div></nav><header class="rp-nav"><div class="rp-nav__left"><div class="rp-nav__title"><a href="/" class="rp-nav__title__link rp-link"><div class="rp-nav__title__logo"><img src="/logo.svg" alt="logo" id="logo" class="rspress-logo rp-nav__title__logo-image"/></div><span>VextJS</span></a></div></div><div class="rp-nav__right"><button class="rp-search-button"><div class="rp-search-button__content"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="none" viewBox="0 0 20 21" class="rp-search-button__icon"><path fill="currentColor" d="M8.333 1.913A6.667 6.667 0 0 1 15 8.58c0 1.54-.525 2.957-1.402 4.085l4.49 4.492a.834.834 0 0 1-1.177 1.178l-4.491-4.49a6.64 6.64 0 0 1-4.087 1.402 6.667 6.667 0 0 1 0-13.334m0 1.667a5 5 0 1 0 0 10 5 5 0 0 0 0-10"></path></svg><span class="rp-search-button__word">Search</span></div><div class="rp-search-button__hotkey" style="opacity:0"><span></span><span>K</span></div></button><div class="rp-search-button--mobile"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="none" viewBox="0 0 20 21"><path fill="currentColor" d="M8.333 1.913A6.667 6.667 0 0 1 15 8.58c0 1.54-.525 2.957-1.402 4.085l4.49 4.492a.834.834 0 0 1-1.177 1.178l-4.491-4.49a6.64 6.64 0 0 1-4.087 1.402 6.667 6.667 0 0 1 0-13.334m0 1.667a5 5 0 1 0 0 10 5 5 0 0 0 0-10"></path></svg></div><ul class="rp-nav-menu rp-nav-menu--right"><li class="rp-nav-menu__item"><a href="/guide/introduction.html" class="rp-nav-menu__item__container rp-link">Guide</a></li><li class="rp-nav-menu__item"><a href="/frontend/overview.html" class="rp-nav-menu__item__container rp-link">Frontend</a></li><li class="rp-nav-menu__item"><a href="/guide/routing.html" class="rp-nav-menu__item__container rp-link">Runtime</a></li><li class="rp-nav-menu__item"><a href="/guide/validation.html" class="rp-nav-menu__item__container rp-link">Data</a></li><li class="rp-nav-menu__item"><a href="/guide/deployment.html" class="rp-nav-menu__item__container rp-link">Production</a></li><li class="rp-nav-menu__item"><a href="/api/config.html" class="rp-nav-menu__item__container rp-link">API Reference</a></li><li class="rp-nav-menu__item"><a href="/examples/hello-world.html" class="rp-nav-menu__item__container rp-link">Examples</a></li><li class="rp-nav-menu__item"><a href="/benchmark.html" class="rp-nav-menu__item__container rp-link">Benchmark</a></li><li class="rp-nav-menu__item"><div class="rp-nav-menu__item__container">v0.3.26<svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-nav-menu__item__icon"><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></div><ul class="rp-hover-group rp-hover-group--hidden rp-hover-group--center"><li class="rp-hover-group__item" style="padding-left:8px" data-depth="0"><a href="https://github.com/vextjs/vext/blob/main/CHANGELOG.md" target="_blank" class="rp-hover-group__item__link rp-link" aria-label="Changelog">Changelog</a></li><li class="rp-hover-group__item" style="padding-left:8px" data-depth="0"><a href="https://github.com/vextjs/vext/blob/main/CONTRIBUTING.md" target="_blank" class="rp-hover-group__item__link rp-link" aria-label="Contributing">Contributing</a></li></ul></li></ul><div class="rp-nav__others"><div class="rp-nav-menu__divider"></div><li class="rp-nav-menu__item"><div class="rp-nav-menu__item__container">English<svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-nav-menu__item__icon"><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></div><ul class="rp-hover-group rp-hover-group--hidden rp-hover-group--center"><li class="rp-hover-group__item rp-hover-group__item--active" style="padding-left:8px" data-depth="0"><a href="/" class="rp-hover-group__item__link rp-link" aria-label="English" lang="en" hrefLang="en" rel="alternate">English</a></li><li class="rp-hover-group__item" style="padding-left:8px" data-depth="0"><a href="/zh/index.html" class="rp-hover-group__item__link rp-link" aria-label="简体中文" lang="zh" hrefLang="zh" rel="alternate">简体中文</a></li></ul></li><div class="rp-social-links"><a href="https://github.com/vextjs/vext" target="_blank" rel="noopener noreferrer" class="rp-social-links__item"><div class="rp-social-links__icon"><div class="rp-social-links__icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></div></div></a><ul class="rp-hover-group rp-hover-group--hidden rp-hover-group--right"></ul></div></div><button aria-label="mobile hamburger" class="rp-nav-hamburger rp-nav-hamburger__sm"><svg xmlns="http://www.w3.org/2000/svg" width="21" height="21" fill="none" viewBox="0 0 21 21"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.667" d="M3.645 5.225h13.333M3.645 10.225h13.333M3.645 15.225h13.333"></path></svg></button><button aria-label="mobile hamburger" class="rp-nav-hamburger rp-nav-hamburger__md"><svg xmlns="http://www.w3.org/2000/svg" width="21" height="21" fill="none" viewBox="0 0 21 21"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.667" d="M3.645 5.225h13.333M3.645 10.225h13.333M3.645 15.225h13.333"></path></svg><ul class="rp-hover-group rp-hover-group--hidden rp-hover-group--right"><div class="rp-nav-menu__others-mobile__container"><div class="rp-nav-hamburger__md__hover-group"><div class="rp-nav-screen-langs"><div class="rp-nav-screen-langs__left">Languages</div><div class="rp-nav-screen-langs__right">English<svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-nav-screen-langs__icon "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></div></div><div class="rp-nav-screen-langs-group" style="display:grid;grid-template-rows:0fr;transition:grid-template-rows 0.2s ease-out"><div class="rp-nav-screen-langs-group__inner"><span class="rp-nav-screen-langs-group__item rp-nav-screen-langs-group__item--active" aria-current="page" aria-disabled="true">English</span><a href="/zh/index.html" class="rp-nav-screen-langs-group__item rp-link" hrefLang="zh" lang="zh" rel="alternate">简体中文</a></div></div><div class="rp-nav-screen-divider"></div><div class="rp-social-links"><a href="https://github.com/vextjs/vext" target="_blank" rel="noopener noreferrer" class="rp-social-links__item"><div class="rp-social-links__icon"><div class="rp-social-links__icon"><svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></div></div></a><ul class="rp-hover-group rp-hover-group--hidden rp-hover-group--right"></ul></div></div></div></ul></button></div></header><!--$--><main class="vext-home"><section class="vext-hero"><div class="vext-hero__inner"><div class="vext-hero__content"><p class="vext-hero__eyebrow">VEXTJS 0.3.26 / FULL-STACK RUNTIME</p><h1>VextJS</h1><p class="vext-hero__lead"><p>A Node.js framework built for high-performance APIs and integrated React frontends. Native
fast path, three-tier backend hot reload, frontend rebuild, CLI, validation, OpenAPI, and
production runtime capabilities are ready in one project model.</p></p><div class="vext-actions"><a class="vext-button vext-button--primary" href="/guide/quick-start.html">Quick start</a><a class="vext-button vext-button--ghost" href="/guide/hot-reload.html">Three-tier reload</a><a class="vext-button vext-button--ghost" href="/benchmark.html">Benchmark</a><a class="vext-button vext-button--ghost" href="https://github.com/vextjs/vext">GitHub</a></div><div class="vext-trust-row"><div class="vext-trust-item"><strong>T1</strong><span>Route code hot swap in 1-10 ms</span></div><div class="vext-trust-item"><strong>T2</strong><span>Service/model structural reload in 5-50 ms</span></div><div class="vext-trust-item"><strong>T3</strong><span>Config/plugin cold restart in 1-3 s</span></div><div class="vext-trust-item"><strong>Native</strong><span>http.createServer fast path</span></div></div></div><aside class="vext-console" aria-label="Vext project creation console"><div class="vext-console__bar"><div class="vext-console__dots"><span></span><span></span><span></span></div><span>create</span></div><div class="vext-console__body"><div class="vext-console__line vext-console__line--typing"><span class="vext-console__prompt">$</span><span class="vext-console__typed" data-vext-typewriter="npx vextjs create my-app">npx vextjs create my-app</span></div><div class="vext-console__line"><span class="vext-console__ok">create</span><span>vext project "my-app"</span></div><div class="vext-console__line"><span class="vext-console__muted">preset</span><span>TypeScript / React / native adapter</span></div><div class="vext-console__line"><span class="vext-console__muted">write</span><span>client / routes / services / config</span></div><div class="vext-console__line"><span class="vext-console__route">deps</span><span>install vextjs and dev scripts</span></div><div class="vext-console__line"><span class="vext-console__ok">done</span><span>Project created successfully</span></div><div class="vext-console__line"><span class="vext-console__muted">next</span><span>cd my-app && npm run dev</span></div><div class="vext-console__metrics"><div class="vext-console__metric"><strong>Full-stack</strong><span>default scaffold</span></div><div class="vext-console__metric"><strong>5 adapters</strong><span>native default</span></div><div class="vext-console__metric"><strong>React</strong><span>typed client</span></div></div></div></aside></div></section><nav class="vext-path-strip" aria-label="Vext documentation paths"><a href="/guide/quick-start.html"><strong>Start</strong><span>From scaffold to the first full-stack app</span></a><a href="/guide/hot-reload.html"><strong>Reload</strong><span>Understand backend hot reload and frontend rebuild boundaries</span></a><a href="/benchmark.html"><strong>Perf</strong><span>Reproduce Native fast path benchmark data</span></a><a href="/guide/deployment.html"><strong>Ship</strong><span>Deploy, gracefully shut down, rolling restart, and cluster</span></a><a href="/api/config.html"><strong>API</strong><span>Config, routes, context, plugins, and testing tools</span></a></nav><section class="vext-section"><div class="vext-section__header"><p class="vext-kicker">Hot Reload Pipeline</p><h2 class="vext-title">Three-tier backend hot reload plus frontend rebuild keeps development feedback tight.</h2><p class="vext-copy">Vext chooses a reload strategy by change boundary: replace what can be hot-swapped, rebuild frontend assets when client files change, and cold start only when runtime boundaries change.</p></div><div class="vext-reload"><article class="vext-tier-card vext-tier-card--active"><span class="vext-capability__mark">T1 / code</span><h3>Route code hot swap</h3><p>Business code such as <code>src/routes/</code> uses a millisecond-level replacement path while the dev service process and connection state stay alive.</p><strong>1-10 ms</strong></article><article class="vext-tier-card"><span class="vext-capability__mark">T2 / struct</span><h3>Service and model structural reload</h3><p>Changes in services, models, locale resources, and similar structures trigger local reloads instead of pushing every edit to a cold restart.</p><strong>5-50 ms</strong></article><article class="vext-tier-card"><span class="vext-capability__mark">T3 / cold</span><h3>Runtime-boundary cold start</h3><p>Configuration, plugin, and middleware changes perform a cold start so runtime boundaries are rebuilt correctly without sacrificing safety.</p><strong>1-3 s</strong></article></div></section><section class="vext-section"><div class="vext-section__header"><p class="vext-kicker">Performance Stack</p><h2 class="vext-title">Performance is not a wrapper phrase; it is a set of engineering choices from the HTTP path to production guardrails.</h2><p class="vext-copy">The homepage keeps the framework's real engineering surface visible: Native fast path, route-core, schema/OpenAPI, CLI, and production delivery capabilities.</p></div><div class="vext-capability-grid"><article class="vext-capability"><span class="vext-capability__mark">fast path</span><h3>Native high-performance path</h3><p>The Native Adapter stays close to Node.js HTTP and keeps routing lightweight with route-core.</p></article><article class="vext-capability"><span class="vext-capability__mark">router</span><h3>Full-stack route core</h3><p>File routes, three-part route definitions, generated client contracts, and request context are organized around one Vext project model.</p></article><article class="vext-capability"><span class="vext-capability__mark">schema</span><h3>Validation and OpenAPI</h3><p>Declare parameter rules in route options so request validation and API documentation share one definition.</p></article><article class="vext-capability"><span class="vext-capability__mark">cli</span><h3>Ready-to-use CLI</h3><p>Create, develop, build, and start commands are gathered under the framework entry, so new projects can begin immediately.</p></article><article class="vext-capability"><span class="vext-capability__mark">hooks</span><h3>Runtime lifecycle</h3><p>request, validation, response, service, fetch, and related hooks support plugins and cross-cutting logic.</p></article><article class="vext-capability"><span class="vext-capability__mark">safe ship</span><h3>Production safety capabilities</h3><p>Rate limiting, structured errors, graceful shutdown, heartbeat monitoring, and multi-process deployment complete the delivery path.</p></article></div></section><section class="vext-section"><div class="vext-matrix"><div class="vext-matrix__panel"><p class="vext-kicker">Runtime Flexibility</p><h2 class="vext-title">Adapters are flexibility, not the homepage's main character.</h2><p>Vext's main line is the framework's own API performance and developer experience. Adapters connect different HTTP ecosystems when needed, making migration and integration steadier.</p></div><div class="vext-adapter-list"><div class="vext-adapter-row"><strong>Native</strong><span>Native HTTP fast path for minimal dependencies and throughput-focused services.</span><em>core</em></div><div class="vext-adapter-row"><strong>Hono</strong><span>Lightweight modern ecosystem for edge scenarios and middleware composition.</span><em>lean</em></div><div class="vext-adapter-row"><strong>Fastify</strong><span>Mature high-performance ecosystem for complex plugin scenarios.</span><em>plugin</em></div><div class="vext-adapter-row"><strong>Express</strong><span>Compatible with migration from traditional Node.js projects.</span><em>classic</em></div><div class="vext-adapter-row"><strong>Koa</strong><span>Fits onion-model flow and reuse of existing Koa code.</span><em>flow</em></div></div></div></section><section class="vext-section"><div class="vext-production"><div><p class="vext-kicker">Production Ready</p><h2 class="vext-title">Secure, stable, shippable, and not stuck at the demo layer.</h2><p class="vext-copy">The Vext documentation entry should let teams quickly judge whether it can enter real server-side projects: rate limiting, graceful shutdown, rolling restart, cluster, i18n, structured errors, and OpenAPI all need to be visible.</p></div><div class="vext-production__signals"><div class="vext-signal"><strong>Rate Limit</strong><span>Built-in rate limiting reduces abuse risk.</span></div><div class="vext-signal"><strong>Graceful</strong><span>The shutdown flow protects connections and requests.</span></div><div class="vext-signal"><strong>Cluster</strong><span>Multi-process mode and heartbeats fit production supervision.</span></div><div class="vext-signal"><strong>Errors</strong><span>Business codes, i18n, and JSON-safe details.</span></div></div></div></section><section class="vext-section"><div class="vext-section__header"><p class="vext-kicker">Next Steps</p><h2 class="vext-title">Jump directly into the engineering path you want to verify.</h2></div><div class="vext-next"><a href="/guide/quick-start.html"><strong>Create the first project</strong><span>Use npx vextjs create to scaffold a TypeScript + React project.</span></a><a href="/guide/hot-reload.html"><strong>Verify reload behavior</strong><span>Review backend T1/T2/T3 trigger boundaries and frontend rebuild output.</span></a><a href="/guide/deployment.html"><strong>Prepare production deployment</strong><span>Review build, start, graceful shutdown, and multi-process strategies.</span></a><a href="/benchmark.html"><strong>Reproduce performance benchmarks</strong><span>Validate throughput in different scenarios with repository benchmark scripts.</span></a></div></section><footer class="vext-footer"><div class="vext-footer__inner"><div class="vext-footer__brand"><strong>VextJS</strong><span>High-performance Node.js full-stack runtime.</span></div><div class="vext-footer__grid"><div><h2>Vext</h2><a href="/guide/introduction.html">Introduction</a><a href="/guide/quick-start.html">Quick start</a><a href="/guide/hot-reload.html">Hot reload</a></div><div><h2>Ecosystem</h2><a href="https://vextjs.github.io/schema-dsl/">schema-dsl</a><a href="https://vextjs.github.io/monSQLize/">monSQLize</a><a href="https://vextjs.github.io/flex-rate-limit/">flex-rate-limit</a><a href="https://vextjs.github.io/permission-core/">permission-core</a></div><div><h2>Resources</h2><a href="/api/config.html">API Reference</a><a href="/examples/hello-world.html">Examples</a><a href="/benchmark.html">Benchmark</a></div><div><h2>Version</h2><a href="https://github.com/vextjs/vext/blob/main/CHANGELOG.md">Changelog</a><a href="https://github.com/vextjs/vext">GitHub</a><a href="https://github.com/vextjs">GitHub Organization</a><span>Apache-2.0</span></div></div></div></footer></main><!--/$--></div>
<div id="__rspress_modal_container"></div>
</body>
</html>