vue-ssr-lite 0.1.9 → 0.1.11
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/README.md +94 -12
- package/dist/SsrApplicationRuntime.d.ts +16 -0
- package/dist/SsrApplicationRuntime.d.ts.map +1 -1
- package/dist/SsrBrowserRuntime.d.ts +21 -0
- package/dist/SsrBrowserRuntime.d.ts.map +1 -1
- package/dist/SsrDiagnosticsRuntime.d.ts +22 -0
- package/dist/SsrDiagnosticsRuntime.d.ts.map +1 -0
- package/dist/SsrReactivityRuntime.d.ts +52 -0
- package/dist/SsrReactivityRuntime.d.ts.map +1 -0
- package/dist/SsrRenderRuntime.d.ts +16 -2
- package/dist/SsrRenderRuntime.d.ts.map +1 -1
- package/dist/SsrRequestResolution.d.ts +79 -0
- package/dist/SsrRequestResolution.d.ts.map +1 -0
- package/dist/SsrRuntimeTypes.d.ts +40 -1
- package/dist/SsrRuntimeTypes.d.ts.map +1 -1
- package/dist/chunks/SsrApplicationRuntime-h6X7RjxC.mjs +154 -0
- package/dist/chunks/SsrDiagnosticsRuntime-B5VbSgsA.mjs +28 -0
- package/dist/chunks/SsrReactivityRuntime-CUbPx7ew.mjs +9 -0
- package/dist/chunks/SsrServerRuntime-yvAyDoVJ.mjs +731 -0
- package/dist/cli.mjs +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.mjs +79 -31
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +18 -11
- package/dist/server/SsrRuntimeConfigRuntime.d.ts +54 -0
- package/dist/server/SsrRuntimeConfigRuntime.d.ts.map +1 -0
- package/dist/server/SsrServerRuntime.d.ts.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.mjs +123 -23
- package/docs/SsrBuiltoCompatibility.md +12 -9
- package/package.json +1 -1
- package/dist/chunks/SsrApplicationRuntime-BFebmWyk.mjs +0 -95
- package/dist/chunks/SsrServerRuntime-ChrpJneS.mjs +0 -670
package/README.md
CHANGED
|
@@ -74,7 +74,7 @@ yarn add --dev vite @vitejs/plugin-vue
|
|
|
74
74
|
|
|
75
75
|
### SPA
|
|
76
76
|
|
|
77
|
-
Use `kind: 'spa'` for a
|
|
77
|
+
Use `kind: 'spa'` for a Vue application that runs in the browser.
|
|
78
78
|
|
|
79
79
|
Examples:
|
|
80
80
|
|
|
@@ -84,7 +84,23 @@ Examples:
|
|
|
84
84
|
- Authenticated application
|
|
85
85
|
- Client-side portal
|
|
86
86
|
|
|
87
|
-
A
|
|
87
|
+
A single application definition is mountable in three modes — server render,
|
|
88
|
+
browser hydration of a server render, and pure client-side SPA. Define the app
|
|
89
|
+
once with `defineSsrApplication()` and mount it in the SPA entry with
|
|
90
|
+
`mountSpaApplication()`, so the SPA and SSR paths of the same application share
|
|
91
|
+
one plugin set, router and public-config delivery and cannot drift:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
// src/main.ts — thin SPA entry over the shared definition
|
|
95
|
+
import { mountSpaApplication } from 'vue-ssr-lite/client'
|
|
96
|
+
import { app } from './app' // defineSsrApplication({ ... })
|
|
97
|
+
|
|
98
|
+
void mountSpaApplication(app)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
A plain Vite `main.ts` (`createApp(App).use(router).mount('#app')`) still works
|
|
102
|
+
for an application that never needs SSR, but prefer the unified definition when
|
|
103
|
+
the same app also has an SSR entry.
|
|
88
104
|
|
|
89
105
|
### SSR
|
|
90
106
|
|
|
@@ -110,18 +126,30 @@ The following example creates:
|
|
|
110
126
|
|
|
111
127
|
## 1. Create the SPA Application
|
|
112
128
|
|
|
113
|
-
|
|
129
|
+
Define the application once and mount it through the package. Router creation,
|
|
130
|
+
plugin installation, public-config delivery and mounting are owned by
|
|
131
|
+
`vue-ssr-lite`, identically to the SSR and hydration paths:
|
|
114
132
|
|
|
115
133
|
```ts
|
|
116
|
-
// src/spa/
|
|
117
|
-
import {
|
|
134
|
+
// src/spa/app.ts
|
|
135
|
+
import { defineSsrApplication } from 'vue-ssr-lite'
|
|
118
136
|
import App from './App.vue'
|
|
119
|
-
import
|
|
137
|
+
import routes from './routes'
|
|
120
138
|
|
|
121
|
-
const app =
|
|
139
|
+
export const app = defineSsrApplication({
|
|
140
|
+
id: 'dashboard',
|
|
141
|
+
rootComponent: App,
|
|
142
|
+
routes,
|
|
143
|
+
plugins: [/* your Vue plugins */],
|
|
144
|
+
})
|
|
145
|
+
```
|
|
122
146
|
|
|
123
|
-
|
|
124
|
-
|
|
147
|
+
```ts
|
|
148
|
+
// src/spa/main.ts — thin entry
|
|
149
|
+
import { mountSpaApplication } from 'vue-ssr-lite/client'
|
|
150
|
+
import { app } from './app'
|
|
151
|
+
|
|
152
|
+
void mountSpaApplication(app)
|
|
125
153
|
```
|
|
126
154
|
|
|
127
155
|
Create the SPA root component:
|
|
@@ -161,7 +189,7 @@ Create the SPA HTML entry:
|
|
|
161
189
|
</html>
|
|
162
190
|
```
|
|
163
191
|
|
|
164
|
-
|
|
192
|
+
The same definition backs the SSR entry, so the SPA and SSR paths cannot drift.
|
|
165
193
|
|
|
166
194
|
## 2. Create the SSR Application
|
|
167
195
|
|
|
@@ -912,12 +940,66 @@ server: {
|
|
|
912
940
|
|
|
913
941
|
`/healthz` and `/readyz` include the active `role` in their JSON responses.
|
|
914
942
|
|
|
943
|
+
## Server-side data resolution
|
|
944
|
+
|
|
945
|
+
`renderToString` awaits each component's native `onServerPrefetch`, which covers
|
|
946
|
+
data consumed reactively inside the component that declared it. For work started
|
|
947
|
+
OUTSIDE that lifecycle — a store action, an i18n loader, a lazy query — the
|
|
948
|
+
package exposes a generic, API-client-neutral **resolution contract**.
|
|
949
|
+
|
|
950
|
+
An installed plugin obtains it by injecting `SSR_REQUEST_RESOLUTION`
|
|
951
|
+
(`Symbol.for('vue-ssr:request-resolution')`, resolvable without importing this
|
|
952
|
+
package). It registers in-flight work with `track(promise)` and may call
|
|
953
|
+
`requestAdditionalPass()`. After each render pass the renderer awaits registered
|
|
954
|
+
work and re-renders when a plugin asked for another pass, up to
|
|
955
|
+
`server.maxResolutionPasses` (default 4) and bounded by
|
|
956
|
+
`server.resolutionDeadlineMs` and the request abort signal.
|
|
957
|
+
|
|
958
|
+
A fully resolvable page completes in **one pass** — extra passes occur only when
|
|
959
|
+
a plugin left work pending or requested one. `vue-ssr-lite` never inspects the
|
|
960
|
+
work; it only awaits it.
|
|
961
|
+
|
|
962
|
+
## SSR-safe reactivity
|
|
963
|
+
|
|
964
|
+
During SSR, Vue does not flush the scheduler, so `watch(src, cb)` and
|
|
965
|
+
`watchEffect` run at most once and are then discarded — the most common cause of
|
|
966
|
+
"the shell renders but the content is missing" bugs. Server-safe APIs:
|
|
967
|
+
|
|
968
|
+
| API | Server behaviour |
|
|
969
|
+
| --- | --- |
|
|
970
|
+
| `computed` | ✅ Lazily evaluated during render |
|
|
971
|
+
| `ssrWatch(src, cb)` / `ssrWatchEffect(fn)` | ✅ Sync flush, active during render |
|
|
972
|
+
| `watch(src, cb)` / `watchEffect(fn)` | ⚠️ Runs once (or never), then discarded |
|
|
973
|
+
| `onServerPrefetch(async fn)` | ✅ Awaited before the component renders |
|
|
974
|
+
| `onMounted` / `onUpdated` | ❌ Browser only |
|
|
975
|
+
|
|
976
|
+
Use a `computed` to derive a value for the template; reach for `ssrWatch` /
|
|
977
|
+
`ssrWatchEffect` (exported from `vue-ssr-lite` and `vue-ssr-lite/client`) when
|
|
978
|
+
resolved data must drive an imperative side effect during the server render.
|
|
979
|
+
|
|
980
|
+
## Runtime configuration helpers
|
|
981
|
+
|
|
982
|
+
`vue-ssr-lite/server` provides declarative helpers so a runtime definition is
|
|
983
|
+
configuration, not boilerplate: `ssrEnvBoolean`, `ssrEnvNumber`, `ssrEnvList`,
|
|
984
|
+
`requireSsrEnv`, `requireSsrHostname`, `requireSsrEnum`, `createSsrConsoleLogger`
|
|
985
|
+
and `createSsrSeoEndpoints` (`robots.txt` / `sitemap.xml` — `served`, `proxy` or
|
|
986
|
+
`disallow` by option). Host helpers such as `normalizeSsrHost` remain exported;
|
|
987
|
+
reuse them rather than re-implementing.
|
|
988
|
+
|
|
989
|
+
## Development diagnostics
|
|
990
|
+
|
|
991
|
+
When diagnostics are enabled (`server.diagnostics`, default on outside
|
|
992
|
+
production) the renderer reports, with actionable messages: a loading
|
|
993
|
+
placeholder or `aria-busy="true"` still present after resolution, a route that
|
|
994
|
+
matched no component, and a body that resolved to nothing. These are dev-only
|
|
995
|
+
warnings; production render paths are untouched.
|
|
996
|
+
|
|
915
997
|
## Summary
|
|
916
998
|
|
|
917
999
|
For a SPA:
|
|
918
1000
|
|
|
919
|
-
1.
|
|
920
|
-
2.
|
|
1001
|
+
1. Define the app once with `defineSsrApplication()`.
|
|
1002
|
+
2. Mount it in a thin `main.ts` with `mountSpaApplication()`.
|
|
921
1003
|
3. Register the HTML file in `spaEntries`.
|
|
922
1004
|
4. Add a runtime entry with `kind: 'spa'`.
|
|
923
1005
|
|
|
@@ -1,8 +1,24 @@
|
|
|
1
|
+
import { SsrResolutionController } from './SsrRequestResolution';
|
|
1
2
|
import { SsrApplicationDefinition, SsrCreatedApplication, SsrHydrationState, SsrRenderRequest } from './SsrRuntimeTypes';
|
|
2
3
|
export interface SsrCreateApplicationOptions<TApplicationState, TPublicConfig> {
|
|
3
4
|
server: boolean;
|
|
4
5
|
request: SsrRenderRequest<TPublicConfig>;
|
|
5
6
|
hydrationState?: SsrHydrationState<TApplicationState, TPublicConfig> | null;
|
|
7
|
+
/**
|
|
8
|
+
* Pure client-side SPA mount (no server markup to hydrate). Uses `createApp`
|
|
9
|
+
* instead of `createSSRApp` so Vue performs a full client render.
|
|
10
|
+
*/
|
|
11
|
+
spa?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Server re-render only: opaque plugin state carried from the previous pass,
|
|
14
|
+
* restored so plugins (an API client cache, an i18n loader) resume warm.
|
|
15
|
+
*/
|
|
16
|
+
resumeState?: Record<string, unknown> | null;
|
|
17
|
+
/**
|
|
18
|
+
* Reuse a resolution controller across render passes of the same request.
|
|
19
|
+
* A fresh one is created when omitted.
|
|
20
|
+
*/
|
|
21
|
+
resolution?: SsrResolutionController;
|
|
6
22
|
}
|
|
7
23
|
export declare const createSsrApplication: <TApplicationState extends Record<string, any> = Record<string, unknown>, TPublicConfig = unknown, TExtension = unknown>(definition: SsrApplicationDefinition<TApplicationState, TPublicConfig, TExtension>, options: SsrCreateApplicationOptions<TApplicationState, TPublicConfig>) => Promise<SsrCreatedApplication<TApplicationState, TPublicConfig, TExtension>>;
|
|
8
24
|
//# sourceMappingURL=SsrApplicationRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SsrApplicationRuntime.d.ts","sourceRoot":"","sources":["../src/SsrApplicationRuntime.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,2BAA2B,CAC1C,iBAAiB,EACjB,aAAa;IAEb,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,aAAa,CAAC,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"SsrApplicationRuntime.d.ts","sourceRoot":"","sources":["../src/SsrApplicationRuntime.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,2BAA2B,CAC1C,iBAAiB,EACjB,aAAa;IAEb,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;IACxC,cAAc,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,aAAa,CAAC,GAAG,IAAI,CAAA;IAC3E;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC5C;;;OAGG;IACH,UAAU,CAAC,EAAE,uBAAuB,CAAA;CACrC;AAED,eAAO,MAAM,oBAAoB,GAC/B,iBAAiB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,aAAa,GAAG,OAAO,EACvB,UAAU,GAAG,OAAO,EAEpB,YAAY,wBAAwB,CAClC,iBAAiB,EACjB,aAAa,EACb,UAAU,CACX,EACD,SAAS,2BAA2B,CAAC,iBAAiB,EAAE,aAAa,CAAC,KACrE,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,aAAa,EAAE,UAAU,CAAC,CAqG7E,CAAA"}
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
+
import { App } from 'vue';
|
|
1
2
|
import { SsrApplicationDefinition } from './SsrRuntimeTypes';
|
|
2
3
|
export interface SsrHydrateOptions {
|
|
3
4
|
mountSelector?: string;
|
|
4
5
|
stateElementId?: string;
|
|
5
6
|
removeHeadSelector?: string;
|
|
6
7
|
}
|
|
8
|
+
export interface SsrSpaMountOptions<TPublicConfig = unknown> {
|
|
9
|
+
mountSelector?: string;
|
|
10
|
+
/** Client-side public config. Defaults to `{}` for a self-contained SPA. */
|
|
11
|
+
publicConfig?: TPublicConfig;
|
|
12
|
+
/** Initial URL to route to. Defaults to `window.location`. */
|
|
13
|
+
url?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SsrMountedApplication {
|
|
16
|
+
app: App;
|
|
17
|
+
/** Unmount the app and dispose per-request resources. */
|
|
18
|
+
unmount: () => void;
|
|
19
|
+
}
|
|
7
20
|
export declare const hydrateSsrApplication: (definition: SsrApplicationDefinition<any, any, any>, options?: SsrHydrateOptions) => Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Mounts an {@link SsrApplicationDefinition} as a pure client-side SPA — the
|
|
23
|
+
* third mode alongside server render and browser hydration. The SAME definition
|
|
24
|
+
* (root component, routes, plugins, install hook, public config delivery) drives
|
|
25
|
+
* all three, so a consumer's SPA entry and SSR entry cannot drift. No server
|
|
26
|
+
* markup is required: Vue performs a full client render.
|
|
27
|
+
*/
|
|
28
|
+
export declare const mountSpaApplication: <TApplicationState extends Record<string, any> = Record<string, unknown>, TPublicConfig = unknown, TExtension = unknown>(definition: SsrApplicationDefinition<TApplicationState, TPublicConfig, TExtension>, options?: SsrSpaMountOptions<TPublicConfig>) => Promise<SsrMountedApplication>;
|
|
8
29
|
//# sourceMappingURL=SsrBrowserRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SsrBrowserRuntime.d.ts","sourceRoot":"","sources":["../src/SsrBrowserRuntime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SsrBrowserRuntime.d.ts","sourceRoot":"","sources":["../src/SsrBrowserRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAG9B,OAAO,KAAK,EACV,wBAAwB,EAGzB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB,CAAC,aAAa,GAAG,OAAO;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,GAAG,CAAA;IACR,yDAAyD;IACzD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAkBD,eAAO,MAAM,qBAAqB,GAChC,YAAY,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACnD,UAAS,iBAAsB,KAC9B,OAAO,CAAC,IAAI,CAkDd,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,iBAAiB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,aAAa,GAAG,OAAO,EACvB,UAAU,GAAG,OAAO,EAEpB,YAAY,wBAAwB,CAClC,iBAAiB,EACjB,aAAa,EACb,UAAU,CACX,EACD,UAAS,kBAAkB,CAAC,aAAa,CAAM,KAC9C,OAAO,CAAC,qBAAqB,CA8C/B,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Router } from 'vue-router';
|
|
2
|
+
/**
|
|
3
|
+
* Development-only render diagnostics.
|
|
4
|
+
*
|
|
5
|
+
* These surface the failure modes that otherwise ship silently to search
|
|
6
|
+
* engines: a server render that still shows a spinner, a route that matched no
|
|
7
|
+
* component, or a body that resolved to nothing. Every check is a pure string /
|
|
8
|
+
* route inspection with no side effects, and the caller only runs them when
|
|
9
|
+
* diagnostics are enabled, so production render paths are untouched.
|
|
10
|
+
*/
|
|
11
|
+
export interface SsrRenderDiagnosticInput {
|
|
12
|
+
html: string;
|
|
13
|
+
route?: Router['currentRoute']['value'] | null;
|
|
14
|
+
requestUrl: string;
|
|
15
|
+
applicationId: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SsrRenderDiagnostic {
|
|
18
|
+
code: 'loading-placeholder' | 'empty-route' | 'empty-content' | 'busy-attribute';
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const collectSsrRenderDiagnostics: (input: SsrRenderDiagnosticInput) => SsrRenderDiagnostic[];
|
|
22
|
+
//# sourceMappingURL=SsrDiagnosticsRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsrDiagnosticsRuntime.d.ts","sourceRoot":"","sources":["../src/SsrDiagnosticsRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC;;;;;;;;GAQG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EACA,qBAAqB,GACrB,aAAa,GACb,eAAe,GACf,gBAAgB,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;CAChB;AAoBD,eAAO,MAAM,2BAA2B,GACtC,OAAO,wBAAwB,KAC9B,mBAAmB,EAgCrB,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { watchEffect, WatchCallback, WatchOptions, WatchSource, WatchStopHandle } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* SSR-safe reactivity.
|
|
4
|
+
*
|
|
5
|
+
* # Which Vue reactivity APIs are server-safe
|
|
6
|
+
*
|
|
7
|
+
* During server-side rendering Vue does NOT flush the scheduler, so any effect
|
|
8
|
+
* queued to run later is created and then discarded. This is the single most
|
|
9
|
+
* common cause of "the shell renders but the content is missing" bugs.
|
|
10
|
+
*
|
|
11
|
+
* | API | Server behaviour |
|
|
12
|
+
* | ------------------------------------- | -------------------------------------------------- |
|
|
13
|
+
* | `computed` | ✅ Safe. Lazily evaluated during render. |
|
|
14
|
+
* | `watch(src, cb, { flush: 'sync' })` | ✅ Safe. Runs synchronously, stays active in render.|
|
|
15
|
+
* | `watch(src, cb)` / `{ flush:'pre' }` | ⚠️ Discarded. `immediate` runs once, then nothing.|
|
|
16
|
+
* | `watch(src, cb, { flush: 'post' })` | ⚠️ Discarded. Never runs on the server. |
|
|
17
|
+
* | `watchEffect(fn)` | ⚠️ Runs once at setup, then discarded. |
|
|
18
|
+
* | `onServerPrefetch(async fn)` | ✅ Safe. Awaited before the component renders. |
|
|
19
|
+
* | `onMounted` / `onUpdated` | ❌ Browser only. Never runs on the server. |
|
|
20
|
+
*
|
|
21
|
+
* # The primitive
|
|
22
|
+
*
|
|
23
|
+
* {@link ssrWatch} and {@link ssrWatchEffect} force `flush: 'sync'`, so the
|
|
24
|
+
* effect is active during the server render and reacts to state that settles
|
|
25
|
+
* mid-render (for example a ref written by an awaited `onServerPrefetch`). They
|
|
26
|
+
* behave identically on the server and in the browser, which is exactly what an
|
|
27
|
+
* application needs to derive state from resolved data without reinventing a
|
|
28
|
+
* broken watcher workaround.
|
|
29
|
+
*
|
|
30
|
+
* Prefer a `computed` when you only need to DERIVE a value for the template.
|
|
31
|
+
* Reach for {@link ssrWatch} when resolved data must drive an imperative side
|
|
32
|
+
* effect (populating an external store, setting a status code) that has to
|
|
33
|
+
* happen during the server render.
|
|
34
|
+
*/
|
|
35
|
+
export type SsrWatchOptions<Immediate extends boolean = boolean> = Omit<WatchOptions<Immediate>, 'flush'>;
|
|
36
|
+
/**
|
|
37
|
+
* `watch`, pinned to `flush: 'sync'` so the callback is active during SSR.
|
|
38
|
+
*
|
|
39
|
+
* Identical semantics to Vue's `watch` otherwise: pass `{ immediate: true }` to
|
|
40
|
+
* run once on setup, and use the returned handle to stop it. Because the flush
|
|
41
|
+
* is synchronous, avoid mutating the watched source from inside the callback.
|
|
42
|
+
*/
|
|
43
|
+
export declare function ssrWatch<T, Immediate extends boolean = false>(source: WatchSource<T>, callback: WatchCallback<T, Immediate extends true ? T | undefined : T>, options?: SsrWatchOptions<Immediate>): WatchStopHandle;
|
|
44
|
+
export declare function ssrWatch<T extends readonly unknown[], Immediate extends boolean = false>(source: readonly [...T] | (() => T), callback: WatchCallback<T, Immediate extends true ? T | undefined : T>, options?: SsrWatchOptions<Immediate>): WatchStopHandle;
|
|
45
|
+
/**
|
|
46
|
+
* `watchEffect`, pinned to `flush: 'sync'` so the effect is active during SSR.
|
|
47
|
+
* The effect runs immediately and re-runs synchronously whenever a tracked
|
|
48
|
+
* dependency changes — including changes that happen while the server render is
|
|
49
|
+
* still in progress.
|
|
50
|
+
*/
|
|
51
|
+
export declare const ssrWatchEffect: (effect: Parameters<typeof watchEffect>[0], options?: Omit<NonNullable<Parameters<typeof watchEffect>[1]>, "flush">) => WatchStopHandle;
|
|
52
|
+
//# sourceMappingURL=SsrReactivityRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsrReactivityRuntime.d.ts","sourceRoot":"","sources":["../src/SsrReactivityRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,KAAK,CAAA;AAEZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,OAAO,GAAG,OAAO,IAAI,IAAI,CACrE,YAAY,CAAC,SAAS,CAAC,EACvB,OAAO,CACR,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,SAAS,OAAO,GAAG,KAAK,EAC3D,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EACtB,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,SAAS,SAAS,IAAI,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,EACtE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GACnC,eAAe,CAAA;AAClB,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,SAAS,SAAS,OAAO,GAAG,KAAK,EACtF,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACnC,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,SAAS,SAAS,IAAI,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,EACtE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GACnC,eAAe,CAAA;AASlB;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EACzC,UAAU,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KACtE,eAAqE,CAAA"}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
-
import { SsrApplicationDefinition, SsrRenderRequest, SsrRenderResult } from './SsrRuntimeTypes';
|
|
2
|
-
export
|
|
1
|
+
import { SsrApplicationDefinition, SsrLogger, SsrRenderRequest, SsrRenderResult } from './SsrRuntimeTypes';
|
|
2
|
+
export interface SsrRenderOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Maximum render passes. The first always runs; further passes only occur
|
|
5
|
+
* when a plugin left resolution work pending or asked for another pass.
|
|
6
|
+
* Defaults to 4, clamped to at least 1.
|
|
7
|
+
*/
|
|
8
|
+
maxResolutionPasses?: number;
|
|
9
|
+
/** Bound, in ms, for awaiting registered work between passes. */
|
|
10
|
+
resolutionDeadlineMs?: number;
|
|
11
|
+
/** Enables development-only render diagnostics. Inert in production. */
|
|
12
|
+
diagnostics?: boolean;
|
|
13
|
+
/** Structured logger for diagnostics and pass reporting. */
|
|
14
|
+
logger?: SsrLogger;
|
|
15
|
+
}
|
|
16
|
+
export declare const renderSsrApplication: <TApplicationState extends Record<string, any> = Record<string, unknown>, TPublicConfig = unknown, TExtension = unknown>(definition: SsrApplicationDefinition<TApplicationState, TPublicConfig, TExtension>, request: SsrRenderRequest<TPublicConfig>, options?: SsrRenderOptions) => Promise<SsrRenderResult<TApplicationState, TPublicConfig>>;
|
|
3
17
|
//# sourceMappingURL=SsrRenderRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SsrRenderRuntime.d.ts","sourceRoot":"","sources":["../src/SsrRenderRuntime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SsrRenderRuntime.d.ts","sourceRoot":"","sources":["../src/SsrRenderRuntime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,wBAAwB,EAExB,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAK1B,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAeD,eAAO,MAAM,oBAAoB,GAC/B,iBAAiB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,aAAa,GAAG,OAAO,EACvB,UAAU,GAAG,OAAO,EAEpB,YAAY,wBAAwB,CAClC,iBAAiB,EACjB,aAAa,EACb,UAAU,CACX,EACD,SAAS,gBAAgB,CAAC,aAAa,CAAC,EACxC,UAAS,gBAAqB,KAC7B,OAAO,CAAC,eAAe,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAkK3D,CAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* Generic, framework-neutral server-render resolution contract.
|
|
4
|
+
*
|
|
5
|
+
* `renderToString` makes a single pass and awaits each component's native
|
|
6
|
+
* `onServerPrefetch`. That covers data consumed reactively inside the component
|
|
7
|
+
* that declared it, but it offers no way to:
|
|
8
|
+
*
|
|
9
|
+
* 1. await asynchronous work that was started OUTSIDE a component's own
|
|
10
|
+
* prefetch lifecycle (a store action, an i18n loader, a lazy query), or
|
|
11
|
+
* 2. tell the renderer that application state settled AFTER the first pass and
|
|
12
|
+
* the tree should be produced again.
|
|
13
|
+
*
|
|
14
|
+
* This contract closes both gaps without `vue-ssr-lite` learning anything about
|
|
15
|
+
* the plugin doing the work. An installed plugin — an API client, a store, an
|
|
16
|
+
* i18n cache — obtains the active resolution by injecting
|
|
17
|
+
* {@link SSR_REQUEST_RESOLUTION}. The key is created with `Symbol.for(...)` so a
|
|
18
|
+
* plugin integrates WITHOUT importing this package (it re-derives the identical
|
|
19
|
+
* symbol):
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* const resolution = app.runWithContext(() =>
|
|
23
|
+
* inject<SsrRequestResolution | null>(
|
|
24
|
+
* Symbol.for('vue-ssr:request-resolution'),
|
|
25
|
+
* null,
|
|
26
|
+
* )
|
|
27
|
+
* )
|
|
28
|
+
* resolution?.track(client.query(...))
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* The contract is API-client neutral: it never inspects the work it is handed.
|
|
32
|
+
*/
|
|
33
|
+
export interface SsrRequestResolution {
|
|
34
|
+
/** True while server-rendering, false during browser hydration / SPA mount. */
|
|
35
|
+
readonly server: boolean;
|
|
36
|
+
/** Zero-based index of the render pass currently in progress. */
|
|
37
|
+
readonly pass: number;
|
|
38
|
+
/**
|
|
39
|
+
* Register in-flight async work the renderer must await before it serializes
|
|
40
|
+
* the response. Returns the same promise for convenient chaining. Ignored in
|
|
41
|
+
* the browser, where there is no server render to gate. Rejections are
|
|
42
|
+
* swallowed by the renderer's await — the component tree owns error surfacing.
|
|
43
|
+
*/
|
|
44
|
+
track<T>(work: Promise<T>): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Request one additional render pass even when no tracked promise is pending.
|
|
47
|
+
* Use when work mutated shared state synchronously in a way the current tree
|
|
48
|
+
* did not observe. Honoured up to the configured pass bound.
|
|
49
|
+
*/
|
|
50
|
+
requestAdditionalPass(): void;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Cross-package-stable injection key for {@link SsrRequestResolution}. Uses the
|
|
54
|
+
* global symbol registry so integrations resolve the same identity whether or
|
|
55
|
+
* not they import `vue-ssr-lite`.
|
|
56
|
+
*/
|
|
57
|
+
export declare const SSR_REQUEST_RESOLUTION: InjectionKey<SsrRequestResolution>;
|
|
58
|
+
export interface SsrResolutionController extends SsrRequestResolution {
|
|
59
|
+
/** Begin a new render pass: clears the additional-pass request flag. */
|
|
60
|
+
beginPass(pass: number): void;
|
|
61
|
+
/** Promises registered during the current request that are not yet settled. */
|
|
62
|
+
pendingWork(): Promise<unknown>[];
|
|
63
|
+
/** True when a plugin explicitly asked for another pass this render. */
|
|
64
|
+
additionalPassRequested(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Await all currently-tracked work, bounded by `deadlineMs` and aborted by
|
|
67
|
+
* `signal`. Returns `true` when everything settled within the deadline.
|
|
68
|
+
*/
|
|
69
|
+
drain(deadlineMs: number, signal?: AbortSignal): Promise<boolean>;
|
|
70
|
+
/** Clear all state. Called once per request after the final pass. */
|
|
71
|
+
dispose(): void;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates the per-request resolution controller. Reused across every render
|
|
75
|
+
* pass of a single request so tracked work and pass requests accumulate
|
|
76
|
+
* coherently while the Vue application itself is recreated per pass.
|
|
77
|
+
*/
|
|
78
|
+
export declare const createSsrResolutionController: (server?: boolean) => SsrResolutionController;
|
|
79
|
+
//# sourceMappingURL=SsrRequestResolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsrRequestResolution.d.ts","sourceRoot":"","sources":["../src/SsrRequestResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,CAAA;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACtC;;;;OAIG;IACH,qBAAqB,IAAI,IAAI,CAAA;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAE9B,YAAY,CAAC,oBAAoB,CAAC,CAAA;AAEvC,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,wEAAwE;IACxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,+EAA+E;IAC/E,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;IACjC,wEAAwE;IACxE,uBAAuB,IAAI,OAAO,CAAA;IAClC;;;OAGG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,qEAAqE;IACrE,OAAO,IAAI,IAAI,CAAA;CAChB;AAYD;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GACxC,SAAQ,OAAuC,KAC9C,uBA4EF,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { App, Component, Plugin } from 'vue';
|
|
2
|
-
import { Router, RouteRecordRaw } from 'vue-router';
|
|
2
|
+
import { Router, RouteRecordRaw, RouterScrollBehavior } from 'vue-router';
|
|
3
3
|
import { SsrHydrationContext, SsrHydrationController } from './SsrHydrationRuntime';
|
|
4
|
+
import { SsrRequestResolution, SsrResolutionController } from './SsrRequestResolution';
|
|
4
5
|
export type SsrHeaderValue = string | string[] | undefined;
|
|
5
6
|
export type SsrHeaders = Record<string, SsrHeaderValue>;
|
|
6
7
|
export interface SsrHeadPayload {
|
|
@@ -46,6 +47,8 @@ export interface SsrRenderMetrics {
|
|
|
46
47
|
totalDurationMs: number;
|
|
47
48
|
htmlBytes: number;
|
|
48
49
|
stateBytes: number;
|
|
50
|
+
/** Number of render passes the resolution contract required. Usually 1. */
|
|
51
|
+
renderPasses: number;
|
|
49
52
|
}
|
|
50
53
|
export interface SsrRenderRequest<TPublicConfig = unknown> {
|
|
51
54
|
requestId: string;
|
|
@@ -83,6 +86,12 @@ export interface SsrRequestContext<TApplicationState = Record<string, unknown>,
|
|
|
83
86
|
response: SsrResponseState;
|
|
84
87
|
/** Generic hydration state contract for installed application plugins. */
|
|
85
88
|
hydration: SsrHydrationContext;
|
|
89
|
+
/**
|
|
90
|
+
* Generic server-render resolution contract. Installed plugins register
|
|
91
|
+
* in-flight work so the renderer can await it and re-render when resolution
|
|
92
|
+
* changes the tree. Present in every mode; a no-op outside the server render.
|
|
93
|
+
*/
|
|
94
|
+
resolution: SsrRequestResolution;
|
|
86
95
|
extension: TExtension;
|
|
87
96
|
}
|
|
88
97
|
export interface SsrApplicationSetup<TApplicationState, TPublicConfig, TExtension> {
|
|
@@ -91,6 +100,8 @@ export interface SsrApplicationSetup<TApplicationState, TPublicConfig, TExtensio
|
|
|
91
100
|
context: SsrRequestContext<TApplicationState, TPublicConfig, TExtension>;
|
|
92
101
|
/** Generic hydration state contract for installed application plugins. */
|
|
93
102
|
hydration: SsrHydrationContext;
|
|
103
|
+
/** Generic server-render resolution contract for installed plugins. */
|
|
104
|
+
resolution: SsrRequestResolution;
|
|
94
105
|
server: boolean;
|
|
95
106
|
}
|
|
96
107
|
export interface SsrApplicationDefinition<TApplicationState = Record<string, unknown>, TPublicConfig = unknown, TExtension = unknown> {
|
|
@@ -98,6 +109,12 @@ export interface SsrApplicationDefinition<TApplicationState = Record<string, unk
|
|
|
98
109
|
rootComponent: Component;
|
|
99
110
|
mountSelector?: string;
|
|
100
111
|
routes?: RouteRecordRaw[] | (() => RouteRecordRaw[]);
|
|
112
|
+
/**
|
|
113
|
+
* Optional router scroll behaviour. When omitted, a sensible default is used
|
|
114
|
+
* (restore saved position, scroll to hash, otherwise top). Provide one to keep
|
|
115
|
+
* an application's existing behaviour exactly when adopting the definition.
|
|
116
|
+
*/
|
|
117
|
+
scrollBehavior?: RouterScrollBehavior;
|
|
101
118
|
/** Generic Vue plugins installed for every isolated server/browser app. */
|
|
102
119
|
plugins?: readonly Plugin[];
|
|
103
120
|
createInitialState?: () => TApplicationState;
|
|
@@ -112,6 +129,8 @@ export interface SsrCreatedApplication<TApplicationState = Record<string, unknow
|
|
|
112
129
|
context: SsrRequestContext<TApplicationState, TPublicConfig, TExtension>;
|
|
113
130
|
/** Per-request hydration controller owning plugin state and disposal. */
|
|
114
131
|
hydration: SsrHydrationController;
|
|
132
|
+
/** Per-request resolution controller, shared across render passes. */
|
|
133
|
+
resolution: SsrResolutionController;
|
|
115
134
|
}
|
|
116
135
|
export interface SsrRenderResult<TApplicationState = unknown, TPublicConfig = unknown> {
|
|
117
136
|
html: string;
|
|
@@ -210,6 +229,26 @@ export interface SsrServerOptions<TPublicConfig = unknown> {
|
|
|
210
229
|
publicConfig: TPublicConfig;
|
|
211
230
|
healthPath?: string;
|
|
212
231
|
readinessPath?: string;
|
|
232
|
+
/**
|
|
233
|
+
* Maximum server render passes per request. The first pass always runs; extra
|
|
234
|
+
* passes only occur when an installed plugin left work pending or asked for
|
|
235
|
+
* another pass through the resolution contract. A fully resolvable page
|
|
236
|
+
* completes in one pass. Defaults to 4. Clamped to at least 1.
|
|
237
|
+
*/
|
|
238
|
+
maxResolutionPasses?: number;
|
|
239
|
+
/**
|
|
240
|
+
* Upper bound, in milliseconds, for awaiting registered resolution work
|
|
241
|
+
* BETWEEN passes. Independent of — and additionally capped by — the overall
|
|
242
|
+
* `requestTimeoutMs` and the request abort signal. Defaults to
|
|
243
|
+
* `requestTimeoutMs` when unset.
|
|
244
|
+
*/
|
|
245
|
+
resolutionDeadlineMs?: number;
|
|
246
|
+
/**
|
|
247
|
+
* Enables development-only render diagnostics (loading-placeholder detection,
|
|
248
|
+
* empty-route detection, discarded-watcher hints). Defaults to
|
|
249
|
+
* `NODE_ENV !== 'production'` when unset. Always inert in production.
|
|
250
|
+
*/
|
|
251
|
+
diagnostics?: boolean;
|
|
213
252
|
logger?: SsrLogger;
|
|
214
253
|
onMetrics?: (metrics: SsrRenderMetrics) => void;
|
|
215
254
|
renderError?: (context: SsrErrorRenderContext<TPublicConfig>) => SsrHttpResponse | null | Promise<SsrHttpResponse | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SsrRuntimeTypes.d.ts","sourceRoot":"","sources":["../src/SsrRuntimeTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"SsrRuntimeTypes.d.ts","sourceRoot":"","sources":["../src/SsrRuntimeTypes.ts"],"names":[],"mappings":"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"}
|