Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
1. src/virtualModules/virtualRuntimeInitStatus.ts
  - Added command: string parameter to writeRuntimeInitStatus()
  - Build mode: Generates ESM-only exports (export const)
  - Dev mode: Generates CJS-only exports (module.exports)
  - No more mixed module systems

  2. src/virtualModules/index.ts (line 36)

  - Updated initVirtualModules(command: string = 'serve') to accept command parameter
  - Passes command to writeRuntimeInitStatus(command)

  3. src/index.ts (lines 29-47)

  - Declared let _command: string = 'serve' at function level
  - Added config hook to capture command early
  - Passes _command to initVirtualModules(_command) in configResolved
  • Loading branch information
DallasCarraher committed Jan 22, 2026
commit b358d4326df00b5cf527efbe8f83440846ac4a7b
6 changes: 5 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,21 @@ function federation(mfUserOptions: ModuleFederationOptions): Plugin[] {
const options = normalizeModuleFederationOptions(mfUserOptions);
const { name, remotes, shared, filename, hostInitInjectLocation } = options;
if (!name) throw new Error('name is required');
let _command: string = 'serve';

return [
{
name: 'vite:module-federation-config',
enforce: 'pre',
config(config, { command }) {
_command = command;
},
configResolved(config) {
// Set root path
VirtualModule.setRoot(config.root);
// Ensure virtual package directory exists
VirtualModule.ensureVirtualPackageExists();
initVirtualModules();
initVirtualModules(_command);
},
},
aliasToArrayPlugin,
Expand Down
4 changes: 2 additions & 2 deletions src/virtualModules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ export { generateExposes, VIRTUAL_EXPOSES } from './virtualExposes';

export { virtualRuntimeInitStatus } from './virtualRuntimeInitStatus';

export function initVirtualModules() {
export function initVirtualModules(command: string = 'serve') {
writeLocalSharedImportMap();
writeHostAutoInit();
writeRuntimeInitStatus();
writeRuntimeInitStatus(command);
}
60 changes: 39 additions & 21 deletions src/virtualModules/virtualRuntimeInitStatus.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,46 @@
import VirtualModule from '../utils/VirtualModule';
export const virtualRuntimeInitStatus = new VirtualModule('runtimeInit');
export function writeRuntimeInitStatus() {
export function writeRuntimeInitStatus(command: string) {
// Use globalThis singleton to ensure only one initPromise exists
const globalKey = `__mf_init__${virtualRuntimeInitStatus.getImportId()}__`;
// This module is imported by both dev and build modes
// We use a dual-export pattern that works with both CJS require() and ESM import
virtualRuntimeInitStatus.writeSync(`
const globalKey = ${JSON.stringify(globalKey)}
if (!globalThis[globalKey]) {
let initResolve, initReject
const initPromise = new Promise((re, rj) => {
initResolve = re
initReject = rj
})
globalThis[globalKey] = {
initPromise,
initResolve,
initReject

if (command === 'build') {
// Build mode: Use ESM syntax to fix Vite 7/Rolldown compatibility
virtualRuntimeInitStatus.writeSync(`
const globalKey = ${JSON.stringify(globalKey)}
if (!globalThis[globalKey]) {
let initResolve, initReject
const initPromise = new Promise((re, rj) => {
initResolve = re
initReject = rj
})
globalThis[globalKey] = {
initPromise,
initResolve,
initReject
}
}
}
// Dual exports: CJS for dev mode (require), ESM for build mode (import)
module.exports = globalThis[globalKey]
export const initPromise = globalThis[globalKey].initPromise
export const initResolve = globalThis[globalKey].initResolve
export const initReject = globalThis[globalKey].initReject
export const initPromise = globalThis[globalKey].initPromise
export const initResolve = globalThis[globalKey].initResolve
export const initReject = globalThis[globalKey].initReject
`);
} else {
// Dev mode: Use CJS syntax for compatibility
virtualRuntimeInitStatus.writeSync(`
const globalKey = ${JSON.stringify(globalKey)}
if (!globalThis[globalKey]) {
let initResolve, initReject
const initPromise = new Promise((re, rj) => {
initResolve = re
initReject = rj
})
globalThis[globalKey] = {
initPromise,
initResolve,
initReject
}
}
module.exports = globalThis[globalKey]
`);
}
}
Loading