From f1fe6f96621e01c80a14ce782cb42ad2884dd7b9 Mon Sep 17 00:00:00 2001 From: zmzlois Date: Mon, 4 Nov 2024 02:16:50 +0000 Subject: [PATCH 1/3] got it --- src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.ts b/src/index.ts index d9a657b..925f659 100644 --- a/src/index.ts +++ b/src/index.ts @@ -61,6 +61,8 @@ function federation(mfUserOptions: ModuleFederationOptions): Plugin[] { { name: 'module-federation-vite', enforce: 'post', + // @ts-expect-error used to expose plugin options + _options: options, config(config, { command: _command }: { command: string }) { // TODO: singleton (config.resolve as any).alias.push({ From 9db6fda47df106997bbc22dafd0f04ff59dc2103 Mon Sep 17 00:00:00 2001 From: gioboa Date: Mon, 4 Nov 2024 10:27:58 +0100 Subject: [PATCH 2/3] feat: add GH link --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 925f659..60780a8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -61,7 +61,8 @@ function federation(mfUserOptions: ModuleFederationOptions): Plugin[] { { name: 'module-federation-vite', enforce: 'post', - // @ts-expect-error used to expose plugin options + // @ts-expect-error + // used to expose plugin options: https://github.com/rolldown/rolldown/discussions/2577#discussioncomment-11137593 _options: options, config(config, { command: _command }: { command: string }) { // TODO: singleton From c47e4627107ab7001da52004c9b78ce3c028f533 Mon Sep 17 00:00:00 2001 From: zmzlois Date: Tue, 7 Jan 2025 16:52:55 +0700 Subject: [PATCH 3/3] feat(mf): resolve outdir to __mf_temp --- src/plugins/pluginModuleParseEnd.ts | 3 +- .../pluginProxySharedModule_preBuild.ts | 9 ++++- src/utils/aliasToArrayPlugin.ts | 2 + src/utils/localSharedImportMap_temp.ts | 8 +++- src/utils/normalizeModuleFederationOptions.ts | 37 +++++++++++++++++-- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/plugins/pluginModuleParseEnd.ts b/src/plugins/pluginModuleParseEnd.ts index 6c62471..b138ca1 100644 --- a/src/plugins/pluginModuleParseEnd.ts +++ b/src/plugins/pluginModuleParseEnd.ts @@ -2,7 +2,7 @@ * Dynamic shared modules, such as "react/" and "react-dom/", can only be parsed during the build process; * This plugin allows me to wait until all modules are built, and then expose them together. */ -import { Plugin } from 'vite'; +import { Plugin, UserConfig } from 'vite'; import { VIRTUAL_EXPOSES } from '../virtualModules'; let _resolve: any, @@ -30,6 +30,7 @@ export default function (excludeFn: Function): Plugin[] { enforce: 'pre', name: 'parseStart', apply: 'build', + configResolved(config: UserConfig) {}, load(id) { if (excludeFn(id)) { return; diff --git a/src/plugins/pluginProxySharedModule_preBuild.ts b/src/plugins/pluginProxySharedModule_preBuild.ts index bfac5b3..96065d2 100644 --- a/src/plugins/pluginProxySharedModule_preBuild.ts +++ b/src/plugins/pluginProxySharedModule_preBuild.ts @@ -1,5 +1,8 @@ import { Plugin, UserConfig } from 'vite'; -import { NormalizedShared } from '../utils/normalizeModuleFederationOptions'; +import { + NormalizedShared, + normalizeViteConfigOption, +} from '../utils/normalizeModuleFederationOptions'; import { PromiseStore } from '../utils/PromiseStore'; import VirtualModule from '../utils/VirtualModule'; import { @@ -24,6 +27,10 @@ export function proxySharedModule(options: { { name: 'generateLocalSharedImportMap', enforce: 'post', + config(config: UserConfig) { + _config = config; + normalizeViteConfigOption(config); + }, load(id) { if (id.includes(getLocalSharedImportMapPath())) { return parsePromise.then((_) => generateLocalSharedImportMap()); diff --git a/src/utils/aliasToArrayPlugin.ts b/src/utils/aliasToArrayPlugin.ts index 1b0f311..d81083b 100644 --- a/src/utils/aliasToArrayPlugin.ts +++ b/src/utils/aliasToArrayPlugin.ts @@ -1,4 +1,5 @@ import { UserConfig } from 'vite'; +import { normalizeViteConfigOption } from './normalizeModuleFederationOptions'; export interface Command { // define command properties here @@ -7,6 +8,7 @@ export interface Command { export default { name: 'alias-transform-plugin', config: (config: UserConfig, { command }: { command: Command }) => { + normalizeViteConfigOption(config); if (!config.resolve) config.resolve = {}; if (!config.resolve.alias) config.resolve.alias = []; const { alias } = config.resolve; diff --git a/src/utils/localSharedImportMap_temp.ts b/src/utils/localSharedImportMap_temp.ts index 5f7ae4d..2af5d17 100644 --- a/src/utils/localSharedImportMap_temp.ts +++ b/src/utils/localSharedImportMap_temp.ts @@ -3,12 +3,16 @@ */ import { mkdirSync, writeFileSync } from 'fs'; import path from 'pathe'; -import { getNormalizeModuleFederationOptions } from './normalizeModuleFederationOptions'; +import { + getNormalizeModuleFederationOptions, + getNormalizeViteOptions, +} from './normalizeModuleFederationOptions'; import { packageNameEncode } from './packageNameUtils'; export function getLocalSharedImportMapPath_temp() { const { name } = getNormalizeModuleFederationOptions(); - return path.resolve('.__mf__temp', packageNameEncode(name), 'localSharedImportMap'); + const { outDir } = getNormalizeViteOptions(); + return path.resolve('.__mf__temp', packageNameEncode(name) + outDir, 'localSharedImportMap'); } export function writeLocalSharedImportMap_temp(content: string) { const localSharedImportMapId = getLocalSharedImportMapPath_temp(); diff --git a/src/utils/normalizeModuleFederationOptions.ts b/src/utils/normalizeModuleFederationOptions.ts index 5e961cf..07c0371 100644 --- a/src/utils/normalizeModuleFederationOptions.ts +++ b/src/utils/normalizeModuleFederationOptions.ts @@ -22,6 +22,7 @@ export type RemoteEntryType = | string; import * as path from 'pathe'; +import { UserConfig } from 'vite'; import { warn } from './logUtils'; interface ExposesItem { @@ -252,6 +253,12 @@ export type ModuleFederationOptions = { shareStrategy?: ShareStrategy; }; +export interface NormalizeViteOptions { + root?: string; + outDir?: string; + publicDir?: string | false | undefined; +} + export interface NormalizedModuleFederationOptions { exposes: Record; filename: string; @@ -271,6 +278,14 @@ export interface NormalizedModuleFederationOptions { getPublicPath?: string; } +/** A combination of user's configuration in vite config and module federation config options */ +export interface Config { + /** Module Federation configuration */ + mfConfig: NormalizedModuleFederationOptions; + /** User-defined configuration in vite config */ + envConfig: NormalizeViteOptions; +} + interface PluginDevOptions { disableLiveReload?: boolean; disableHotTypesReload?: boolean; @@ -305,10 +320,10 @@ interface DtsHostOptions { consumeAPITypes?: boolean; } -let config: NormalizedModuleFederationOptions; +let config: Config; export function getNormalizeModuleFederationOptions() { - return config; + return config.mfConfig; } export function getNormalizeShareItem(key: string) { @@ -327,7 +342,7 @@ export function normalizeModuleFederationOptions( `We are ignoring the getPublicPath options because they are natively supported by Vite\nwith the "experimental.renderBuiltUrl" configuration https://vitejs.dev/guide/build#advanced-base-options` ); } - return (config = { + return (config.mfConfig = { exposes: normalizeExposes(options.exposes), filename: options.filename || 'remoteEntry-[hash]', library: normalizeLibrary(options.library), @@ -346,3 +361,19 @@ export function normalizeModuleFederationOptions( shareStrategy: options.shareStrategy || 'version-first', }); } + +// TODO: encapsulate them (both mf config and user build config) into an object that's accessible within compiler scop +export function normalizeViteConfigOption(_config: UserConfig): Config['envConfig'] | undefined { + if (!_config.build?.outDir) { + return; + } + return (config.envConfig = { + root: _config.root, + outDir: _config.build.outDir, + publicDir: _config.publicDir, + }); +} + +export function getNormalizeViteOptions() { + return config.envConfig; +}