vike-react 0.6.5 → 0.6.6
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/hooks/usePageContext.js +1 -1
- package/dist/integration/Loading.js +21 -15
- package/dist/integration/getPageElement.d.ts +1 -0
- package/dist/integration/getPageElement.js +8 -2
- package/dist/integration/onRenderClient.d.ts +0 -1
- package/dist/integration/onRenderClient.js +46 -13
- package/dist/utils/getGlobalObject.d.ts +1 -1
- package/package.json +10 -11
- package/dist/integration/Loading.css +0 -10
@@ -2,7 +2,7 @@ export { usePageContext };
|
|
2
2
|
export { PageContextProvider };
|
3
3
|
import React, { useContext } from 'react';
|
4
4
|
import { getGlobalObject } from '../utils/getGlobalObject.js';
|
5
|
-
const globalObject = getGlobalObject('
|
5
|
+
const globalObject = getGlobalObject('usePageContext.tsx', {
|
6
6
|
reactContext: React.createContext(undefined),
|
7
7
|
});
|
8
8
|
function PageContextProvider({ pageContext, children }) {
|
@@ -2,20 +2,26 @@ export default {
|
|
2
2
|
component: LoadingComponent,
|
3
3
|
};
|
4
4
|
import React from 'react';
|
5
|
-
/* We can't import it here: https://github.com/vikejs/vike/issues/2460
|
6
|
-
* - We import it inside onRenderClient.js instead.
|
7
|
-
* - We'll be able to do it if Vite + Rolldown always transpiles the server-side.
|
8
|
-
import './Loading.css'
|
9
|
-
*/
|
10
5
|
function LoadingComponent() {
|
11
|
-
return (React.createElement(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
6
|
+
return (React.createElement(React.Fragment, null,
|
7
|
+
React.createElement("div", { style: {
|
8
|
+
width: '100%',
|
9
|
+
height: '100%',
|
10
|
+
maxHeight: '100%',
|
11
|
+
background: 'linear-gradient(110deg, #ececec 8%, #f5f5f5 18%, #ececec 33%)',
|
12
|
+
borderRadius: '5px',
|
13
|
+
backgroundSize: '200% 100%',
|
14
|
+
animation: '1.3s vike-react-loading linear infinite',
|
15
|
+
aspectRatio: '2.5/1',
|
16
|
+
} }),
|
17
|
+
React.createElement("style", { href: "vike-react-loading",
|
18
|
+
// https://react.dev/reference/react-dom/components/style#special-rendering-behavior
|
19
|
+
// https://github.com/vikejs/vike-react/pull/184#discussion_r2348075206
|
20
|
+
precedence: "default" }, `
|
21
|
+
@keyframes vike-react-loading {
|
22
|
+
to {
|
23
|
+
background-position-x: -200%;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
`)));
|
21
27
|
}
|
@@ -20,14 +20,20 @@ function getPageElement(pageContext) {
|
|
20
20
|
page = React.createElement(Wrap, null, page);
|
21
21
|
page = addSuspense(page);
|
22
22
|
});
|
23
|
+
// TODO/now rename
|
23
24
|
page = React.createElement(PageContextProvider, { pageContext: pageContext }, page);
|
24
25
|
let renderPromiseResolve;
|
25
|
-
let
|
26
|
+
let renderPromiseReject;
|
27
|
+
let renderPromise = new Promise((resolve, reject) => {
|
28
|
+
renderPromiseResolve = resolve;
|
29
|
+
renderPromiseReject = reject;
|
30
|
+
});
|
31
|
+
// TODO/now rename
|
26
32
|
page = React.createElement(RenderPromiseProvider, { renderPromiseResolve: renderPromiseResolve }, page);
|
27
33
|
if (pageContext.config.reactStrictMode !== false) {
|
28
34
|
page = React.createElement(React.StrictMode, null, page);
|
29
35
|
}
|
30
|
-
return { page, renderPromise };
|
36
|
+
return { page, renderPromise, renderPromiseReject };
|
31
37
|
}
|
32
38
|
function RenderPromiseProvider({ children, renderPromiseResolve, }) {
|
33
39
|
useEffect(renderPromiseResolve);
|
@@ -6,36 +6,54 @@ import { getPageElement } from './getPageElement.js';
|
|
6
6
|
import { callCumulativeHooks } from '../utils/callCumulativeHooks.js';
|
7
7
|
import { applyHeadSettings } from './applyHeadSettings.js';
|
8
8
|
import { resolveReactOptions } from './resolveReactOptions.js';
|
9
|
-
import
|
10
|
-
|
9
|
+
import { getGlobalObject } from '../utils/getGlobalObject.js';
|
10
|
+
import { isObject } from '../utils/isObject.js';
|
11
|
+
const globalObject = getGlobalObject('onRenderClient.tsx', {});
|
12
|
+
// TODO/now: update TS
|
11
13
|
const onRenderClient = async (pageContext) => {
|
12
14
|
pageContext._headAlreadySet = pageContext.isHydration;
|
13
15
|
// Use case:
|
14
16
|
// - Store hydration https://github.com/vikejs/vike-react/issues/110
|
15
17
|
await callCumulativeHooks(pageContext.config.onBeforeRenderClient, pageContext);
|
16
|
-
const { page, renderPromise } = getPageElement(pageContext);
|
18
|
+
const { page, renderPromise, renderPromiseReject } = getPageElement(pageContext);
|
17
19
|
pageContext.page = page;
|
18
|
-
//
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
// Local callback for current page
|
21
|
+
globalObject.onUncaughtErrorLocal = (err) => {
|
22
|
+
renderPromiseReject(err);
|
23
|
+
};
|
22
24
|
const container = document.getElementById('root');
|
23
25
|
const { hydrateRootOptions, createRootOptions } = resolveReactOptions(pageContext);
|
24
26
|
if (pageContext.isHydration &&
|
25
27
|
// Whether the page was [Server-Side Rendered](https://vike.dev/ssr).
|
26
28
|
container.innerHTML !== '') {
|
27
29
|
// First render while using SSR, i.e. [hydration](https://vike.dev/hydration)
|
28
|
-
root = ReactDOM.hydrateRoot(container, page,
|
30
|
+
globalObject.root = ReactDOM.hydrateRoot(container, page, {
|
31
|
+
...hydrateRootOptions,
|
32
|
+
// onUncaughtError is the right callback: https://gist.github.com/brillout/b9516e83a7a4517f4dbd0ef50e9dd716
|
33
|
+
onUncaughtError(...args) {
|
34
|
+
onUncaughtErrorGlobal.call(this, args, hydrateRootOptions);
|
35
|
+
},
|
36
|
+
});
|
29
37
|
}
|
30
38
|
else {
|
31
|
-
if (!root) {
|
39
|
+
if (!globalObject.root) {
|
32
40
|
// First render without SSR
|
33
|
-
root = ReactDOM.createRoot(container,
|
41
|
+
globalObject.root = ReactDOM.createRoot(container, {
|
42
|
+
...createRootOptions,
|
43
|
+
onUncaughtError(...args) {
|
44
|
+
onUncaughtErrorGlobal.call(this, args, createRootOptions);
|
45
|
+
},
|
46
|
+
});
|
34
47
|
}
|
35
|
-
root.render(page);
|
48
|
+
globalObject.root.render(page);
|
49
|
+
}
|
50
|
+
pageContext.root = globalObject.root;
|
51
|
+
try {
|
52
|
+
await renderPromise;
|
53
|
+
}
|
54
|
+
finally {
|
55
|
+
delete globalObject.onUncaughtErrorLocal;
|
36
56
|
}
|
37
|
-
pageContext.root = root;
|
38
|
-
await renderPromise;
|
39
57
|
if (!pageContext.isHydration) {
|
40
58
|
pageContext._headAlreadySet = true;
|
41
59
|
applyHead(pageContext);
|
@@ -50,3 +68,18 @@ function applyHead(pageContext) {
|
|
50
68
|
const lang = getHeadSetting('lang', pageContext);
|
51
69
|
applyHeadSettings(title, lang);
|
52
70
|
}
|
71
|
+
// Global callback, attached once upon hydration.
|
72
|
+
function onUncaughtErrorGlobal(args, userOptions) {
|
73
|
+
logUncaughtError(args);
|
74
|
+
const [error] = args;
|
75
|
+
globalObject.onUncaughtErrorLocal?.(error);
|
76
|
+
userOptions?.onUncaughtError?.apply(this, args);
|
77
|
+
}
|
78
|
+
async function logUncaughtError(args) {
|
79
|
+
const [error, errorInfo] = args;
|
80
|
+
console.error('%o\n%s', error, `The above error occurred at:${errorInfo.componentStack}`);
|
81
|
+
// Used by Vike:
|
82
|
+
// https://github.com/vikejs/vike/blob/8ce2cbda756892f0ff083256291515b5a45fe319/packages/vike/client/runtime-client-routing/renderPageClientSide.ts#L838-L844
|
83
|
+
if (isObject(error))
|
84
|
+
error.isAlreadyLogged = true;
|
85
|
+
}
|
@@ -1 +1 @@
|
|
1
|
-
export declare function getGlobalObject<T extends Record<string, unknown> = never>(key: `${string}.ts`, defaultValue: T): T;
|
1
|
+
export declare function getGlobalObject<T extends Record<string, unknown> = never>(key: `${string}.ts` | `${string}.tsx`, defaultValue: T): T;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "vike-react",
|
3
|
-
"version": "0.6.
|
3
|
+
"version": "0.6.6",
|
4
4
|
"repository": "https://github.com/vikejs/vike-react",
|
5
5
|
"type": "module",
|
6
6
|
"exports": {
|
@@ -27,7 +27,7 @@
|
|
27
27
|
"./__internal/integration/Loading": "./dist/integration/Loading.js"
|
28
28
|
},
|
29
29
|
"dependencies": {
|
30
|
-
"react-streaming": "^0.4.
|
30
|
+
"react-streaming": "^0.4.4"
|
31
31
|
},
|
32
32
|
"peerDependencies": {
|
33
33
|
"react": ">=19",
|
@@ -38,14 +38,14 @@
|
|
38
38
|
"@biomejs/biome": "^1.9.4",
|
39
39
|
"@brillout/release-me": "^0.4.8",
|
40
40
|
"@types/node": "^24.0.8",
|
41
|
-
"@types/react": "^19.
|
42
|
-
"@types/react-dom": "^19.
|
43
|
-
"react": "^19.
|
44
|
-
"react-dom": "^19.
|
41
|
+
"@types/react": "^19.1.10",
|
42
|
+
"@types/react-dom": "^19.1.7",
|
43
|
+
"react": "^19.1.1",
|
44
|
+
"react-dom": "^19.1.1",
|
45
45
|
"rimraf": "^5.0.5",
|
46
|
-
"typescript": "^5.
|
47
|
-
"vike": "^0.4.
|
48
|
-
"vite": "^
|
46
|
+
"typescript": "^5.9.2",
|
47
|
+
"vike": "^0.4.237",
|
48
|
+
"vite": "^7.1.5"
|
49
49
|
},
|
50
50
|
"typesVersions": {
|
51
51
|
"*": {
|
@@ -95,8 +95,7 @@
|
|
95
95
|
],
|
96
96
|
"scripts": {
|
97
97
|
"dev": "tsc --watch",
|
98
|
-
"build": "rimraf dist/ && tsc
|
99
|
-
"build:css": "cp src/integration/Loading.css dist/integration/Loading.css",
|
98
|
+
"build": "rimraf dist/ && tsc",
|
100
99
|
"release": "release-me patch",
|
101
100
|
"release:minor": "release-me minor",
|
102
101
|
"release:commit": "release-me commit"
|
@@ -1,10 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
This CSS is loaded for all vike-react users, even if they don't use the <Loading> component because it's imported not directly but over depednency injection, see:
|
3
|
-
https://github.com/vikejs/vike/discussions/2340
|
4
|
-
*/
|
5
|
-
|
6
|
-
@keyframes vike-react-shine {
|
7
|
-
to {
|
8
|
-
background-position-x: -200%;
|
9
|
-
}
|
10
|
-
}
|