[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata - #27839

Merged
alunyov merged 6 commits into
react:mainfrom
alunyov:main
Dec 19, 2023
Merged

[RSC @ Meta] Simplify implementation of isClientReference, getClientReferenceKey, resolveClientReferenceMetadata#27839
alunyov merged 6 commits into
react:mainfrom
alunyov:main

Conversation

@alunyov

@alunyovalunyov commented Dec 15, 2023

Copy link
Copy Markdown
Contributor

For clientReferences we can just check the instance of the clientReference.
The implementation of isClientReference is provided via configuration. The class for ClientReference has to implement an interface that has `getModuleId() method.

@facebook-github-botfacebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Dec 15, 2023
@react-sizebot

react-sizebot commented Dec 15, 2023

Copy link
Copy Markdown

Comparing: 493610f...5f125f9

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.min.js=175.90 kB175.90 kB=54.76 kB54.76 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js=177.97 kB177.97 kB=55.39 kB55.39 kB
facebook-www/ReactDOM-prod.classic.js=570.21 kB570.21 kB=100.35 kB100.35 kB
facebook-www/ReactDOM-prod.modern.js=554.06 kB554.06 kB=97.43 kB97.43 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
facebook-www/ReactFlightDOMServer-dev.modern.js=80.65 kB80.38 kB=17.14 kB17.09 kB
facebook-www/ReactFlightDOMServer-prod.modern.js=38.58 kB38.23 kB=8.67 kB8.62 kB
test_utils/ReactAllWarnings.jsDeleted67.41 kB0.00 kBDeleted16.49 kB0.00 kB

Generated by 🚫 dangerJS against 5f125f9

@sebmarkbage

Copy link
Copy Markdown
Contributor

The register functions are really meant to move to be more unified between multiple implementations. It might be more obvious when you deal with Server References that has more of that implemented already.

Originally this was more up to each config but we realized we started add more and more features to the references themselves. For example we're trying to unify the Proxy implementation so that they can provide the same error messages when you try to access something you shouldn't and that you can create the same indirections.

Another feature is that on Server References, we extend .bind() so that you can create bound versions of the reference and pass around. E.g. curry a Server Action. So we added that to all the register methods. Arguably the .bind() feature should exist on client references too. We couldn't do that consistently if we didn't have a register Hook where React can do this.

But currently the implementation is a bit ambivalent about how strongly React needs to control the reference.

@sebmarkbage

Copy link
Copy Markdown
Contributor

That's not to say you can't remove the registeredClientReferences map but it would be good to have the register functions around for the secondary purpose (they can be noops for now).

@alunyov

Copy link
Copy Markdown
ContributorAuthor

Thanks @sebmarkbage! That makes sense, I'll keep the register functions (as noop for now) to keep the public API consistent.

Comment on lines 12 to 15
// eslint-disable-next-line no-unused-vars
export type ServerReference<T> = string;

// eslint-disable-next-line no-unused-vars

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the // eslint-disable-next-line no-unused-vars actually needed?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just to keep the same interface across different configurations, these types are using generic T, which is unused in this specific case.

@alunyov
alunyov merged commit cb24396 into react:mainDec 19, 2023
github-actionsBot pushed a commit that referenced this pull request Dec 19, 2023
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for [cb24396](cb24396)
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
…eferenceKey, resolveClientReferenceMetadata (react#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
…eferenceKey, resolveClientReferenceMetadata (#27839)
For clientReferences we can just check the instance of the
`clientReference`.
The implementation of `isClientReference` is provided via configuration.
The class for ClientReference has to implement an interface that has
`getModuleId() method.
DiffTrain build for commit cb24396.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@alunyov@react-sizebot@sebmarkbage@voideanvalue@facebook-github-bot