vike-react 0.3.4 → 0.3.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/README.md +1 -1
- package/dist/components/ClientOnly.d.ts +11 -0
- package/dist/components/ClientOnly.js +20 -0
- package/dist/renderer/+config.d.ts +19 -0
- package/dist/renderer/+config.js +6 -0
- package/dist/renderer/getPageElement.js +5 -3
- package/dist/renderer/onRenderHtml.js +28 -23
- package/package.json +8 -7
package/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
# `vike-react`
|
7
7
|
|
8
|
-
React integration for [Vike](https://vike.dev)
|
8
|
+
React integration for [Vike](https://vike.dev).
|
9
9
|
|
10
10
|
> For integrations with Vue and Solid, see the other [`vike-*` packages](https://vike.dev/vike-packages).
|
11
11
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
export { ClientOnly };
|
2
|
+
import React, { useEffect } from 'react';
|
3
|
+
import type { ReactNode } from 'react';
|
4
|
+
declare function ClientOnly<T>({ load, children, fallback, deps }: {
|
5
|
+
load: () => Promise<{
|
6
|
+
default: React.ComponentType<T>;
|
7
|
+
} | React.ComponentType<T>>;
|
8
|
+
children: (Component: React.ComponentType<T>) => ReactNode;
|
9
|
+
fallback: ReactNode;
|
10
|
+
deps?: Parameters<typeof useEffect>[1];
|
11
|
+
}): React.JSX.Element;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
export { ClientOnly };
|
2
|
+
import React, { Suspense, lazy, useEffect, useState } from 'react';
|
3
|
+
function ClientOnly({ load, children, fallback, deps }) {
|
4
|
+
const [Component, setComponent] = useState(null);
|
5
|
+
useEffect(() => {
|
6
|
+
const loadComponent = () => {
|
7
|
+
const Component = lazy(() => load()
|
8
|
+
.then((LoadedComponent) => {
|
9
|
+
return { default: () => children('default' in LoadedComponent ? LoadedComponent.default : LoadedComponent) };
|
10
|
+
})
|
11
|
+
.catch((error) => {
|
12
|
+
console.error('Component loading failed:', error);
|
13
|
+
return { default: () => React.createElement("p", null, "Error loading component.") };
|
14
|
+
}));
|
15
|
+
setComponent(Component);
|
16
|
+
};
|
17
|
+
loadComponent();
|
18
|
+
}, deps);
|
19
|
+
return React.createElement(Suspense, { fallback: fallback }, Component ? React.createElement(Component, null) : null);
|
20
|
+
}
|
@@ -44,6 +44,17 @@ declare const _default: {
|
|
44
44
|
};
|
45
45
|
effect: ConfigEffect;
|
46
46
|
};
|
47
|
+
stream: {
|
48
|
+
env: {
|
49
|
+
server: true;
|
50
|
+
};
|
51
|
+
};
|
52
|
+
VikeReactQueryWrapper: {
|
53
|
+
env: {
|
54
|
+
client: true;
|
55
|
+
server: true;
|
56
|
+
};
|
57
|
+
};
|
47
58
|
};
|
48
59
|
};
|
49
60
|
export default _default;
|
@@ -81,6 +92,14 @@ declare global {
|
|
81
92
|
*
|
82
93
|
*/
|
83
94
|
ssr?: boolean;
|
95
|
+
/**
|
96
|
+
* Whether to stream the page's HTML. Requires Server-Side Rendering (`ssr: true`).
|
97
|
+
*
|
98
|
+
* @default false
|
99
|
+
*
|
100
|
+
*/
|
101
|
+
stream?: boolean;
|
102
|
+
VikeReactQueryWrapper?: Component;
|
84
103
|
}
|
85
104
|
}
|
86
105
|
}
|
package/dist/renderer/+config.js
CHANGED
@@ -2,18 +2,20 @@ export { getPageElement };
|
|
2
2
|
import React from 'react';
|
3
3
|
import { PageContextProvider } from './PageContextProvider.js';
|
4
4
|
function getPageElement(pageContext) {
|
5
|
-
var _a;
|
5
|
+
var _a, _b;
|
6
6
|
const Layout = (_a = pageContext.config.Layout) !== null && _a !== void 0 ? _a : PassThrough;
|
7
7
|
const Wrapper =
|
8
8
|
/* Should we implement this? Enabling users to defined a wrapper that is used across all layouts.
|
9
9
|
pageContext.config.Wrapper ??
|
10
10
|
*/
|
11
11
|
PassThrough;
|
12
|
+
const VikeReactQueryWrapper = (_b = pageContext.config.VikeReactQueryWrapper) !== null && _b !== void 0 ? _b : PassThrough;
|
12
13
|
const { Page, pageProps } = pageContext;
|
13
14
|
const page = (React.createElement(React.StrictMode, null,
|
14
15
|
React.createElement(PageContextProvider, { pageContext: pageContext },
|
15
|
-
React.createElement(
|
16
|
-
React.createElement(
|
16
|
+
React.createElement(VikeReactQueryWrapper, { pageContext: pageContext },
|
17
|
+
React.createElement(Wrapper, null,
|
18
|
+
React.createElement(Layout, null, Page ? React.createElement(Page, { ...pageProps }) : null))))));
|
17
19
|
return page;
|
18
20
|
}
|
19
21
|
function PassThrough({ children }) {
|
@@ -10,35 +10,40 @@ import React from 'react';
|
|
10
10
|
checkVikeVersion();
|
11
11
|
const onRenderHtml = async (pageContext) => {
|
12
12
|
const lang = pageContext.config.lang || 'en';
|
13
|
-
const { favicon } = pageContext.config;
|
14
|
-
const faviconTag = !favicon ? '' :
|
13
|
+
const { stream, favicon, description } = pageContext.config;
|
14
|
+
const faviconTag = !favicon ? '' : escapeInject `<link rel="icon" href="${favicon}" />`;
|
15
|
+
const descriptionTag = !description ? '' : escapeInject `<meta name="description" content="${description}" />`;
|
15
16
|
const title = getTitle(pageContext);
|
16
|
-
const titleTag = !title ? '' :
|
17
|
-
const { description } = pageContext.config;
|
18
|
-
const descriptionTag = !description ? '' : React.createElement("meta", { name: "description", content: description });
|
17
|
+
const titleTag = !title ? '' : escapeInject `<title>${title}</title>`;
|
19
18
|
const Head = pageContext.config.Head || (() => React.createElement(React.Fragment, null));
|
20
19
|
const head = (React.createElement(React.StrictMode, null,
|
21
20
|
React.createElement(PageContextProvider, { pageContext: pageContext },
|
22
21
|
React.createElement(Head, null))));
|
23
|
-
const
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
const streamOrString = isSsrDisabled
|
35
|
-
? dangerouslySkipEscape(renderToString(htmlContent))
|
36
|
-
: await renderToStream(htmlContent, { userAgent: pageContext.userAgent });
|
22
|
+
const headHtml = dangerouslySkipEscape(renderToString(head));
|
23
|
+
let pageView;
|
24
|
+
if (!pageContext.Page) {
|
25
|
+
pageView = '';
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
const page = getPageElement(pageContext);
|
29
|
+
pageView = !stream
|
30
|
+
? dangerouslySkipEscape(renderToString(page))
|
31
|
+
: await renderToStream(page, { userAgent: pageContext.userAgent });
|
32
|
+
}
|
37
33
|
const documentHtml = escapeInject `<!DOCTYPE html>
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
<html lang='${lang}'>
|
35
|
+
<head>
|
36
|
+
<meta charset="UTF-8" />
|
37
|
+
${faviconTag}
|
38
|
+
${titleTag}
|
39
|
+
${descriptionTag}
|
40
|
+
${headHtml}
|
41
|
+
</head>
|
42
|
+
<body>
|
43
|
+
<div id="page-view">${pageView}</div>
|
44
|
+
</body>
|
45
|
+
<!-- built with https://github.com/vikejs/vike-react -->
|
46
|
+
</html>`;
|
42
47
|
return documentHtml;
|
43
48
|
};
|
44
49
|
function checkVikeVersion() {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "vike-react",
|
3
|
-
"version": "0.3.
|
3
|
+
"version": "0.3.6",
|
4
4
|
"type": "module",
|
5
5
|
"main": "./dist/renderer/+config.js",
|
6
6
|
"types": "./dist/renderer/+config.d.ts",
|
@@ -8,29 +8,30 @@
|
|
8
8
|
".": "./dist/renderer/+config.js",
|
9
9
|
"./renderer/onRenderHtml": "./dist/renderer/onRenderHtml.js",
|
10
10
|
"./renderer/onRenderClient": "./dist/renderer/onRenderClient.js",
|
11
|
-
"./usePageContext": "./dist/components/usePageContext.js"
|
11
|
+
"./usePageContext": "./dist/components/usePageContext.js",
|
12
|
+
"./ClientOnly": "./dist/components/ClientOnly.js"
|
12
13
|
},
|
13
14
|
"scripts": {
|
14
15
|
"dev": "tsc --watch",
|
15
16
|
"build": "rm -rf dist/ && tsc",
|
16
|
-
"release": "release-me patch",
|
17
|
-
"release:commit": "release-me commit"
|
17
|
+
"release": "release-me --git-prefix vike-react --changelog-dir packages/vike-react/ patch",
|
18
|
+
"release:commit": "release-me --git-prefix vike-react --changelog-dir packages/vike-react/ commit"
|
18
19
|
},
|
19
20
|
"peerDependencies": {
|
20
21
|
"react": "18.x.x",
|
21
22
|
"react-dom": "18.x.x",
|
22
|
-
"vike": "^0.4.
|
23
|
+
"vike": "^0.4.149",
|
23
24
|
"vite": "^4.3.8"
|
24
25
|
},
|
25
26
|
"devDependencies": {
|
26
|
-
"@brillout/release-me": "^0.1.
|
27
|
+
"@brillout/release-me": "^0.1.12",
|
27
28
|
"@types/node": "^18.17.18",
|
28
29
|
"@types/react": "^18.2.22",
|
29
30
|
"@types/react-dom": "^18.2.7",
|
30
31
|
"react": "^18.2.0",
|
31
32
|
"react-dom": "^18.2.0",
|
32
33
|
"typescript": "^5.2.2",
|
33
|
-
"vike": "^0.4.
|
34
|
+
"vike": "^0.4.149"
|
34
35
|
},
|
35
36
|
"dependencies": {
|
36
37
|
"react-streaming": "^0.3.16"
|