File tree Expand file tree Collapse file tree 3 files changed +66
-0
lines changed
packages/plugin-rsc/examples/basic/src/routes Expand file tree Collapse file tree 3 files changed +66
-0
lines changed Original file line number Diff line number Diff line change 1+ export default function BrowserDep ( ) {
2+ return < > { String ( ! ! window ) } </ >
3+ }
Original file line number Diff line number Diff line change 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 }>
Original file line number Diff line number Diff line change @@ -28,6 +28,7 @@ import { TestTailwindServer } from './tailwind/server'
2828import { TestTemporaryReference } from './temporary-reference/client'
2929import { TestUseCache } from './use-cache/server'
3030import { TestHydrationMismatch } from './hydration-mismatch/server'
31+ import { TestBrowserOnly } from './browser-only/client'
3132
3233export 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 >
You can’t perform that action at this time.
0 commit comments