vike-react 0.4.6 → 0.4.8
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 +1 -1
- package/dist/+config.d.ts +10 -0
- package/dist/+config.js +6 -1
- package/dist/index.js +1 -1
- package/dist/renderer/onRenderClient.js +16 -3
- package/dist/renderer/onRenderHtml.js +23 -4
- package/dist/types/Config.d.ts +24 -8
- package/dist/types/PageContext.d.ts +9 -1
- package/package.json +8 -7
package/README.md
CHANGED
package/dist/+config.d.ts
CHANGED
package/dist/+config.js
CHANGED
@@ -3,7 +3,6 @@ import { ssrEffect } from './renderer/ssrEffect.js';
|
|
3
3
|
// This is required to make TypeScript load the global interfaces such as Vike.PageContext so that they're always loaded: we can assume that the user always imports this file over `import vikeReact from 'vike-react/config'`
|
4
4
|
import './types/index.js';
|
5
5
|
export default {
|
6
|
-
// @ts-ignore Remove this ts-ignore once Vike's new version is released.
|
7
6
|
name: 'vike-react',
|
8
7
|
// https://vike.dev/onRenderHtml
|
9
8
|
onRenderHtml: 'import:vike-react/renderer/onRenderHtml:onRenderHtml',
|
@@ -40,6 +39,12 @@ export default {
|
|
40
39
|
stream: {
|
41
40
|
env: { server: true }
|
42
41
|
},
|
42
|
+
_streamIsRequied: {
|
43
|
+
env: { server: true }
|
44
|
+
},
|
45
|
+
onAfterRenderClient: {
|
46
|
+
env: { client: true }
|
47
|
+
},
|
43
48
|
VikeReactQueryWrapper: {
|
44
49
|
env: { client: true, server: true }
|
45
50
|
},
|
package/dist/index.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
// TODO/next-major-release: remove this file/export
|
2
|
-
console.warn("[vike-react][warning][deprecation] Replace `import vikeReact from 'vike-react'` with `import vikeReact from 'vike-react/config'` (typically in your /pages/+config.
|
2
|
+
console.warn("[vike-react][warning][deprecation] Replace `import vikeReact from 'vike-react'` with `import vikeReact from 'vike-react/config'` (typically in your /pages/+config.js)");
|
3
3
|
export { default } from './+config.js';
|
@@ -6,15 +6,25 @@ import { getPageElement } from './getPageElement.js';
|
|
6
6
|
let root;
|
7
7
|
const onRenderClient = (pageContext) => {
|
8
8
|
const page = getPageElement(pageContext);
|
9
|
-
|
9
|
+
// TODO: implement this? So that, upon errors, onRenderClient() throws an error and Vike can render the error. As of April 2024 it isn't released yet.
|
10
|
+
// - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/createRoot#show-a-dialog-for-uncaught-errors
|
11
|
+
// - https://react-dev-git-fork-rickhanlonii-rh-root-options-fbopensource.vercel.app/reference/react-dom/client/hydrateRoot#show-a-dialog-for-uncaught-errors
|
12
|
+
const onUncaughtError = (_error, _errorInfo) => { };
|
13
|
+
const container = document.getElementById('react-root');
|
10
14
|
if (container.innerHTML !== '' && pageContext.isHydration) {
|
11
15
|
// First render (hydration)
|
12
|
-
root = ReactDOM.hydrateRoot(container, page
|
16
|
+
root = ReactDOM.hydrateRoot(container, page, {
|
17
|
+
// @ts-expect-error
|
18
|
+
onUncaughtError
|
19
|
+
});
|
13
20
|
}
|
14
21
|
else {
|
15
22
|
if (!root) {
|
16
23
|
// First render (not hydration)
|
17
|
-
root = ReactDOM.createRoot(container
|
24
|
+
root = ReactDOM.createRoot(container, {
|
25
|
+
// @ts-expect-error
|
26
|
+
onUncaughtError
|
27
|
+
});
|
18
28
|
}
|
19
29
|
else {
|
20
30
|
// Client-side navigation
|
@@ -32,6 +42,9 @@ const onRenderClient = (pageContext) => {
|
|
32
42
|
}
|
33
43
|
root.render(page);
|
34
44
|
}
|
45
|
+
pageContext.page = page;
|
46
|
+
pageContext.root = root;
|
47
|
+
pageContext.config.onAfterRenderClient?.(pageContext);
|
35
48
|
};
|
36
49
|
// https://stackoverflow.com/questions/260857/changing-website-favicon-dynamically/260876#260876
|
37
50
|
function setFavicon(faviconUrl) {
|
@@ -8,6 +8,7 @@ import { getPageElement } from './getPageElement.js';
|
|
8
8
|
import { PageContextProvider } from '../hooks/usePageContext.js';
|
9
9
|
import React from 'react';
|
10
10
|
checkVikeVersion();
|
11
|
+
addEcosystemStamp();
|
11
12
|
const onRenderHtml = async (pageContext) => {
|
12
13
|
const title = getHeadSetting('title', pageContext);
|
13
14
|
const favicon = getHeadSetting('favicon', pageContext);
|
@@ -25,9 +26,16 @@ const onRenderHtml = async (pageContext) => {
|
|
25
26
|
}
|
26
27
|
else {
|
27
28
|
const page = getPageElement(pageContext);
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
const { stream,
|
30
|
+
// @ts-expect-error
|
31
|
+
_streamIsRequied } = pageContext.config;
|
32
|
+
if (!stream && !_streamIsRequied) {
|
33
|
+
pageView = dangerouslySkipEscape(renderToString(page));
|
34
|
+
}
|
35
|
+
else {
|
36
|
+
const disable = stream === false ? true : undefined;
|
37
|
+
pageView = await renderToStream(page, { userAgent: pageContext.userAgent, disable });
|
38
|
+
}
|
31
39
|
}
|
32
40
|
const documentHtml = escapeInject `<!DOCTYPE html>
|
33
41
|
<html lang='${lang}'>
|
@@ -38,7 +46,7 @@ const onRenderHtml = async (pageContext) => {
|
|
38
46
|
${faviconTag}
|
39
47
|
</head>
|
40
48
|
<body>
|
41
|
-
<div id="
|
49
|
+
<div id="react-root">${pageView}</div>
|
42
50
|
</body>
|
43
51
|
</html>`;
|
44
52
|
return documentHtml;
|
@@ -55,3 +63,14 @@ function checkVikeVersion() {
|
|
55
63
|
}
|
56
64
|
throw new Error('Update Vike to 0.4.147 or above');
|
57
65
|
}
|
66
|
+
// Used by:
|
67
|
+
// - react-streaming (to improve error messages, see https://github.com/brillout/react-streaming/blob/70c168de1e97b9c4385a4c3002b5013f1e406341/src/utils/isVikeReactApp.ts#L4)
|
68
|
+
function addEcosystemStamp() {
|
69
|
+
const g = globalThis;
|
70
|
+
g._isVikeReactApp =
|
71
|
+
/* Don't set to true so that consumers do `!!globalThis._isVikeApp` instead of `globalThis._isVikeApp === true`.
|
72
|
+
true
|
73
|
+
*/
|
74
|
+
// We use an object so that we can eventually, in the future, add helpful information as needed. (E.g. the vike-react version.)
|
75
|
+
{};
|
76
|
+
}
|
package/dist/types/Config.d.ts
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import type { PageContextClient } from 'vike/types';
|
1
2
|
declare global {
|
2
3
|
namespace VikePackages {
|
3
4
|
interface ConfigVikeReact {
|
@@ -5,10 +6,24 @@ declare global {
|
|
5
6
|
Page?: () => React.ReactNode;
|
6
7
|
/** React element rendered and appended into <head></head> */
|
7
8
|
Head?: () => React.ReactNode;
|
8
|
-
/**
|
9
|
+
/**
|
10
|
+
* A component that defines the visual layout of the page common to several pages.
|
11
|
+
*
|
12
|
+
* Technically: the `<Layou>` component wraps the root component `<Page>`.
|
13
|
+
*
|
14
|
+
* https://vike.dev/Layout
|
15
|
+
*/
|
9
16
|
Layout?: (props: {
|
10
17
|
children: React.ReactNode;
|
11
18
|
}) => React.ReactNode;
|
19
|
+
/**
|
20
|
+
* A component wrapping the the root component `<Page>`.
|
21
|
+
*
|
22
|
+
* https://vike.dev/Wrapper
|
23
|
+
*/
|
24
|
+
Wrapper?: (props: {
|
25
|
+
children: React.ReactNode;
|
26
|
+
}) => React.ReactNode;
|
12
27
|
/** <title>${title}</title> */
|
13
28
|
title?: string;
|
14
29
|
/** <link rel="icon" href="${favicon}" /> */
|
@@ -20,12 +35,11 @@ declare global {
|
|
20
35
|
*/
|
21
36
|
lang?: string;
|
22
37
|
/**
|
23
|
-
* If true
|
24
|
-
* page's HTML will be rendered at build-time or request-time.
|
25
|
-
* If false, render mode is SPA. In other words, the page will only be
|
26
|
-
* rendered in the browser.
|
38
|
+
* If `true`, the page is rendered twice: on the server-side (to HTML) and on the client-side (hydration).
|
27
39
|
*
|
28
|
-
*
|
40
|
+
* If `false`, the page is rendered only once in the browser.
|
41
|
+
*
|
42
|
+
* https://vike.dev/ssr
|
29
43
|
*
|
30
44
|
* @default true
|
31
45
|
*
|
@@ -38,9 +52,11 @@ declare global {
|
|
38
52
|
*
|
39
53
|
*/
|
40
54
|
stream?: boolean;
|
55
|
+
/**
|
56
|
+
* Client-side hook called after the page is rendered.
|
57
|
+
*/
|
58
|
+
onAfterRenderClient?: (pageContext: PageContextClient) => void;
|
41
59
|
VikeReactQueryWrapper?: React.ReactNode;
|
42
|
-
Wrapper?: () => React.ReactNode;
|
43
60
|
}
|
44
61
|
}
|
45
62
|
}
|
46
|
-
export {};
|
@@ -1,9 +1,17 @@
|
|
1
|
+
import type React from 'react';
|
2
|
+
import type { JSX } from 'react';
|
3
|
+
import type ReactDOM from 'react-dom/client';
|
1
4
|
declare global {
|
2
5
|
namespace Vike {
|
3
6
|
interface PageContext {
|
7
|
+
/** The root React component of the page */
|
4
8
|
Page?: () => React.ReactNode;
|
9
|
+
/** The user agent string of the user's browser */
|
5
10
|
userAgent?: string;
|
11
|
+
/** The root React element of the page */
|
12
|
+
page?: JSX.Element;
|
13
|
+
/** The React root DOM container */
|
14
|
+
root?: ReactDOM.Root;
|
6
15
|
}
|
7
16
|
}
|
8
17
|
}
|
9
|
-
export {};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "vike-react",
|
3
|
-
"version": "0.4.
|
3
|
+
"version": "0.4.8",
|
4
4
|
"type": "module",
|
5
5
|
"main": "./dist/index.js",
|
6
6
|
"types": "./dist/index.d.ts",
|
@@ -16,9 +16,9 @@
|
|
16
16
|
"scripts": {
|
17
17
|
"dev": "tsc --watch",
|
18
18
|
"build": "rm -rf dist/ && tsc",
|
19
|
-
"release": "release-me --git-prefix vike-react
|
20
|
-
"release:minor": "release-me --git-prefix vike-react
|
21
|
-
"release:commit": "release-me --git-prefix vike-react
|
19
|
+
"release": "release-me --git-tag-prefix vike-react patch",
|
20
|
+
"release:minor": "release-me --git-tag-prefix vike-react minor",
|
21
|
+
"release:commit": "release-me --git-tag-prefix vike-react commit"
|
22
22
|
},
|
23
23
|
"peerDependencies": {
|
24
24
|
"react": "18.x.x",
|
@@ -27,17 +27,18 @@
|
|
27
27
|
"vite": "^4.3.8 || ^5.0.10"
|
28
28
|
},
|
29
29
|
"devDependencies": {
|
30
|
-
"@
|
30
|
+
"@biomejs/biome": "^1.6.4",
|
31
|
+
"@brillout/release-me": "^0.2.1",
|
31
32
|
"@types/node": "^20.11.17",
|
32
33
|
"@types/react": "^18.2.55",
|
33
34
|
"@types/react-dom": "^18.2.19",
|
34
35
|
"react": "^18.2.0",
|
35
36
|
"react-dom": "^18.2.0",
|
36
37
|
"typescript": "^5.3.3",
|
37
|
-
"vike": "^0.4.
|
38
|
+
"vike": "^0.4.168"
|
38
39
|
},
|
39
40
|
"dependencies": {
|
40
|
-
"react-streaming": "^0.3.
|
41
|
+
"react-streaming": "^0.3.27"
|
41
42
|
},
|
42
43
|
"typesVersions": {
|
43
44
|
"*": {
|