@@ -38,6 +38,7 @@ import {
38
38
stringToPrecomputedChunk ,
39
39
clonePrecomputedChunk ,
40
40
} from 'react-server/src/ReactServerStreamConfig' ;
41
+ import { resolveResources , pingRequest } from 'react-server/src/ReactFizzServer' ;
41
42
42
43
import isAttributeNameSafe from '../shared/isAttributeNameSafe' ;
43
44
import isUnitlessNumber from '../shared/isUnitlessNumber' ;
@@ -79,30 +80,15 @@ import {
79
80
import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals' ;
80
81
const ReactDOMCurrentDispatcher = ReactDOMSharedInternals . Dispatcher ;
81
82
82
- const ReactDOMServerDispatcher = enableFloat
83
- ? {
84
- prefetchDNS,
85
- preconnect,
86
- preload,
87
- preinit,
88
- }
89
- : { } ;
90
-
91
- let currentResources : null | Resources = null ;
92
- const currentResourcesStack = [ ] ;
93
-
94
- export function prepareToRender ( resources : Resources ) : mixed {
95
- currentResourcesStack . push ( currentResources ) ;
96
- currentResources = resources ;
83
+ const ReactDOMServerDispatcher = {
84
+ prefetchDNS,
85
+ preconnect,
86
+ preload,
87
+ preinit,
88
+ } ;
97
89
98
- const previousHostDispatcher = ReactDOMCurrentDispatcher . current ;
90
+ export function prepareHostDispatcher ( ) {
99
91
ReactDOMCurrentDispatcher . current = ReactDOMServerDispatcher ;
100
- return previousHostDispatcher ;
101
- }
102
-
103
- export function cleanupAfterRender ( previousDispatcher : mixed ) {
104
- currentResources = currentResourcesStack . pop ( ) ;
105
- ReactDOMCurrentDispatcher . current = previousDispatcher ;
106
92
}
107
93
108
94
// Used to distinguish these contexts from ones used in other renderers.
@@ -4804,16 +4790,18 @@ function getResourceKey(as: string, href: string): string {
4804
4790
}
4805
4791
4806
4792
export function prefetchDNS ( href : string , options ?: mixed ) {
4807
- if ( ! currentResources ) {
4808
- // While we expect that preconnect calls are primarily going to be observed
4809
- // during render because effects and events don't run on the server it is
4810
- // still possible that these get called in module scope. This is valid on
4811
- // the client since there is still a document to interact with but on the
4812
- // server we need a request to associate the call to. Because of this we
4813
- // simply return and do not warn.
4793
+ if ( ! enableFloat ) {
4794
+ return ;
4795
+ }
4796
+ const resources = resolveResources ( ) ;
4797
+ if ( ! resources ) {
4798
+ // In async contexts we can sometimes resolve resources from AsyncLocalStorage. If we can't we can also
4799
+ // possibly get them from the stack if we are not in an async context. Since we were not able to resolve
4800
+ // the resources for this call in either case we opt to do nothing. We can consider making this a warning
4801
+ // but there may be times where calling a function outside of render is intentional (i.e. to warm up data
4802
+ // fetching) and we don't want to warn in those cases.
4814
4803
return ;
4815
4804
}
4816
- const resources = currentResources ;
4817
4805
if ( __DEV__ ) {
4818
4806
if ( typeof href !== 'string' || ! href ) {
4819
4807
console . error (
@@ -4858,17 +4846,19 @@ export function prefetchDNS(href: string, options?: mixed) {
4858
4846
}
4859
4847
}
4860
4848
4861
- export function preconnect ( href : string , options ?: { crossOrigin ?: string } ) {
4862
- if ( ! currentResources ) {
4863
- // While we expect that preconnect calls are primarily going to be observed
4864
- // during render because effects and events don't run on the server it is
4865
- // still possible that these get called in module scope. This is valid on
4866
- // the client since there is still a document to interact with but on the
4867
- // server we need a request to associate the call to. Because of this we
4868
- // simply return and do not warn.
4849
+ export function preconnect ( href : string , options ?: ?{ crossOrigin ?: string } ) {
4850
+ if ( ! enableFloat ) {
4851
+ return ;
4852
+ }
4853
+ const resources = resolveResources ( ) ;
4854
+ if ( ! resources ) {
4855
+ // In async contexts we can sometimes resolve resources from AsyncLocalStorage. If we can't we can also
4856
+ // possibly get them from the stack if we are not in an async context. Since we were not able to resolve
4857
+ // the resources for this call in either case we opt to do nothing. We can consider making this a warning
4858
+ // but there may be times where calling a function outside of render is intentional (i.e. to warm up data
4859
+ // fetching) and we don't want to warn in those cases.
4869
4860
return;
4870
4861
}
4871
- const resources = currentResources ;
4872
4862
if ( __DEV__ ) {
4873
4863
if ( typeof href !== 'string' || ! href ) {
4874
4864
console . error (
@@ -4917,24 +4907,25 @@ export function preconnect(href: string, options?: {crossOrigin?: string}) {
4917
4907
}
4918
4908
}
4919
4909
4920
- type PreloadAs = 'style' | 'font' | 'script' ;
4921
4910
type PreloadOptions = {
4922
- as : PreloadAs ,
4911
+ as : string ,
4923
4912
crossOrigin ?: string ,
4924
4913
integrity ?: string ,
4925
4914
type ?: string ,
4926
4915
} ;
4927
4916
export function preload ( href : string , options : PreloadOptions ) {
4928
- if ( ! currentResources ) {
4929
- // While we expect that preload calls are primarily going to be observed
4930
- // during render because effects and events don't run on the server it is
4931
- // still possible that these get called in module scope. This is valid on
4932
- // the client since there is still a document to interact with but on the
4933
- // server we need a request to associate the call to. Because of this we
4934
- // simply return and do not warn.
4917
+ if ( ! enableFloat ) {
4918
+ return ;
4919
+ }
4920
+ const resources = resolveResources ( ) ;
4921
+ if ( ! resources ) {
4922
+ // In async contexts we can sometimes resolve resources from AsyncLocalStorage. If we can't we can also
4923
+ // possibly get them from the stack if we are not in an async context. Since we were not able to resolve
4924
+ // the resources for this call in either case we opt to do nothing. We can consider making this a warning
4925
+ // but there may be times where calling a function outside of render is intentional (i.e. to warm up data
4926
+ // fetching) and we don't want to warn in those cases.
4935
4927
return ;
4936
4928
}
4937
- const resources = currentResources ;
4938
4929
if ( __DEV__ ) {
4939
4930
if ( typeof href !== 'string' || ! href ) {
4940
4931
console . error (
@@ -5055,27 +5046,30 @@ export function preload(href: string, options: PreloadOptions) {
5055
5046
resources. explicitOtherPreloads . add ( resource ) ;
5056
5047
}
5057
5048
}
5049
+ pingRequest ( ) ;
5058
5050
}
5059
5051
}
5060
5052
5061
- type PreinitAs = 'style' | 'script' ;
5062
5053
type PreinitOptions = {
5063
- as : PreinitAs ,
5054
+ as : string ,
5064
5055
precedence ?: string ,
5065
5056
crossOrigin ?: string ,
5066
5057
integrity ?: string ,
5067
5058
} ;
5068
5059
export function preinit ( href : string , options : PreinitOptions ) : void {
5069
- if ( ! currentResources ) {
5070
- // While we expect that preinit calls are primarily going to be observed
5071
- // during render because effects and events don't run on the server it is
5072
- // still possible that these get called in module scope. This is valid on
5073
- // the client since there is still a document to interact with but on the
5074
- // server we need a request to associate the call to. Because of this we
5075
- // simply return and do not warn.
5060
+ if ( ! enableFloat ) {
5061
+ return ;
5062
+ }
5063
+ const resources = resolveResources ( ) ;
5064
+ if ( ! resources ) {
5065
+ // In async contexts we can sometimes resolve resources from AsyncLocalStorage. If we can't we can also
5066
+ // possibly get them from the stack if we are not in an async context. Since we were not able to resolve
5067
+ // the resources for this call in either case we opt to do nothing. We can consider making this a warning
5068
+ // but there may be times where calling a function outside of render is intentional (i.e. to warm up data
5069
+ // fetching) and we don't want to warn in those cases.
5076
5070
return;
5077
5071
}
5078
- preinitImpl ( currentResources , href, options) ;
5072
+ preinitImpl ( resources , href , options ) ;
5079
5073
}
5080
5074
5081
5075
// On the server, preinit may be called outside of render when sending an
@@ -5297,7 +5291,7 @@ function preinitImpl(
5297
5291
5298
5292
function preloadPropsFromPreloadOptions (
5299
5293
href : string ,
5300
- as : PreloadAs ,
5294
+ as : string ,
5301
5295
options : PreloadOptions ,
5302
5296
) : PreloadProps {
5303
5297
return {
0 commit comments