diff --git a/packages/nextjs-mf/CHANGELOG.md b/packages/nextjs-mf/CHANGELOG.md index 0dcef3c5879..f863460fa53 100644 --- a/packages/nextjs-mf/CHANGELOG.md +++ b/packages/nextjs-mf/CHANGELOG.md @@ -1,5 +1,11 @@ # @module-federation/nextjs-mf +## 8.8.0 + +### Minor Changes + +- 5ad75fd: Enabled JSON manifest remote protocol for NextJS plugin + ## 8.7.10 ### Patch Changes diff --git a/packages/nextjs-mf/package.json b/packages/nextjs-mf/package.json index a23b2408b68..8aa30936906 100644 --- a/packages/nextjs-mf/package.json +++ b/packages/nextjs-mf/package.json @@ -1,6 +1,6 @@ { "name": "@module-federation/nextjs-mf", - "version": "8.7.10", + "version": "8.8.0", "license": "MIT", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", diff --git a/packages/nextjs-mf/src/plugins/container/runtimePlugin.ts b/packages/nextjs-mf/src/plugins/container/runtimePlugin.ts index ee9c43c3331..049133e6f13 100644 --- a/packages/nextjs-mf/src/plugins/container/runtimePlugin.ts +++ b/packages/nextjs-mf/src/plugins/container/runtimePlugin.ts @@ -1,4 +1,8 @@ import { FederationRuntimePlugin } from '@module-federation/runtime/types'; +import { + ModuleInfo, + ConsumerModuleInfoWithPublicPath, +} from '@module-federation/sdk'; export default function (): FederationRuntimePlugin { return { @@ -182,7 +186,39 @@ export default function (): FederationRuntimePlugin { return args; }, + loadRemoteSnapshot(args) { + const { from, remoteSnapshot, manifestUrl, manifestJson, options } = args; + // ensure snapshot is loaded from manifest + if ( + from !== 'manifest' || + !manifestUrl || + !manifestJson || + !('publicPath' in remoteSnapshot) + ) { + return args; + } + + // re-assign publicPath based on remoteEntry location + if (options.inBrowser) { + remoteSnapshot.publicPath = remoteSnapshot.publicPath.substring( + 0, + remoteSnapshot.publicPath.lastIndexOf('/_next/') + 7, + ); + } else { + const serverPublicPath = manifestUrl.substring( + 0, + manifestUrl.indexOf('mf-manifest.json'), + ); + + remoteSnapshot.publicPath = serverPublicPath; + if ('publicPath' in manifestJson.metaData) { + manifestJson.metaData.publicPath = serverPublicPath; + } + } + + return args; + }, resolveShare: function (args: any) { if ( args.pkgName !== 'react' &&