Skip to content

Commit 0386948

Browse files
committed
chore: example
1 parent 23daadd commit 0386948

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function BrowserDep() {
2+
return <>{String(!!window)}</>
3+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use client'
2+
3+
import * as React from 'react'
4+
5+
const BrowserDep = (
6+
import.meta.env.SSR ? undefined : React.lazy(() => import('./browser-dep'))
7+
)!
8+
9+
export function TestBrowserOnly() {
10+
return (
11+
<div>
12+
test-browser-only:{' '}
13+
<BrowserOnly fallback={<>loading...</>}>
14+
<BrowserDep />
15+
</BrowserOnly>
16+
</div>
17+
)
18+
}
19+
20+
function BrowserOnly(props: React.SuspenseProps) {
21+
const hydrated = useHydrated()
22+
if (!hydrated) {
23+
return props.fallback
24+
}
25+
return <React.Suspense {...props} />
26+
}
27+
28+
const noopStore = () => () => {}
29+
30+
const useHydrated = () =>
31+
React.useSyncExternalStore(
32+
noopStore,
33+
() => true,
34+
() => false,
35+
)
36+
37+
/*
38+
If we were to implement this whole logic via `browserOnly` helper with transform:
39+
40+
[input]
41+
42+
const SomeDep = browserOnly(() => import('./some-dep'))
43+
44+
[output]
45+
46+
const __TmpLazy = import.meta.env.SSR ? undefined : React.lazy(() => import('./some-dep'}));
47+
48+
const SomeDep = ({ browserOnlyFallback, ...props }) => {
49+
const hydrated = useHydrated()
50+
if (!hydrated) {
51+
return browserOnlyFallback
52+
}
53+
return (
54+
<React.Suspense fallback={browserOnlyFallback}>
55+
<__TmpLazy {...props} />
56+
</React.Suspense>
57+
)
58+
}
59+
*/
60+
61+
// declare function browserOnly<T>(fn: () => Promise<{ default: React.ComponentType<T> }>): React.ComponentType<T & { browserOnlyFallback?: React.ReactNode }>

packages/plugin-rsc/examples/basic/src/routes/root.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { TestTailwindServer } from './tailwind/server'
2828
import { TestTemporaryReference } from './temporary-reference/client'
2929
import { TestUseCache } from './use-cache/server'
3030
import { TestHydrationMismatch } from './hydration-mismatch/server'
31+
import { TestBrowserOnly } from './browser-only/client'
3132

3233
export function Root(props: { url: URL }) {
3334
return (
@@ -67,6 +68,7 @@ export function Root(props: { url: URL }) {
6768
<TestServerInClient />
6869
<TestActionStateServer />
6970
<TestModuleInvalidationServer />
71+
<TestBrowserOnly />
7072
<TestUseCache />
7173
</body>
7274
</html>

0 commit comments

Comments
 (0)