-
-
Notifications
You must be signed in to change notification settings - Fork 631
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Hydrate components immediately after downloading chunks #1656
base: abanoubghadban/pro362-add-support-for-RSC
Are you sure you want to change the base?
Conversation
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
7d6577c
to
de85fb4
Compare
force_load: false, | ||
auto_load_server_components: true, | ||
rsc_rendering_url: DEFAULT_RSC_RENDERING_URL |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can easily update Configuration
so adding new options at least has to change only 2 places, not 4 :) Do you expect to need more changes like this soon?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think I will need to add more configs like this soon. But it's useful if you want to implement a helper function.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It wouldn't be a helper function, just initialize to default values directly in the constructor and remove constructor parameters since we never end up using them (at least in RORP, need to double-check ROR before doing that).
I can wait until your PRs are merged to avoid conflicts anyway.
@@ -401,6 +403,17 @@ def run_stream_inside_fiber | |||
rendering_fiber.resume | |||
end | |||
|
|||
def registered_stores | |||
(@registered_stores || []) + (@registered_stores_defer_render || []) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we initialize the variables with []
and avoid needing ||
here?
add_component_to_pending_hydration_code = "window.#{ADD_COMPONENT_TO_PENDING_HYDRATION_FUNCTION}('#{dom_id}');" | ||
hydrate_script = dom_id.present? ? content_tag(:script, add_component_to_pending_hydration_code.html_safe) : "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's a bit clearer like this:
add_component_to_pending_hydration_code = "window.#{ADD_COMPONENT_TO_PENDING_HYDRATION_FUNCTION}('#{dom_id}');" | |
hydrate_script = dom_id.present? ? content_tag(:script, add_component_to_pending_hydration_code.html_safe) : "" | |
hydrate_script = if dom_id.present? | |
add_component_to_pending_hydration_code = "window.#{ADD_COMPONENT_TO_PENDING_HYDRATION_FUNCTION}('#{dom_id}');" | |
content_tag(:script, add_component_to_pending_hydration_code.html_safe) | |
else | |
"" |
import isRenderFunction from './isRenderFunction'; | ||
|
||
const registeredComponents = new Map<string, RegisteredComponent>(); | ||
const registrationCallbacks = new Map<string, Array<(component: RegisteredComponent) => void>>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better give a name to the callback type (here if it isn't used anywhere else, in ./types/index.ts
if it is).
@@ -1,9 +1,33 @@ | |||
import type { RegisteredComponent, ReactComponentOrRenderFunction, RenderFunction } from './types/index'; | |||
import React from 'react'; | |||
import type { RegisteredComponent, ReactComponentOrRenderFunction, RenderFunction, ReactComponent } from './types/index'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While changing this anyway, can simplify the import to ./types
.
}); | ||
}, | ||
|
||
registerServerComponent(...componentNames: string[]): void { | ||
// eslint-disable-next-line global-require, @typescript-eslint/no-var-requires | ||
const RSCClientRoot = require('./RSCClientRoot').default; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For better types:
const RSCClientRoot = require('./RSCClientRoot').default; | |
const RSCClientRoot = (require('./RSCClientRoot') as typeof(import('./RSCClientRoot'))).default; |
import RSDWClient from 'react-server-dom-webpack/client'; | ||
|
||
if (!('use' in React)) { | ||
throw new Error('React.use is not defined. Please ensure you are using React 18.3.0-canary-670811593-20240322 or later to use server components.'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
18.3.0 would count as later but doesn't support RSC, so the message can be improved.
} | ||
|
||
// It's not the exact type, but it's close enough for now | ||
type Use = <T>(promise: Promise<T>) => T; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we update @types/react
to 19 even if we don't update React itself yet? If not, leave a comment to remove it once we update to 19.
@@ -29,7 +28,7 @@ const stringToStream = (str: string) => { | |||
const getBundleConfig = () => { | |||
const bundleConfig = JSON.parse(fs.readFileSync('./public/webpack/development/react-client-manifest.json', 'utf8')); | |||
// remove file:// from keys | |||
const newBundleConfig: { [key: string]: any } = {}; | |||
const newBundleConfig: { [key: string]: unknown } = {}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change can go into the previous PR already, no?
callbacks.forEach(callback => { | ||
setTimeout(() => callback(store), 0); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This ends up duplicated several times with different callbacks
, extract it?
Summary
Remove this paragraph and provide a general description of the code changes in your pull
request... were there any bugs you had fixed? If so, mention them. If
these bugs have open GitHub issues, be sure to tag them here as well,
to keep the conversation linked together.
Pull Request checklist
Remove this line after checking all the items here. If the item is not applicable to the PR, both check it out and wrap it by
~
.Add the CHANGELOG entry at the top of the file.
Other Information
Remove this paragraph and mention any other important and relevant information such as benchmarks.
This change is