@module-federation/vite 1.7.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +271 -141
- package/lib/index.esm.js +272 -142
- package/lib/index.modern.js +243 -129
- package/lib/index.umd.js +271 -141
- package/lib/plugins/pluginMFManifest.d.ts +1 -1
- package/lib/utils/VirtualModule.d.ts +1 -0
- package/lib/utils/__tests__/VirtualModule.test.d.ts +1 -0
- package/lib/utils/__tests__/cssModuleHelpers.test.d.ts +1 -0
- package/lib/utils/cssModuleHelpers.d.ts +75 -0
- package/package.json +20 -17
package/lib/index.esm.js
CHANGED
|
@@ -2,7 +2,7 @@ import defu from 'defu';
|
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import { mkdirSync, writeFileSync, existsSync, writeFile } from 'fs';
|
|
4
4
|
import * as path from 'pathe';
|
|
5
|
-
import path__default, { resolve, parse, join, dirname
|
|
5
|
+
import path__default, { resolve, basename, parse, join, dirname } from 'pathe';
|
|
6
6
|
import { createFilter } from '@rollup/pluginutils';
|
|
7
7
|
import { walk } from 'estree-walker';
|
|
8
8
|
import MagicString from 'magic-string';
|
|
@@ -98,7 +98,7 @@ var addEntry = function addEntry(_ref) {
|
|
|
98
98
|
emitFileOptions.fileName = fileName;
|
|
99
99
|
}
|
|
100
100
|
emitFileId = this.emitFile(emitFileOptions);
|
|
101
|
-
if (htmlFilePath) {
|
|
101
|
+
if (htmlFilePath && fs.existsSync(htmlFilePath)) {
|
|
102
102
|
var htmlContent = fs.readFileSync(htmlFilePath, 'utf-8');
|
|
103
103
|
var scriptRegex = /<script\s+[^>]*src=["']([^"']+)["'][^>]*>/gi;
|
|
104
104
|
var match;
|
|
@@ -137,10 +137,14 @@ var addEntry = function addEntry(_ref) {
|
|
|
137
137
|
*/
|
|
138
138
|
function PluginDevProxyModuleTopLevelAwait() {
|
|
139
139
|
var filterFunction = createFilter();
|
|
140
|
+
var processedFlag = '/* already-processed-by-dev-proxy-module-top-level-await */';
|
|
140
141
|
return {
|
|
141
142
|
name: 'dev-proxy-module-top-level-await',
|
|
142
143
|
apply: 'serve',
|
|
143
144
|
transform: function transform(code, id) {
|
|
145
|
+
if (code.includes(processedFlag)) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
144
148
|
if (!code.includes('/*mf top-level-await placeholder replacement mf*/')) {
|
|
145
149
|
return null;
|
|
146
150
|
}
|
|
@@ -193,8 +197,9 @@ function PluginDevProxyModuleTopLevelAwait() {
|
|
|
193
197
|
}
|
|
194
198
|
}
|
|
195
199
|
});
|
|
200
|
+
var transformedCode = magicString.toString();
|
|
196
201
|
return {
|
|
197
|
-
code:
|
|
202
|
+
code: processedFlag + "\n" + transformedCode,
|
|
198
203
|
map: magicString.generateMap({
|
|
199
204
|
hires: true
|
|
200
205
|
})
|
|
@@ -513,6 +518,14 @@ function getNodeModulesDir() {
|
|
|
513
518
|
}
|
|
514
519
|
return cachedNodeModulesDir;
|
|
515
520
|
}
|
|
521
|
+
function getSuffix(name) {
|
|
522
|
+
var base = basename(name);
|
|
523
|
+
var dotIndex = base.lastIndexOf('.');
|
|
524
|
+
if (dotIndex > 0 && dotIndex < base.length - 1) {
|
|
525
|
+
return base.slice(dotIndex);
|
|
526
|
+
}
|
|
527
|
+
return '.js';
|
|
528
|
+
}
|
|
516
529
|
var patternMap = {};
|
|
517
530
|
var cacheMap = {};
|
|
518
531
|
/**
|
|
@@ -520,7 +533,6 @@ var cacheMap = {};
|
|
|
520
533
|
*/
|
|
521
534
|
var VirtualModule = /*#__PURE__*/function () {
|
|
522
535
|
function VirtualModule(name, tag, suffix) {
|
|
523
|
-
var _name$split$slice$pop;
|
|
524
536
|
if (tag === void 0) {
|
|
525
537
|
tag = '__mf_v__';
|
|
526
538
|
}
|
|
@@ -533,7 +545,7 @@ var VirtualModule = /*#__PURE__*/function () {
|
|
|
533
545
|
this.inited = false;
|
|
534
546
|
this.name = name;
|
|
535
547
|
this.tag = tag;
|
|
536
|
-
this.suffix = suffix || (
|
|
548
|
+
this.suffix = suffix || getSuffix(name);
|
|
537
549
|
if (!cacheMap[this.tag]) cacheMap[this.tag] = {};
|
|
538
550
|
cacheMap[this.tag][this.name] = this;
|
|
539
551
|
}
|
|
@@ -685,9 +697,9 @@ function writeLocalSharedImportMap() {
|
|
|
685
697
|
}
|
|
686
698
|
function generateLocalSharedImportMap() {
|
|
687
699
|
var options = getNormalizeModuleFederationOptions();
|
|
688
|
-
return "\n const importMap = {\n " + Array.from(getUsedShares()).map(function (pkg) {
|
|
700
|
+
return "\n const importMap = {\n " + Array.from(getUsedShares()).sort().map(function (pkg) {
|
|
689
701
|
return "\n " + JSON.stringify(pkg) + ": async () => {\n let pkg = await import(\"" + getPreBuildLibImportId(pkg) + "\")\n return pkg\n }\n ";
|
|
690
|
-
}).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).map(function (key) {
|
|
702
|
+
}).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).sort().map(function (key) {
|
|
691
703
|
var shareItem = getNormalizeShareItem(key);
|
|
692
704
|
if (!shareItem) return null;
|
|
693
705
|
return "\n " + JSON.stringify(key) + ": {\n name: " + JSON.stringify(key) + ",\n version: " + JSON.stringify(shareItem.version) + ",\n scope: [" + JSON.stringify(shareItem.scope) + "],\n loaded: false,\n from: " + JSON.stringify(options.name) + ",\n async get () {\n usedShared[" + JSON.stringify(key) + "].loaded = true\n const {" + JSON.stringify(key) + ": pkgDynamicImport} = importMap \n const res = await pkgDynamicImport()\n const exportModule = {...res}\n // All npm packages pre-built by vite will be converted to esm\n Object.defineProperty(exportModule, \"__esModule\", {\n value: true,\n enumerable: false\n })\n return function () {\n return exportModule\n }\n },\n shareConfig: {\n singleton: " + shareItem.shareConfig.singleton + ",\n requiredVersion: " + JSON.stringify(shareItem.shareConfig.requiredVersion) + "\n }\n }\n ";
|
|
@@ -735,6 +747,154 @@ function initVirtualModules() {
|
|
|
735
747
|
writeRuntimeInitStatus();
|
|
736
748
|
}
|
|
737
749
|
|
|
750
|
+
var ASSET_TYPES = ['js', 'css'];
|
|
751
|
+
var LOAD_TIMINGS = ['sync', 'async'];
|
|
752
|
+
var JS_EXTENSIONS = ['.ts', '.tsx', '.jsx', '.mjs', '.cjs'];
|
|
753
|
+
/**
|
|
754
|
+
* Creates an empty asset map structure for tracking JS and CSS assets
|
|
755
|
+
* @returns Initialized asset map with sync/async arrays for JS and CSS
|
|
756
|
+
*/
|
|
757
|
+
var createEmptyAssetMap = function createEmptyAssetMap() {
|
|
758
|
+
return {
|
|
759
|
+
js: {
|
|
760
|
+
sync: [],
|
|
761
|
+
async: []
|
|
762
|
+
},
|
|
763
|
+
css: {
|
|
764
|
+
sync: [],
|
|
765
|
+
async: []
|
|
766
|
+
}
|
|
767
|
+
};
|
|
768
|
+
};
|
|
769
|
+
/**
|
|
770
|
+
* Tracks an asset in the preload map with deduplication
|
|
771
|
+
* @param map - The preload map to update
|
|
772
|
+
* @param key - The module key to track under
|
|
773
|
+
* @param fileName - The asset filename to track
|
|
774
|
+
* @param isAsync - Whether the asset is loaded async
|
|
775
|
+
* @param type - The asset type ('js' or 'css')
|
|
776
|
+
*/
|
|
777
|
+
var trackAsset = function trackAsset(map, key, fileName, isAsync, type) {
|
|
778
|
+
if (!map[key]) {
|
|
779
|
+
map[key] = createEmptyAssetMap();
|
|
780
|
+
}
|
|
781
|
+
var target = isAsync ? map[key][type].async : map[key][type].sync;
|
|
782
|
+
if (!target.includes(fileName)) {
|
|
783
|
+
target.push(fileName);
|
|
784
|
+
}
|
|
785
|
+
};
|
|
786
|
+
/**
|
|
787
|
+
* Checks if a file is a CSS file by extension
|
|
788
|
+
* @param fileName - The filename to check
|
|
789
|
+
* @returns True if file has a CSS extension (.css, .scss, .less)
|
|
790
|
+
*/
|
|
791
|
+
var isCSSFile = function isCSSFile(fileName) {
|
|
792
|
+
return fileName.endsWith('.css') || fileName.endsWith('.scss') || fileName.endsWith('.less');
|
|
793
|
+
};
|
|
794
|
+
/**
|
|
795
|
+
* Collects all CSS assets from the bundle
|
|
796
|
+
* @param bundle - The Rollup output bundle
|
|
797
|
+
* @returns Set of CSS asset filenames
|
|
798
|
+
*/
|
|
799
|
+
var collectCssAssets = function collectCssAssets(bundle) {
|
|
800
|
+
var cssAssets = new Set();
|
|
801
|
+
for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
|
|
802
|
+
var _Object$entries$_i = _Object$entries[_i],
|
|
803
|
+
fileName = _Object$entries$_i[0],
|
|
804
|
+
fileData = _Object$entries$_i[1];
|
|
805
|
+
if (fileData.type === 'asset' && isCSSFile(fileName)) {
|
|
806
|
+
cssAssets.add(fileName);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
return cssAssets;
|
|
810
|
+
};
|
|
811
|
+
/**
|
|
812
|
+
* Processes module assets and tracks them in the files map
|
|
813
|
+
* @param bundle - The Rollup output bundle
|
|
814
|
+
* @param filesMap - The preload map to populate
|
|
815
|
+
* @param moduleMatcher - Function that matches module paths to keys
|
|
816
|
+
*/
|
|
817
|
+
var processModuleAssets = function processModuleAssets(bundle, filesMap, moduleMatcher) {
|
|
818
|
+
for (var _i2 = 0, _Object$entries2 = Object.entries(bundle); _i2 < _Object$entries2.length; _i2++) {
|
|
819
|
+
var _Object$entries2$_i = _Object$entries2[_i2],
|
|
820
|
+
fileName = _Object$entries2$_i[0],
|
|
821
|
+
fileData = _Object$entries2$_i[1];
|
|
822
|
+
if (fileData.type !== 'chunk') continue;
|
|
823
|
+
if (!fileData.modules) continue;
|
|
824
|
+
for (var _i3 = 0, _Object$keys = Object.keys(fileData.modules); _i3 < _Object$keys.length; _i3++) {
|
|
825
|
+
var modulePath = _Object$keys[_i3];
|
|
826
|
+
var matchKey = moduleMatcher(modulePath);
|
|
827
|
+
if (!matchKey) continue;
|
|
828
|
+
// Track main JS chunk
|
|
829
|
+
trackAsset(filesMap, matchKey, fileName, false, 'js');
|
|
830
|
+
// Handle dynamic imports
|
|
831
|
+
if (fileData.dynamicImports) {
|
|
832
|
+
for (var _iterator = _createForOfIteratorHelperLoose(fileData.dynamicImports), _step; !(_step = _iterator()).done;) {
|
|
833
|
+
var dynamicImport = _step.value;
|
|
834
|
+
var importData = bundle[dynamicImport];
|
|
835
|
+
if (!importData) continue;
|
|
836
|
+
var isCss = isCSSFile(dynamicImport);
|
|
837
|
+
trackAsset(filesMap, matchKey, dynamicImport, true, isCss ? 'css' : 'js');
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
/**
|
|
844
|
+
* Deduplicates assets in the files map
|
|
845
|
+
* @param filesMap - The preload map to deduplicate
|
|
846
|
+
* @returns New deduplicated preload map
|
|
847
|
+
*/
|
|
848
|
+
var deduplicateAssets = function deduplicateAssets(filesMap) {
|
|
849
|
+
var result = {};
|
|
850
|
+
for (var _i4 = 0, _Object$entries3 = Object.entries(filesMap); _i4 < _Object$entries3.length; _i4++) {
|
|
851
|
+
var _Object$entries3$_i = _Object$entries3[_i4],
|
|
852
|
+
key = _Object$entries3$_i[0],
|
|
853
|
+
assetMaps = _Object$entries3$_i[1];
|
|
854
|
+
result[key] = createEmptyAssetMap();
|
|
855
|
+
for (var _i5 = 0, _ASSET_TYPES = ASSET_TYPES; _i5 < _ASSET_TYPES.length; _i5++) {
|
|
856
|
+
var type = _ASSET_TYPES[_i5];
|
|
857
|
+
for (var _i6 = 0, _LOAD_TIMINGS = LOAD_TIMINGS; _i6 < _LOAD_TIMINGS.length; _i6++) {
|
|
858
|
+
var timing = _LOAD_TIMINGS[_i6];
|
|
859
|
+
result[key][type][timing] = Array.from(new Set(assetMaps[type][timing]));
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return result;
|
|
864
|
+
};
|
|
865
|
+
/**
|
|
866
|
+
* Builds a mapping between module files and their share keys
|
|
867
|
+
* @param shareKeys - Set of share keys to map
|
|
868
|
+
* @param resolveFn - Function to resolve module paths
|
|
869
|
+
* @returns Map of file paths to their corresponding share keys
|
|
870
|
+
*/
|
|
871
|
+
var buildFileToShareKeyMap = function buildFileToShareKeyMap(shareKeys, resolveFn) {
|
|
872
|
+
try {
|
|
873
|
+
var fileToShareKey = new Map();
|
|
874
|
+
return Promise.resolve(Promise.all(Array.from(shareKeys).map(function (shareKey) {
|
|
875
|
+
return resolveFn(getPreBuildLibImportId(shareKey)).then(function (resolution) {
|
|
876
|
+
var _resolution$id;
|
|
877
|
+
return {
|
|
878
|
+
shareKey: shareKey,
|
|
879
|
+
file: resolution == null || (_resolution$id = resolution.id) == null ? void 0 : _resolution$id.split('?')[0]
|
|
880
|
+
};
|
|
881
|
+
})["catch"](function () {
|
|
882
|
+
return null;
|
|
883
|
+
});
|
|
884
|
+
}))).then(function (resolutions) {
|
|
885
|
+
for (var _iterator2 = _createForOfIteratorHelperLoose(resolutions), _step2; !(_step2 = _iterator2()).done;) {
|
|
886
|
+
var resolution = _step2.value;
|
|
887
|
+
if (resolution != null && resolution.file) {
|
|
888
|
+
fileToShareKey.set(resolution.file, resolution.shareKey);
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
return fileToShareKey;
|
|
892
|
+
});
|
|
893
|
+
} catch (e) {
|
|
894
|
+
return Promise.reject(e);
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
|
|
738
898
|
var Manifest = function Manifest() {
|
|
739
899
|
var mfOptions = getNormalizeModuleFederationOptions();
|
|
740
900
|
var name = mfOptions.name,
|
|
@@ -746,21 +906,43 @@ var Manifest = function Manifest() {
|
|
|
746
906
|
mfManifestName = 'mf-manifest.json';
|
|
747
907
|
}
|
|
748
908
|
if (typeof manifestOptions !== 'boolean') {
|
|
749
|
-
mfManifestName = join((manifestOptions == null ? void 0 : manifestOptions.filePath) || '', (manifestOptions == null ? void 0 : manifestOptions.fileName) || '');
|
|
909
|
+
mfManifestName = path.join((manifestOptions == null ? void 0 : manifestOptions.filePath) || '', (manifestOptions == null ? void 0 : manifestOptions.fileName) || '');
|
|
750
910
|
}
|
|
751
|
-
var extensions;
|
|
752
911
|
var root;
|
|
753
912
|
var remoteEntryFile;
|
|
754
913
|
var publicPath;
|
|
755
914
|
var _command;
|
|
756
915
|
var _originalConfigBase;
|
|
757
916
|
var viteConfig;
|
|
917
|
+
/**
|
|
918
|
+
* Adds global CSS assets to all module exports
|
|
919
|
+
* @param filesMap - The preload map to update
|
|
920
|
+
* @param cssAssets - Set of CSS asset filenames to add
|
|
921
|
+
*/
|
|
922
|
+
var addCssAssetsToAllExports = function addCssAssetsToAllExports(filesMap, cssAssets) {
|
|
923
|
+
Object.keys(filesMap).forEach(function (key) {
|
|
924
|
+
cssAssets.forEach(function (cssAsset) {
|
|
925
|
+
trackAsset(filesMap, key, cssAsset, false, 'css');
|
|
926
|
+
});
|
|
927
|
+
});
|
|
928
|
+
};
|
|
758
929
|
return [{
|
|
759
930
|
name: 'module-federation-manifest',
|
|
760
931
|
apply: 'serve',
|
|
932
|
+
/**
|
|
933
|
+
* Stores resolved Vite config for later use
|
|
934
|
+
*/
|
|
935
|
+
/**
|
|
936
|
+
* Finalizes configuration after all plugins are resolved
|
|
937
|
+
* @param config - Fully resolved Vite config
|
|
938
|
+
*/
|
|
761
939
|
configResolved: function configResolved(config) {
|
|
762
940
|
viteConfig = config;
|
|
763
941
|
},
|
|
942
|
+
/**
|
|
943
|
+
* Configures dev server middleware to handle manifest requests
|
|
944
|
+
* @param server - Vite dev server instance
|
|
945
|
+
*/
|
|
764
946
|
configureServer: function configureServer(server) {
|
|
765
947
|
server.middlewares.use(function (req, res, next) {
|
|
766
948
|
var _req$url;
|
|
@@ -808,137 +990,85 @@ var Manifest = function Manifest() {
|
|
|
808
990
|
}, {
|
|
809
991
|
name: 'module-federation-manifest',
|
|
810
992
|
enforce: 'post',
|
|
993
|
+
/**
|
|
994
|
+
* Initial plugin configuration
|
|
995
|
+
* @param config - Vite config object
|
|
996
|
+
* @param command - Current Vite command (serve/build)
|
|
997
|
+
*/
|
|
811
998
|
config: function config(_config, _ref) {
|
|
812
999
|
var command = _ref.command;
|
|
813
1000
|
if (!_config.build) _config.build = {};
|
|
814
|
-
if (!_config.build.manifest)
|
|
1001
|
+
if (!_config.build.manifest) {
|
|
1002
|
+
_config.build.manifest = _config.build.manifest || !!manifestOptions;
|
|
1003
|
+
}
|
|
815
1004
|
_command = command;
|
|
816
1005
|
_originalConfigBase = _config.base;
|
|
817
1006
|
},
|
|
818
1007
|
configResolved: function configResolved(config) {
|
|
819
1008
|
root = config.root;
|
|
820
|
-
extensions = config.resolve.extensions || ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json'];
|
|
821
1009
|
var base = config.base;
|
|
822
1010
|
if (_command === 'serve') {
|
|
823
1011
|
base = (config.server.origin || '') + config.base;
|
|
824
1012
|
}
|
|
825
1013
|
publicPath = _originalConfigBase === '' ? 'auto' : base ? base.replace(/\/?$/, '/') : 'auto';
|
|
826
1014
|
},
|
|
1015
|
+
/**
|
|
1016
|
+
* Generates the module federation manifest file
|
|
1017
|
+
* @param options - Rollup output options
|
|
1018
|
+
* @param bundle - Generated bundle assets
|
|
1019
|
+
*/
|
|
827
1020
|
generateBundle: function generateBundle(options, bundle) {
|
|
828
1021
|
try {
|
|
829
1022
|
var _this = this;
|
|
830
|
-
// 递归查找模块的同步导入文件
|
|
831
|
-
var _findSynchronousImports = function findSynchronousImports(fileName, array) {
|
|
832
|
-
var fileData = bundle[fileName];
|
|
833
|
-
if (fileData && fileData.type === 'chunk') {
|
|
834
|
-
array.push(fileName); // 将当前文件加入预加载列表
|
|
835
|
-
// 遍历该文件的同步导入文件
|
|
836
|
-
fileData.imports.forEach(function (importedFile) {
|
|
837
|
-
if (array.indexOf(importedFile) === -1) {
|
|
838
|
-
_findSynchronousImports(importedFile, array); // 递归查找同步导入的文件
|
|
839
|
-
}
|
|
840
|
-
});
|
|
841
|
-
}
|
|
842
|
-
};
|
|
843
1023
|
if (!mfManifestName) return Promise.resolve();
|
|
844
|
-
var
|
|
845
|
-
|
|
846
|
-
}); // 获取你提供的 moduleIds
|
|
847
|
-
var filesContainingModules = {};
|
|
848
|
-
// 帮助函数:检查模块路径是否匹配
|
|
849
|
-
var isModuleMatched = function isModuleMatched(relativeModulePath, preloadModule) {
|
|
850
|
-
// 先尝试直接匹配
|
|
851
|
-
if (relativeModulePath === preloadModule) return true;
|
|
852
|
-
// 如果 preloadModule 没有后缀,尝试添加可能的后缀进行匹配
|
|
853
|
-
for (var _iterator = _createForOfIteratorHelperLoose(extensions), _step; !(_step = _iterator()).done;) {
|
|
854
|
-
var ext = _step.value;
|
|
855
|
-
if (relativeModulePath === "" + preloadModule + ext) {
|
|
856
|
-
return true;
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
return false;
|
|
860
|
-
};
|
|
861
|
-
// 遍历打包生成的每个文件
|
|
1024
|
+
var filesMap = {};
|
|
1025
|
+
// First pass: Find remoteEntry file
|
|
862
1026
|
for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
|
|
863
1027
|
var _Object$entries$_i = _Object$entries[_i],
|
|
864
|
-
|
|
1028
|
+
_ = _Object$entries$_i[0],
|
|
865
1029
|
fileData = _Object$entries$_i[1];
|
|
866
1030
|
if (mfOptions.filename.replace(/[\[\]]/g, '_').replace(/\.[^/.]+$/, '') === fileData.name || fileData.name === 'remoteEntry') {
|
|
867
1031
|
remoteEntryFile = fileData.fileName;
|
|
868
|
-
|
|
869
|
-
if (fileData.type === 'chunk') {
|
|
870
|
-
// 遍历该文件的所有模块
|
|
871
|
-
for (var _i2 = 0, _Object$keys = Object.keys(fileData.modules); _i2 < _Object$keys.length; _i2++) {
|
|
872
|
-
var modulePath = _Object$keys[_i2];
|
|
873
|
-
// 将绝对路径转换为相对于 Vite root 的相对路径
|
|
874
|
-
var relativeModulePath = relative(root, modulePath);
|
|
875
|
-
// 检查模块是否在 preloadModules 列表中
|
|
876
|
-
for (var _iterator2 = _createForOfIteratorHelperLoose(exposesModules), _step2; !(_step2 = _iterator2()).done;) {
|
|
877
|
-
var preloadModule = _step2.value;
|
|
878
|
-
var formatPreloadModule = preloadModule.replace('./', '');
|
|
879
|
-
if (isModuleMatched(relativeModulePath, formatPreloadModule)) {
|
|
880
|
-
var _filesContainingModul;
|
|
881
|
-
if (!filesContainingModules[preloadModule]) {
|
|
882
|
-
filesContainingModules[preloadModule] = {
|
|
883
|
-
sync: [],
|
|
884
|
-
async: []
|
|
885
|
-
};
|
|
886
|
-
}
|
|
887
|
-
console.log(Object.keys(fileData.modules));
|
|
888
|
-
filesContainingModules[preloadModule].sync.push(fileName);
|
|
889
|
-
(_filesContainingModul = filesContainingModules[preloadModule].async).push.apply(_filesContainingModul, fileData.dynamicImports || []);
|
|
890
|
-
_findSynchronousImports(fileName, filesContainingModules[preloadModule].sync);
|
|
891
|
-
break; // 如果找到匹配,跳出循环
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
}
|
|
1032
|
+
break; // We can break early since we only need to find remoteEntry once
|
|
895
1033
|
}
|
|
896
1034
|
}
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
var _Object$entries2$_i = _Object$entries2[_i3],
|
|
911
|
-
_fileName = _Object$entries2$_i[0],
|
|
912
|
-
_fileData = _Object$entries2$_i[1];
|
|
913
|
-
if (_fileData.type === 'chunk') {
|
|
914
|
-
// 遍历该文件的所有模块
|
|
915
|
-
for (var _i4 = 0, _Object$keys2 = Object.keys(_fileData.modules); _i4 < _Object$keys2.length; _i4++) {
|
|
916
|
-
var _modulePath = _Object$keys2[_i4];
|
|
917
|
-
var sharedKey = fileToShareKey[_modulePath];
|
|
918
|
-
if (sharedKey) {
|
|
919
|
-
var _filesContainingModul2;
|
|
920
|
-
if (!filesContainingModules[sharedKey]) {
|
|
921
|
-
filesContainingModules[sharedKey] = {
|
|
922
|
-
sync: [],
|
|
923
|
-
async: []
|
|
924
|
-
};
|
|
925
|
-
}
|
|
926
|
-
filesContainingModules[sharedKey].sync.push(_fileName);
|
|
927
|
-
(_filesContainingModul2 = filesContainingModules[sharedKey].async).push.apply(_filesContainingModul2, _fileData.dynamicImports || []);
|
|
928
|
-
_findSynchronousImports(_fileName, filesContainingModules[sharedKey].sync);
|
|
929
|
-
break; // 如果找到匹配,跳出循环
|
|
930
|
-
}
|
|
931
|
-
}
|
|
1035
|
+
// Second pass: Collect all CSS assets
|
|
1036
|
+
var allCssAssets = collectCssAssets(bundle);
|
|
1037
|
+
var exposesModules = Object.keys(mfOptions.exposes).map(function (item) {
|
|
1038
|
+
return mfOptions.exposes[item]["import"];
|
|
1039
|
+
});
|
|
1040
|
+
// Process exposed modules
|
|
1041
|
+
processModuleAssets(bundle, filesMap, function (modulePath) {
|
|
1042
|
+
var absoluteModulePath = path.resolve(root, modulePath);
|
|
1043
|
+
return exposesModules.find(function (exposeModule) {
|
|
1044
|
+
var exposePath = path.resolve(root, exposeModule);
|
|
1045
|
+
// First try exact path match
|
|
1046
|
+
if (absoluteModulePath === exposePath) {
|
|
1047
|
+
return true;
|
|
932
1048
|
}
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
1049
|
+
// Then try path match without known extensions
|
|
1050
|
+
var getPathWithoutKnownExt = function getPathWithoutKnownExt(filePath) {
|
|
1051
|
+
var ext = path.extname(filePath);
|
|
1052
|
+
return JS_EXTENSIONS.includes(ext) ? path.join(path.dirname(filePath), path.basename(filePath, ext)) : filePath;
|
|
1053
|
+
};
|
|
1054
|
+
var modulePathNoExt = getPathWithoutKnownExt(absoluteModulePath);
|
|
1055
|
+
var exposePathNoExt = getPathWithoutKnownExt(exposePath);
|
|
1056
|
+
return modulePathNoExt === exposePathNoExt;
|
|
1057
|
+
});
|
|
1058
|
+
});
|
|
1059
|
+
// Process shared modules
|
|
1060
|
+
return Promise.resolve(buildFileToShareKeyMap(getUsedShares(), _this.resolve.bind(_this))).then(function (fileToShareKey) {
|
|
1061
|
+
processModuleAssets(bundle, filesMap, function (modulePath) {
|
|
1062
|
+
return fileToShareKey.get(modulePath);
|
|
937
1063
|
});
|
|
1064
|
+
// Add all CSS assets to every export
|
|
1065
|
+
addCssAssetsToAllExports(filesMap, allCssAssets);
|
|
1066
|
+
// Final deduplication of all assets
|
|
1067
|
+
filesMap = deduplicateAssets(filesMap);
|
|
938
1068
|
_this.emitFile({
|
|
939
1069
|
type: 'asset',
|
|
940
1070
|
fileName: mfManifestName,
|
|
941
|
-
source: JSON.stringify(generateMFManifest(
|
|
1071
|
+
source: JSON.stringify(generateMFManifest(filesMap))
|
|
942
1072
|
});
|
|
943
1073
|
});
|
|
944
1074
|
} catch (e) {
|
|
@@ -946,6 +1076,11 @@ var Manifest = function Manifest() {
|
|
|
946
1076
|
}
|
|
947
1077
|
}
|
|
948
1078
|
}];
|
|
1079
|
+
/**
|
|
1080
|
+
* Generates the final manifest JSON structure
|
|
1081
|
+
* @param preloadMap - Map of module assets to include
|
|
1082
|
+
* @returns Complete manifest object
|
|
1083
|
+
*/
|
|
949
1084
|
function generateMFManifest(preloadMap) {
|
|
950
1085
|
var options = getNormalizeModuleFederationOptions();
|
|
951
1086
|
var name = options.name;
|
|
@@ -954,23 +1089,23 @@ var Manifest = function Manifest() {
|
|
|
954
1089
|
path: '',
|
|
955
1090
|
type: 'module'
|
|
956
1091
|
};
|
|
957
|
-
|
|
958
|
-
var
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
1092
|
+
// Process remotes
|
|
1093
|
+
var remotes = Array.from(Object.entries(getUsedRemotesMap())).flatMap(function (_ref2) {
|
|
1094
|
+
var remoteKey = _ref2[0],
|
|
1095
|
+
modules = _ref2[1];
|
|
1096
|
+
return Array.from(modules).map(function (moduleKey) {
|
|
1097
|
+
return {
|
|
963
1098
|
federationContainerName: options.remotes[remoteKey].entry,
|
|
964
1099
|
moduleName: moduleKey.replace(remoteKey, '').replace('/', ''),
|
|
965
1100
|
alias: remoteKey,
|
|
966
1101
|
entry: '*'
|
|
967
|
-
}
|
|
1102
|
+
};
|
|
968
1103
|
});
|
|
969
1104
|
});
|
|
970
|
-
//
|
|
1105
|
+
// Process shared dependencies
|
|
971
1106
|
var shared = Array.from(getUsedShares()).map(function (shareKey) {
|
|
972
|
-
var _preloadMap$shareKey, _preloadMap$shareKey2;
|
|
973
1107
|
var shareItem = getNormalizeShareItem(shareKey);
|
|
1108
|
+
var assets = preloadMap[shareKey] || createEmptyAssetMap();
|
|
974
1109
|
return {
|
|
975
1110
|
id: name + ":" + shareKey,
|
|
976
1111
|
name: shareKey,
|
|
@@ -978,42 +1113,40 @@ var Manifest = function Manifest() {
|
|
|
978
1113
|
requiredVersion: shareItem.shareConfig.requiredVersion,
|
|
979
1114
|
assets: {
|
|
980
1115
|
js: {
|
|
981
|
-
async:
|
|
982
|
-
sync:
|
|
1116
|
+
async: assets.js.async,
|
|
1117
|
+
sync: assets.js.sync
|
|
983
1118
|
},
|
|
984
1119
|
css: {
|
|
985
|
-
async:
|
|
986
|
-
sync:
|
|
1120
|
+
async: assets.css.async,
|
|
1121
|
+
sync: assets.css.sync
|
|
987
1122
|
}
|
|
988
1123
|
}
|
|
989
1124
|
};
|
|
990
|
-
}).filter(
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
// assets(.css, .jpg, .svg等)其他资源, 不重要, 暂未处理
|
|
1125
|
+
}).filter(Boolean);
|
|
1126
|
+
// Process exposed modules
|
|
1127
|
+
var exposes = Object.entries(options.exposes).map(function (_ref3) {
|
|
1128
|
+
var key = _ref3[0],
|
|
1129
|
+
value = _ref3[1];
|
|
996
1130
|
var formatKey = key.replace('./', '');
|
|
997
|
-
var sourceFile =
|
|
1131
|
+
var sourceFile = value["import"];
|
|
1132
|
+
var assets = preloadMap[sourceFile] || createEmptyAssetMap();
|
|
998
1133
|
return {
|
|
999
|
-
id: name +
|
|
1134
|
+
id: name + ":" + formatKey,
|
|
1000
1135
|
name: formatKey,
|
|
1001
1136
|
assets: {
|
|
1002
1137
|
js: {
|
|
1003
|
-
async:
|
|
1004
|
-
sync:
|
|
1138
|
+
async: assets.js.async,
|
|
1139
|
+
sync: assets.js.sync
|
|
1005
1140
|
},
|
|
1006
1141
|
css: {
|
|
1007
|
-
|
|
1008
|
-
|
|
1142
|
+
async: assets.css.async,
|
|
1143
|
+
sync: assets.css.sync
|
|
1009
1144
|
}
|
|
1010
1145
|
},
|
|
1011
1146
|
path: key
|
|
1012
1147
|
};
|
|
1013
|
-
}).filter(
|
|
1014
|
-
|
|
1015
|
-
}); // Filter out any null values
|
|
1016
|
-
var result = {
|
|
1148
|
+
}).filter(Boolean);
|
|
1149
|
+
return {
|
|
1017
1150
|
id: name,
|
|
1018
1151
|
name: name,
|
|
1019
1152
|
metaData: _extends({
|
|
@@ -1028,8 +1161,6 @@ var Manifest = function Manifest() {
|
|
|
1028
1161
|
types: {
|
|
1029
1162
|
path: '',
|
|
1030
1163
|
name: ''
|
|
1031
|
-
// "zip": "@mf-types.zip",
|
|
1032
|
-
// "api": "@mf-types.d.ts"
|
|
1033
1164
|
},
|
|
1034
1165
|
globalName: name,
|
|
1035
1166
|
pluginVersion: '0.2.5'
|
|
@@ -1042,7 +1173,6 @@ var Manifest = function Manifest() {
|
|
|
1042
1173
|
remotes: remotes,
|
|
1043
1174
|
exposes: exposes
|
|
1044
1175
|
};
|
|
1045
|
-
return result;
|
|
1046
1176
|
}
|
|
1047
1177
|
};
|
|
1048
1178
|
|