diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08452a3..9ae369b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1509,55 +1509,46 @@ packages: resolution: {integrity: sha512-r+SI2t8srMPYZeoa1w0o/AfoVt9akI1ihgazGYPQGRilVAkuzMGiTtexNZkrPkQsyFrvqq/ni8f3zOnHw4hUbA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.19.2': resolution: {integrity: sha512-+tYiL4QVjtI3KliKBGtUU7yhw0GMcJJuB9mLTCEauHEsqfk49gtUBXGtGP3h1LW8MbaTY6rSFIQV1XOBps1gBA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.19.2': resolution: {integrity: sha512-OR5DcvZiYN75mXDNQQxlQPTv4D+uNCUsmSCSY2FolLf9W5I4DSoJyg7z9Ea3TjKfhPSGgMJiey1aWvlWuBzMtg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.19.2': resolution: {integrity: sha512-Hw3jSfWdUSauEYFBSFIte6I8m6jOj+3vifLg8EU3lreWulAUpch4JBjDMtlKosrBzkr0kwKgL9iCfjA8L3geoA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.19.2': resolution: {integrity: sha512-rhjvoPBhBwVnJRq/+hi2Q3EMiVF538/o9dBuj9TVLclo9DuONqt5xfWSaE6MYiFKpo/lFPJ/iSI72rYWw5Hc7w==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.19.2': resolution: {integrity: sha512-EAz6vjPwHHs2qOCnpQkw4xs14XJq84I81sDRGPEjKPFVPBw7fwvtwhVjcZR6SLydCv8zNK8YGFblKWd/vRmP8g==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.19.2': resolution: {integrity: sha512-IJSUX1xb8k/zN9j2I7B5Re6B0NNJDJ1+soezjNojhT8DEVeDNptq2jgycCOpRhyGj0+xBn7Cq+PK7Q+nd2hxLA==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.19.2': resolution: {integrity: sha512-OgaToJ8jSxTpgGkZSkwKE+JQGihdcaqnyHEFOSAU45utQ+yLruE1dkonB2SDI8t375wOKgNn8pQvaWY9kPzxDQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.19.2': resolution: {integrity: sha512-5V3mPpWkB066XZZBgSd1lwozBk7tmOkKtquyCJ6T4LN3mzKENXyBwWNQn8d0Ci81hvlBw5RoFgleVpL6aScLYg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.19.2': resolution: {integrity: sha512-ayVstadfLeeXI9zUPiKRVT8qF55hm7hKa+0N1V6Vj+OTNFfKSoUxyZvzVvgtBxqSb5URQ8sK6fhwxr9/MLmxdA==} @@ -1601,25 +1592,21 @@ packages: resolution: {integrity: sha512-/24UytJXrK+7CsucDb30GCKYIJ8nG6ceqbJyOtsJv9zeArNLHkxrYGSyjHJIpQfwVN17BPP4RNOi+yIZ3ZgDyA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-musl@0.7.5': resolution: {integrity: sha512-6RcxG42mLM01Pa6UYycACu/Nu9qusghAPUJumb8b8x5TRIDEtklYC5Ck6Rmagm+8E0ucMude2E/D4rMdIFcS3A==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-gnu@0.7.5': resolution: {integrity: sha512-R0Lu4CJN2nWMW7WzPBuCIju80cQPpcaqwKJDj/quwQySpJJZ6c5qGwB8mntqjxIzZDrNH6u0OkpiUTbvWZj8ww==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-musl@0.7.5': resolution: {integrity: sha512-dDgi/ThikMy1m4llxPeEXDCA2I8F8ezFS/eCPLZGU2/J1b4ALwDjuRsMmo+VXSlFCKgIt98V6h1woeg7nu96yg==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-win32-arm64-msvc@0.7.5': resolution: {integrity: sha512-nEF4cUdLfgEK6FrgJSJhUlr2/7LY1tmqBNQCFsCjtDtUkQbJIEo1b8edT94G9tJcQoFE4cD+Re30yBYbQO2Thg==} @@ -1718,84 +1705,72 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-gnu@1.7.10': resolution: {integrity: sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-gnu@1.7.4': resolution: {integrity: sha512-0787jri83jigf26mF8FndWehh7jqMaHwAm/OV6VdToyNo/g+d1AxVpkEizrywZK46el+AObnHUIHIHwZgO21LA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.6.13': resolution: {integrity: sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-arm64-musl@1.7.10': resolution: {integrity: sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-arm64-musl@1.7.4': resolution: {integrity: sha512-A45hGKWAGcjU5Ol0uQUoK0tHerwEKxfprYUZbmPLpD2yrpMZr+dTrwY2n075sixs7RuZEccBkgGNpehEe5BPBQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.6.13': resolution: {integrity: sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.7.10': resolution: {integrity: sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.7.4': resolution: {integrity: sha512-bcO1MpAm39TXqqHuYW4ox4vDvhB7jkguwMwxvmL+cKBGsUHrIoUTfGt9NM9N4D4CvOwULlxqbyt19veUJ7CVPw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.6.13': resolution: {integrity: sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-linux-x64-musl@1.7.10': resolution: {integrity: sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-linux-x64-musl@1.7.4': resolution: {integrity: sha512-N6nXuHyDO/q5kPN2xQxz5BEvhFpgnFSkP+9wxg5xWq+qIQL5bv37jk8dkKvMLx/8fHzTqrIjPDSRzVbcL7sqXg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.6.13': resolution: {integrity: sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==} diff --git a/src/index.ts b/src/index.ts index f93a020..6248835 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ import { } from './utils/normalizeModuleFederationOptions'; import normalizeOptimizeDepsPlugin from './utils/normalizeOptimizeDeps'; import { HOST_AUTO_INIT_PATH, HOST_AUTO_INIT_QUERY_STR, REMOTE_ENTRY_ID, WRAP_REMOTE_ENTRY_PATH, WRAP_REMOTE_ENTRY_QUERY_STR } from './virtualModules/virtualRemoteEntry'; -import { getLocalSharedImportMapId } from './virtualModules/virtualShared_preBuild'; +import { getLocalSharedImportMapPath } from './virtualModules/virtualShared_preBuild'; function federation(mfUserOptions: ModuleFederationOptions): Plugin[] { const options = normalizeModuleFederationOptions(mfUserOptions); @@ -33,7 +33,7 @@ function federation(mfUserOptions: ModuleFederationOptions): Plugin[] { pluginProxyRemoteEntry(), pluginProxyRemotes(options), ...pluginModuleParseEnd(((id: string) => { - return id.includes(HOST_AUTO_INIT_QUERY_STR) || id.includes(WRAP_REMOTE_ENTRY_QUERY_STR) || id.includes(REMOTE_ENTRY_ID) || id.includes(getLocalSharedImportMapId()) + return id.includes(HOST_AUTO_INIT_QUERY_STR) || id.includes(WRAP_REMOTE_ENTRY_QUERY_STR) || id.includes(REMOTE_ENTRY_ID) || id.includes(getLocalSharedImportMapPath()) })), ...proxySharedModule({ shared, diff --git a/src/plugins/pluginProxySharedModule_preBuild.ts b/src/plugins/pluginProxySharedModule_preBuild.ts index 810c269..73d9df9 100644 --- a/src/plugins/pluginProxySharedModule_preBuild.ts +++ b/src/plugins/pluginProxySharedModule_preBuild.ts @@ -8,7 +8,7 @@ import { packageNameDecode } from '../utils/packageNameUtils'; import { PromiseStore } from "../utils/PromiseStore"; import { virtualPackageName } from '../utils/VirtualModule'; import { wrapManualChunks } from '../utils/wrapManualChunks'; -import { addShare, generateLocalSharedImportMap, getLoadShareModulePath, getLocalSharedImportMapId, LOAD_SHARE_TAG, localSharedImportMapModule, PREBUILD_TAG, writeLoadShareModule, writeLocalSharedImportMap, writePreBuildLibPath } from '../virtualModules/virtualShared_preBuild'; +import { addShare, generateLocalSharedImportMap, getLoadShareModulePath, getLocalSharedImportMapPath, LOAD_SHARE_TAG, PREBUILD_TAG, writeLoadShareModule, writeLocalSharedImportMap, writePreBuildLibPath } from '../virtualModules/virtualShared_preBuild'; export function proxySharedModule( options: { shared?: NormalizedShared; include?: string | string[]; exclude?: string | string[] } ): Plugin[] { @@ -19,16 +19,16 @@ export function proxySharedModule( name: "generateLocalSharedImportMap", enforce: "post", resolveId(id) { - if (id.includes(getLocalSharedImportMapId())) + if (id.includes(getLocalSharedImportMapPath())) return id }, load(id) { - if (id.includes(getLocalSharedImportMapId())) { + if (id.includes(getLocalSharedImportMapPath())) { return generateLocalSharedImportMap() } }, transform(code, id) { - if (id.includes(getLocalSharedImportMapId())) { + if (id.includes(getLocalSharedImportMapPath())) { return generateLocalSharedImportMap() } } @@ -96,7 +96,7 @@ export function proxySharedModule( apply: "serve", config(config) { config.optimizeDeps = defu(config.optimizeDeps, { - exclude: [localSharedImportMapModule.getImportId()] + exclude: [getLocalSharedImportMapPath()] }); config.server = defu(config.server, { watch: { @@ -105,17 +105,8 @@ export function proxySharedModule( }); const watch = config.server.watch as WatchOptions watch.ignored = [].concat(watch.ignored as any); - watch.ignored.push(`!**/node_modules/${localSharedImportMapModule.getImportId()}.js`); + watch.ignored.push(`!**${getLocalSharedImportMapPath()}**`); }, - configureServer: (server): void => { - server.watcher.options = { - ...server.watcher.options, - ignored: [ - new RegExp(`node_modules\/(?!${virtualPackageName}).*`), - '**/.git/**', - ] - } - } }, { name: "prebuild-top-level-await", diff --git a/src/utils/localSharedImportMap_windows.ts b/src/utils/localSharedImportMap_windows.ts new file mode 100644 index 0000000..6c24d94 --- /dev/null +++ b/src/utils/localSharedImportMap_windows.ts @@ -0,0 +1,30 @@ +/** + * https://github.com/module-federation/vite/issues/68 + */ +import { mkdirSync, writeFileSync } from 'fs'; +import path from 'pathe'; +import VirtualModule from './VirtualModule'; + + +export function getLocalSharedImportMapPath_windows(virtualModule: VirtualModule) { + return virtualModule.getPath().replace("node_modules", ".__mf__win") +} +export function writeLocalSharedImportMap_windows(virtualModule: VirtualModule, content: string) { + const localSharedImportMapId = getLocalSharedImportMapPath_windows(virtualModule) + createFile(localSharedImportMapId + ".js", "\n// Windows temporarily needs this file, https://github.com/module-federation/vite/issues/68\n" + content) +} +/** + * 创建文件,确保前面的目录存在 + * @param {string} filePath - 文件的完整路径 + * @param {string} content - 写入文件的内容 + */ +function createFile(filePath: string, content: string) { + // 获取文件的目录路径 + const dir = path.dirname(filePath); + + // 递归创建目录(如果不存在的话) + mkdirSync(dir, { recursive: true }); + + // 创建文件并写入内容 + writeFileSync(filePath, content); +} diff --git a/src/virtualModules/virtualRemoteEntry.ts b/src/virtualModules/virtualRemoteEntry.ts index 7c0d50a..355cb55 100644 --- a/src/virtualModules/virtualRemoteEntry.ts +++ b/src/virtualModules/virtualRemoteEntry.ts @@ -1,6 +1,6 @@ import { NormalizedModuleFederationOptions } from '../utils/normalizeModuleFederationOptions'; import VirtualModule from '../utils/VirtualModule'; -import { getLocalSharedImportMapId } from './virtualShared_preBuild'; +import { getLocalSharedImportMapPath } from './virtualShared_preBuild'; export const REMOTE_ENTRY_ID = 'REMOTE_ENTRY_ID'; export function generateRemoteEntry(options: NormalizedModuleFederationOptions): string { @@ -32,14 +32,14 @@ export function generateRemoteEntry(options: NormalizedModuleFederationOptions): }) .join(',')} } - import localSharedImportMap from "${getLocalSharedImportMapId()}" + import localSharedImportMap from "${getLocalSharedImportMapPath()}" async function init(shared = {}) { const initRes = runtimeInit({ name: ${JSON.stringify(options.name)}, remotes: [${Object.keys(options.remotes) - .map((key) => { - const remote = options.remotes[key]; - return ` + .map((key) => { + const remote = options.remotes[key]; + return ` { entryGlobalName: ${JSON.stringify(remote.entryGlobalName)}, name: ${JSON.stringify(remote.name)}, @@ -47,8 +47,8 @@ export function generateRemoteEntry(options: NormalizedModuleFederationOptions): entry: ${JSON.stringify(remote.entry)}, } `; - }) - .join(',')} + }) + .join(',')} ], shared: localSharedImportMap, plugins: [${pluginImportNames.map((item) => `${item[0]}()`).join(', ')}] diff --git a/src/virtualModules/virtualShared_preBuild.ts b/src/virtualModules/virtualShared_preBuild.ts index 37e30a2..f8b515d 100644 --- a/src/virtualModules/virtualShared_preBuild.ts +++ b/src/virtualModules/virtualShared_preBuild.ts @@ -10,6 +10,7 @@ */ import { parsePromise } from "../plugins/pluginModuleParseEnd"; +import { getLocalSharedImportMapPath_windows, writeLocalSharedImportMap_windows } from "../utils/localSharedImportMap_windows"; import { getNormalizeModuleFederationOptions, ShareItem } from "../utils/normalizeModuleFederationOptions"; import { removePathFromNpmPackage } from "../utils/packageNameUtils"; import VirtualModule from "../utils/VirtualModule"; @@ -34,7 +35,10 @@ export function addShare(pkg: string) { // *** Expose locally provided shared modules here export const localSharedImportMapModule = new VirtualModule("localSharedImportMap") localSharedImportMapModule.writeSync("") -export function getLocalSharedImportMapId() { +export function getLocalSharedImportMapPath() { + if (process.platform === "win32") { + return getLocalSharedImportMapPath_windows(localSharedImportMapModule) + } return localSharedImportMapModule.getPath() } let prevSharedCount = 0 @@ -42,6 +46,9 @@ export async function writeLocalSharedImportMap() { const sharedCount = shareds.size if (prevSharedCount !== sharedCount) { prevSharedCount = sharedCount + if (process.platform === "win32") { + return writeLocalSharedImportMap_windows(localSharedImportMapModule, await generateLocalSharedImportMap()) + } return localSharedImportMapModule.writeSync(await generateLocalSharedImportMap()) } }