fix(nextjs-mf): await async factories in server onLoad hook - #4973
Closed
shashank-u03 wants to merge 1 commit into
Closed
fix(nextjs-mf): await async factories in server onLoad hook#4973shashank-u03 wants to merge 1 commit into
shashank-u03 wants to merge 1 commit into
Conversation
🦋 Changeset detectedLatest commit: d3f72c9 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
shashank-u03
force-pushed
the
fix/nextjs-mf-onload-async-factory
branch
from
August 8, 2026 17:33
e9a20c2 to
a3d351e
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e9a20c22ce
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
MF v2 remote containers expose async module factories. When webpack loads remotes with loadFactory:false during the build/SSR path, nextjs-mf onLoad synchronously invoked the factory and Proxy-wrapped the resulting Promise, which breaks Promise.prototype.then brand checks and routes to errorLoadRemote. Await Promise results before proxy-wrapping on the server. Related: module-federation#2218 Co-authored-by: Cursor <cursoragent@cursor.com> test(nextjs-mf): cover client onLoad path and async factory rejection Add regression tests for browser-path passthrough and server-side rejection propagation after making onLoad async-safe. Co-authored-by: Cursor <cursoragent@cursor.com>
shashank-u03
force-pushed
the
fix/nextjs-mf-onload-async-factory
branch
from
August 8, 2026 17:43
075f1a1 to
d3f72c9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Remote containers in
@module-federation/runtimeexpose async module factories (RemoteEntryExports.getreturns() => Promise<Module>).During the webpack build/SSR path,
runtime-coreloads remotes withloadFactory: falseandfrom: 'build'(seepackages/webpack-bundler-runtime/src/remotes.ts), passing the unexecuted factory tonextjs-mf'sonLoadhook asexposeModuleFactory.On the server,
onLoadsynchronously invoked that factory and Proxy-wrapped the return value for chunk-usage tracking. When the factory is async, the sync invocation returns a rawPromise. Proxy-wrapping thatPromisecauses webpack's async module runtime to fail when calling.then():TypeError: Method Promise.prototype.then called on incompatible receiver [object Promise]
runtime-corecatches this inloadRemoteand routes it toerrorLoadRemotewithlifecycle: 'onLoad'andfrom: 'build'.Solution: Make the server-side
onLoadhook async-safe by awaitingPromiseresults frommoduleOrFactory()before applying the existing Proxy wrapper.runtime-corealready handles async factories inmodule.wraperFactory; this alignsnextjs-mfonLoadwith that behavior.Added regression tests in
runtimePlugin.test.tsfor the asyncexposeModuleFactoryserver path.Related Issue
#2218
Types of changes
Checklist