@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.umd.js
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
emitFileOptions.fileName = fileName;
|
|
121
121
|
}
|
|
122
122
|
emitFileId = this.emitFile(emitFileOptions);
|
|
123
|
-
if (htmlFilePath) {
|
|
123
|
+
if (htmlFilePath && fs__namespace.existsSync(htmlFilePath)) {
|
|
124
124
|
var htmlContent = fs__namespace.readFileSync(htmlFilePath, 'utf-8');
|
|
125
125
|
var scriptRegex = /<script\s+[^>]*src=["']([^"']+)["'][^>]*>/gi;
|
|
126
126
|
var match;
|
|
@@ -159,10 +159,14 @@
|
|
|
159
159
|
*/
|
|
160
160
|
function PluginDevProxyModuleTopLevelAwait() {
|
|
161
161
|
var filterFunction = pluginutils.createFilter();
|
|
162
|
+
var processedFlag = '/* already-processed-by-dev-proxy-module-top-level-await */';
|
|
162
163
|
return {
|
|
163
164
|
name: 'dev-proxy-module-top-level-await',
|
|
164
165
|
apply: 'serve',
|
|
165
166
|
transform: function transform(code, id) {
|
|
167
|
+
if (code.includes(processedFlag)) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
166
170
|
if (!code.includes('/*mf top-level-await placeholder replacement mf*/')) {
|
|
167
171
|
return null;
|
|
168
172
|
}
|
|
@@ -215,8 +219,9 @@
|
|
|
215
219
|
}
|
|
216
220
|
}
|
|
217
221
|
});
|
|
222
|
+
var transformedCode = magicString.toString();
|
|
218
223
|
return {
|
|
219
|
-
code:
|
|
224
|
+
code: processedFlag + "\n" + transformedCode,
|
|
220
225
|
map: magicString.generateMap({
|
|
221
226
|
hires: true
|
|
222
227
|
})
|
|
@@ -535,6 +540,14 @@
|
|
|
535
540
|
}
|
|
536
541
|
return cachedNodeModulesDir;
|
|
537
542
|
}
|
|
543
|
+
function getSuffix(name) {
|
|
544
|
+
var base = path.basename(name);
|
|
545
|
+
var dotIndex = base.lastIndexOf('.');
|
|
546
|
+
if (dotIndex > 0 && dotIndex < base.length - 1) {
|
|
547
|
+
return base.slice(dotIndex);
|
|
548
|
+
}
|
|
549
|
+
return '.js';
|
|
550
|
+
}
|
|
538
551
|
var patternMap = {};
|
|
539
552
|
var cacheMap = {};
|
|
540
553
|
/**
|
|
@@ -542,7 +555,6 @@
|
|
|
542
555
|
*/
|
|
543
556
|
var VirtualModule = /*#__PURE__*/function () {
|
|
544
557
|
function VirtualModule(name, tag, suffix) {
|
|
545
|
-
var _name$split$slice$pop;
|
|
546
558
|
if (tag === void 0) {
|
|
547
559
|
tag = '__mf_v__';
|
|
548
560
|
}
|
|
@@ -555,7 +567,7 @@
|
|
|
555
567
|
this.inited = false;
|
|
556
568
|
this.name = name;
|
|
557
569
|
this.tag = tag;
|
|
558
|
-
this.suffix = suffix || (
|
|
570
|
+
this.suffix = suffix || getSuffix(name);
|
|
559
571
|
if (!cacheMap[this.tag]) cacheMap[this.tag] = {};
|
|
560
572
|
cacheMap[this.tag][this.name] = this;
|
|
561
573
|
}
|
|
@@ -707,9 +719,9 @@
|
|
|
707
719
|
}
|
|
708
720
|
function generateLocalSharedImportMap() {
|
|
709
721
|
var options = getNormalizeModuleFederationOptions();
|
|
710
|
-
return "\n const importMap = {\n " + Array.from(getUsedShares()).map(function (pkg) {
|
|
722
|
+
return "\n const importMap = {\n " + Array.from(getUsedShares()).sort().map(function (pkg) {
|
|
711
723
|
return "\n " + JSON.stringify(pkg) + ": async () => {\n let pkg = await import(\"" + getPreBuildLibImportId(pkg) + "\")\n return pkg\n }\n ";
|
|
712
|
-
}).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).map(function (key) {
|
|
724
|
+
}).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).sort().map(function (key) {
|
|
713
725
|
var shareItem = getNormalizeShareItem(key);
|
|
714
726
|
if (!shareItem) return null;
|
|
715
727
|
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 ";
|
|
@@ -757,6 +769,154 @@
|
|
|
757
769
|
writeRuntimeInitStatus();
|
|
758
770
|
}
|
|
759
771
|
|
|
772
|
+
var ASSET_TYPES = ['js', 'css'];
|
|
773
|
+
var LOAD_TIMINGS = ['sync', 'async'];
|
|
774
|
+
var JS_EXTENSIONS = ['.ts', '.tsx', '.jsx', '.mjs', '.cjs'];
|
|
775
|
+
/**
|
|
776
|
+
* Creates an empty asset map structure for tracking JS and CSS assets
|
|
777
|
+
* @returns Initialized asset map with sync/async arrays for JS and CSS
|
|
778
|
+
*/
|
|
779
|
+
var createEmptyAssetMap = function createEmptyAssetMap() {
|
|
780
|
+
return {
|
|
781
|
+
js: {
|
|
782
|
+
sync: [],
|
|
783
|
+
async: []
|
|
784
|
+
},
|
|
785
|
+
css: {
|
|
786
|
+
sync: [],
|
|
787
|
+
async: []
|
|
788
|
+
}
|
|
789
|
+
};
|
|
790
|
+
};
|
|
791
|
+
/**
|
|
792
|
+
* Tracks an asset in the preload map with deduplication
|
|
793
|
+
* @param map - The preload map to update
|
|
794
|
+
* @param key - The module key to track under
|
|
795
|
+
* @param fileName - The asset filename to track
|
|
796
|
+
* @param isAsync - Whether the asset is loaded async
|
|
797
|
+
* @param type - The asset type ('js' or 'css')
|
|
798
|
+
*/
|
|
799
|
+
var trackAsset = function trackAsset(map, key, fileName, isAsync, type) {
|
|
800
|
+
if (!map[key]) {
|
|
801
|
+
map[key] = createEmptyAssetMap();
|
|
802
|
+
}
|
|
803
|
+
var target = isAsync ? map[key][type].async : map[key][type].sync;
|
|
804
|
+
if (!target.includes(fileName)) {
|
|
805
|
+
target.push(fileName);
|
|
806
|
+
}
|
|
807
|
+
};
|
|
808
|
+
/**
|
|
809
|
+
* Checks if a file is a CSS file by extension
|
|
810
|
+
* @param fileName - The filename to check
|
|
811
|
+
* @returns True if file has a CSS extension (.css, .scss, .less)
|
|
812
|
+
*/
|
|
813
|
+
var isCSSFile = function isCSSFile(fileName) {
|
|
814
|
+
return fileName.endsWith('.css') || fileName.endsWith('.scss') || fileName.endsWith('.less');
|
|
815
|
+
};
|
|
816
|
+
/**
|
|
817
|
+
* Collects all CSS assets from the bundle
|
|
818
|
+
* @param bundle - The Rollup output bundle
|
|
819
|
+
* @returns Set of CSS asset filenames
|
|
820
|
+
*/
|
|
821
|
+
var collectCssAssets = function collectCssAssets(bundle) {
|
|
822
|
+
var cssAssets = new Set();
|
|
823
|
+
for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
|
|
824
|
+
var _Object$entries$_i = _Object$entries[_i],
|
|
825
|
+
fileName = _Object$entries$_i[0],
|
|
826
|
+
fileData = _Object$entries$_i[1];
|
|
827
|
+
if (fileData.type === 'asset' && isCSSFile(fileName)) {
|
|
828
|
+
cssAssets.add(fileName);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
return cssAssets;
|
|
832
|
+
};
|
|
833
|
+
/**
|
|
834
|
+
* Processes module assets and tracks them in the files map
|
|
835
|
+
* @param bundle - The Rollup output bundle
|
|
836
|
+
* @param filesMap - The preload map to populate
|
|
837
|
+
* @param moduleMatcher - Function that matches module paths to keys
|
|
838
|
+
*/
|
|
839
|
+
var processModuleAssets = function processModuleAssets(bundle, filesMap, moduleMatcher) {
|
|
840
|
+
for (var _i2 = 0, _Object$entries2 = Object.entries(bundle); _i2 < _Object$entries2.length; _i2++) {
|
|
841
|
+
var _Object$entries2$_i = _Object$entries2[_i2],
|
|
842
|
+
fileName = _Object$entries2$_i[0],
|
|
843
|
+
fileData = _Object$entries2$_i[1];
|
|
844
|
+
if (fileData.type !== 'chunk') continue;
|
|
845
|
+
if (!fileData.modules) continue;
|
|
846
|
+
for (var _i3 = 0, _Object$keys = Object.keys(fileData.modules); _i3 < _Object$keys.length; _i3++) {
|
|
847
|
+
var modulePath = _Object$keys[_i3];
|
|
848
|
+
var matchKey = moduleMatcher(modulePath);
|
|
849
|
+
if (!matchKey) continue;
|
|
850
|
+
// Track main JS chunk
|
|
851
|
+
trackAsset(filesMap, matchKey, fileName, false, 'js');
|
|
852
|
+
// Handle dynamic imports
|
|
853
|
+
if (fileData.dynamicImports) {
|
|
854
|
+
for (var _iterator = _createForOfIteratorHelperLoose(fileData.dynamicImports), _step; !(_step = _iterator()).done;) {
|
|
855
|
+
var dynamicImport = _step.value;
|
|
856
|
+
var importData = bundle[dynamicImport];
|
|
857
|
+
if (!importData) continue;
|
|
858
|
+
var isCss = isCSSFile(dynamicImport);
|
|
859
|
+
trackAsset(filesMap, matchKey, dynamicImport, true, isCss ? 'css' : 'js');
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
/**
|
|
866
|
+
* Deduplicates assets in the files map
|
|
867
|
+
* @param filesMap - The preload map to deduplicate
|
|
868
|
+
* @returns New deduplicated preload map
|
|
869
|
+
*/
|
|
870
|
+
var deduplicateAssets = function deduplicateAssets(filesMap) {
|
|
871
|
+
var result = {};
|
|
872
|
+
for (var _i4 = 0, _Object$entries3 = Object.entries(filesMap); _i4 < _Object$entries3.length; _i4++) {
|
|
873
|
+
var _Object$entries3$_i = _Object$entries3[_i4],
|
|
874
|
+
key = _Object$entries3$_i[0],
|
|
875
|
+
assetMaps = _Object$entries3$_i[1];
|
|
876
|
+
result[key] = createEmptyAssetMap();
|
|
877
|
+
for (var _i5 = 0, _ASSET_TYPES = ASSET_TYPES; _i5 < _ASSET_TYPES.length; _i5++) {
|
|
878
|
+
var type = _ASSET_TYPES[_i5];
|
|
879
|
+
for (var _i6 = 0, _LOAD_TIMINGS = LOAD_TIMINGS; _i6 < _LOAD_TIMINGS.length; _i6++) {
|
|
880
|
+
var timing = _LOAD_TIMINGS[_i6];
|
|
881
|
+
result[key][type][timing] = Array.from(new Set(assetMaps[type][timing]));
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
return result;
|
|
886
|
+
};
|
|
887
|
+
/**
|
|
888
|
+
* Builds a mapping between module files and their share keys
|
|
889
|
+
* @param shareKeys - Set of share keys to map
|
|
890
|
+
* @param resolveFn - Function to resolve module paths
|
|
891
|
+
* @returns Map of file paths to their corresponding share keys
|
|
892
|
+
*/
|
|
893
|
+
var buildFileToShareKeyMap = function buildFileToShareKeyMap(shareKeys, resolveFn) {
|
|
894
|
+
try {
|
|
895
|
+
var fileToShareKey = new Map();
|
|
896
|
+
return Promise.resolve(Promise.all(Array.from(shareKeys).map(function (shareKey) {
|
|
897
|
+
return resolveFn(getPreBuildLibImportId(shareKey)).then(function (resolution) {
|
|
898
|
+
var _resolution$id;
|
|
899
|
+
return {
|
|
900
|
+
shareKey: shareKey,
|
|
901
|
+
file: resolution == null || (_resolution$id = resolution.id) == null ? void 0 : _resolution$id.split('?')[0]
|
|
902
|
+
};
|
|
903
|
+
})["catch"](function () {
|
|
904
|
+
return null;
|
|
905
|
+
});
|
|
906
|
+
}))).then(function (resolutions) {
|
|
907
|
+
for (var _iterator2 = _createForOfIteratorHelperLoose(resolutions), _step2; !(_step2 = _iterator2()).done;) {
|
|
908
|
+
var resolution = _step2.value;
|
|
909
|
+
if (resolution != null && resolution.file) {
|
|
910
|
+
fileToShareKey.set(resolution.file, resolution.shareKey);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
return fileToShareKey;
|
|
914
|
+
});
|
|
915
|
+
} catch (e) {
|
|
916
|
+
return Promise.reject(e);
|
|
917
|
+
}
|
|
918
|
+
};
|
|
919
|
+
|
|
760
920
|
var Manifest = function Manifest() {
|
|
761
921
|
var mfOptions = getNormalizeModuleFederationOptions();
|
|
762
922
|
var name = mfOptions.name,
|
|
@@ -768,21 +928,43 @@
|
|
|
768
928
|
mfManifestName = 'mf-manifest.json';
|
|
769
929
|
}
|
|
770
930
|
if (typeof manifestOptions !== 'boolean') {
|
|
771
|
-
mfManifestName =
|
|
931
|
+
mfManifestName = path__namespace.join((manifestOptions == null ? void 0 : manifestOptions.filePath) || '', (manifestOptions == null ? void 0 : manifestOptions.fileName) || '');
|
|
772
932
|
}
|
|
773
|
-
var extensions;
|
|
774
933
|
var root;
|
|
775
934
|
var remoteEntryFile;
|
|
776
935
|
var publicPath;
|
|
777
936
|
var _command;
|
|
778
937
|
var _originalConfigBase;
|
|
779
938
|
var viteConfig;
|
|
939
|
+
/**
|
|
940
|
+
* Adds global CSS assets to all module exports
|
|
941
|
+
* @param filesMap - The preload map to update
|
|
942
|
+
* @param cssAssets - Set of CSS asset filenames to add
|
|
943
|
+
*/
|
|
944
|
+
var addCssAssetsToAllExports = function addCssAssetsToAllExports(filesMap, cssAssets) {
|
|
945
|
+
Object.keys(filesMap).forEach(function (key) {
|
|
946
|
+
cssAssets.forEach(function (cssAsset) {
|
|
947
|
+
trackAsset(filesMap, key, cssAsset, false, 'css');
|
|
948
|
+
});
|
|
949
|
+
});
|
|
950
|
+
};
|
|
780
951
|
return [{
|
|
781
952
|
name: 'module-federation-manifest',
|
|
782
953
|
apply: 'serve',
|
|
954
|
+
/**
|
|
955
|
+
* Stores resolved Vite config for later use
|
|
956
|
+
*/
|
|
957
|
+
/**
|
|
958
|
+
* Finalizes configuration after all plugins are resolved
|
|
959
|
+
* @param config - Fully resolved Vite config
|
|
960
|
+
*/
|
|
783
961
|
configResolved: function configResolved(config) {
|
|
784
962
|
viteConfig = config;
|
|
785
963
|
},
|
|
964
|
+
/**
|
|
965
|
+
* Configures dev server middleware to handle manifest requests
|
|
966
|
+
* @param server - Vite dev server instance
|
|
967
|
+
*/
|
|
786
968
|
configureServer: function configureServer(server) {
|
|
787
969
|
server.middlewares.use(function (req, res, next) {
|
|
788
970
|
var _req$url;
|
|
@@ -830,137 +1012,85 @@
|
|
|
830
1012
|
}, {
|
|
831
1013
|
name: 'module-federation-manifest',
|
|
832
1014
|
enforce: 'post',
|
|
1015
|
+
/**
|
|
1016
|
+
* Initial plugin configuration
|
|
1017
|
+
* @param config - Vite config object
|
|
1018
|
+
* @param command - Current Vite command (serve/build)
|
|
1019
|
+
*/
|
|
833
1020
|
config: function config(_config, _ref) {
|
|
834
1021
|
var command = _ref.command;
|
|
835
1022
|
if (!_config.build) _config.build = {};
|
|
836
|
-
if (!_config.build.manifest)
|
|
1023
|
+
if (!_config.build.manifest) {
|
|
1024
|
+
_config.build.manifest = _config.build.manifest || !!manifestOptions;
|
|
1025
|
+
}
|
|
837
1026
|
_command = command;
|
|
838
1027
|
_originalConfigBase = _config.base;
|
|
839
1028
|
},
|
|
840
1029
|
configResolved: function configResolved(config) {
|
|
841
1030
|
root = config.root;
|
|
842
|
-
extensions = config.resolve.extensions || ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json'];
|
|
843
1031
|
var base = config.base;
|
|
844
1032
|
if (_command === 'serve') {
|
|
845
1033
|
base = (config.server.origin || '') + config.base;
|
|
846
1034
|
}
|
|
847
1035
|
publicPath = _originalConfigBase === '' ? 'auto' : base ? base.replace(/\/?$/, '/') : 'auto';
|
|
848
1036
|
},
|
|
1037
|
+
/**
|
|
1038
|
+
* Generates the module federation manifest file
|
|
1039
|
+
* @param options - Rollup output options
|
|
1040
|
+
* @param bundle - Generated bundle assets
|
|
1041
|
+
*/
|
|
849
1042
|
generateBundle: function generateBundle(options, bundle) {
|
|
850
1043
|
try {
|
|
851
1044
|
var _this = this;
|
|
852
|
-
// 递归查找模块的同步导入文件
|
|
853
|
-
var _findSynchronousImports = function findSynchronousImports(fileName, array) {
|
|
854
|
-
var fileData = bundle[fileName];
|
|
855
|
-
if (fileData && fileData.type === 'chunk') {
|
|
856
|
-
array.push(fileName); // 将当前文件加入预加载列表
|
|
857
|
-
// 遍历该文件的同步导入文件
|
|
858
|
-
fileData.imports.forEach(function (importedFile) {
|
|
859
|
-
if (array.indexOf(importedFile) === -1) {
|
|
860
|
-
_findSynchronousImports(importedFile, array); // 递归查找同步导入的文件
|
|
861
|
-
}
|
|
862
|
-
});
|
|
863
|
-
}
|
|
864
|
-
};
|
|
865
1045
|
if (!mfManifestName) return Promise.resolve();
|
|
866
|
-
var
|
|
867
|
-
|
|
868
|
-
}); // 获取你提供的 moduleIds
|
|
869
|
-
var filesContainingModules = {};
|
|
870
|
-
// 帮助函数:检查模块路径是否匹配
|
|
871
|
-
var isModuleMatched = function isModuleMatched(relativeModulePath, preloadModule) {
|
|
872
|
-
// 先尝试直接匹配
|
|
873
|
-
if (relativeModulePath === preloadModule) return true;
|
|
874
|
-
// 如果 preloadModule 没有后缀,尝试添加可能的后缀进行匹配
|
|
875
|
-
for (var _iterator = _createForOfIteratorHelperLoose(extensions), _step; !(_step = _iterator()).done;) {
|
|
876
|
-
var ext = _step.value;
|
|
877
|
-
if (relativeModulePath === "" + preloadModule + ext) {
|
|
878
|
-
return true;
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
return false;
|
|
882
|
-
};
|
|
883
|
-
// 遍历打包生成的每个文件
|
|
1046
|
+
var filesMap = {};
|
|
1047
|
+
// First pass: Find remoteEntry file
|
|
884
1048
|
for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
|
|
885
1049
|
var _Object$entries$_i = _Object$entries[_i],
|
|
886
|
-
|
|
1050
|
+
_ = _Object$entries$_i[0],
|
|
887
1051
|
fileData = _Object$entries$_i[1];
|
|
888
1052
|
if (mfOptions.filename.replace(/[\[\]]/g, '_').replace(/\.[^/.]+$/, '') === fileData.name || fileData.name === 'remoteEntry') {
|
|
889
1053
|
remoteEntryFile = fileData.fileName;
|
|
890
|
-
|
|
891
|
-
if (fileData.type === 'chunk') {
|
|
892
|
-
// 遍历该文件的所有模块
|
|
893
|
-
for (var _i2 = 0, _Object$keys = Object.keys(fileData.modules); _i2 < _Object$keys.length; _i2++) {
|
|
894
|
-
var modulePath = _Object$keys[_i2];
|
|
895
|
-
// 将绝对路径转换为相对于 Vite root 的相对路径
|
|
896
|
-
var relativeModulePath = path.relative(root, modulePath);
|
|
897
|
-
// 检查模块是否在 preloadModules 列表中
|
|
898
|
-
for (var _iterator2 = _createForOfIteratorHelperLoose(exposesModules), _step2; !(_step2 = _iterator2()).done;) {
|
|
899
|
-
var preloadModule = _step2.value;
|
|
900
|
-
var formatPreloadModule = preloadModule.replace('./', '');
|
|
901
|
-
if (isModuleMatched(relativeModulePath, formatPreloadModule)) {
|
|
902
|
-
var _filesContainingModul;
|
|
903
|
-
if (!filesContainingModules[preloadModule]) {
|
|
904
|
-
filesContainingModules[preloadModule] = {
|
|
905
|
-
sync: [],
|
|
906
|
-
async: []
|
|
907
|
-
};
|
|
908
|
-
}
|
|
909
|
-
console.log(Object.keys(fileData.modules));
|
|
910
|
-
filesContainingModules[preloadModule].sync.push(fileName);
|
|
911
|
-
(_filesContainingModul = filesContainingModules[preloadModule].async).push.apply(_filesContainingModul, fileData.dynamicImports || []);
|
|
912
|
-
_findSynchronousImports(fileName, filesContainingModules[preloadModule].sync);
|
|
913
|
-
break; // 如果找到匹配,跳出循环
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
}
|
|
1054
|
+
break; // We can break early since we only need to find remoteEntry once
|
|
917
1055
|
}
|
|
918
1056
|
}
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
var _Object$entries2$_i = _Object$entries2[_i3],
|
|
933
|
-
_fileName = _Object$entries2$_i[0],
|
|
934
|
-
_fileData = _Object$entries2$_i[1];
|
|
935
|
-
if (_fileData.type === 'chunk') {
|
|
936
|
-
// 遍历该文件的所有模块
|
|
937
|
-
for (var _i4 = 0, _Object$keys2 = Object.keys(_fileData.modules); _i4 < _Object$keys2.length; _i4++) {
|
|
938
|
-
var _modulePath = _Object$keys2[_i4];
|
|
939
|
-
var sharedKey = fileToShareKey[_modulePath];
|
|
940
|
-
if (sharedKey) {
|
|
941
|
-
var _filesContainingModul2;
|
|
942
|
-
if (!filesContainingModules[sharedKey]) {
|
|
943
|
-
filesContainingModules[sharedKey] = {
|
|
944
|
-
sync: [],
|
|
945
|
-
async: []
|
|
946
|
-
};
|
|
947
|
-
}
|
|
948
|
-
filesContainingModules[sharedKey].sync.push(_fileName);
|
|
949
|
-
(_filesContainingModul2 = filesContainingModules[sharedKey].async).push.apply(_filesContainingModul2, _fileData.dynamicImports || []);
|
|
950
|
-
_findSynchronousImports(_fileName, filesContainingModules[sharedKey].sync);
|
|
951
|
-
break; // 如果找到匹配,跳出循环
|
|
952
|
-
}
|
|
953
|
-
}
|
|
1057
|
+
// Second pass: Collect all CSS assets
|
|
1058
|
+
var allCssAssets = collectCssAssets(bundle);
|
|
1059
|
+
var exposesModules = Object.keys(mfOptions.exposes).map(function (item) {
|
|
1060
|
+
return mfOptions.exposes[item]["import"];
|
|
1061
|
+
});
|
|
1062
|
+
// Process exposed modules
|
|
1063
|
+
processModuleAssets(bundle, filesMap, function (modulePath) {
|
|
1064
|
+
var absoluteModulePath = path__namespace.resolve(root, modulePath);
|
|
1065
|
+
return exposesModules.find(function (exposeModule) {
|
|
1066
|
+
var exposePath = path__namespace.resolve(root, exposeModule);
|
|
1067
|
+
// First try exact path match
|
|
1068
|
+
if (absoluteModulePath === exposePath) {
|
|
1069
|
+
return true;
|
|
954
1070
|
}
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1071
|
+
// Then try path match without known extensions
|
|
1072
|
+
var getPathWithoutKnownExt = function getPathWithoutKnownExt(filePath) {
|
|
1073
|
+
var ext = path__namespace.extname(filePath);
|
|
1074
|
+
return JS_EXTENSIONS.includes(ext) ? path__namespace.join(path__namespace.dirname(filePath), path__namespace.basename(filePath, ext)) : filePath;
|
|
1075
|
+
};
|
|
1076
|
+
var modulePathNoExt = getPathWithoutKnownExt(absoluteModulePath);
|
|
1077
|
+
var exposePathNoExt = getPathWithoutKnownExt(exposePath);
|
|
1078
|
+
return modulePathNoExt === exposePathNoExt;
|
|
1079
|
+
});
|
|
1080
|
+
});
|
|
1081
|
+
// Process shared modules
|
|
1082
|
+
return Promise.resolve(buildFileToShareKeyMap(getUsedShares(), _this.resolve.bind(_this))).then(function (fileToShareKey) {
|
|
1083
|
+
processModuleAssets(bundle, filesMap, function (modulePath) {
|
|
1084
|
+
return fileToShareKey.get(modulePath);
|
|
959
1085
|
});
|
|
1086
|
+
// Add all CSS assets to every export
|
|
1087
|
+
addCssAssetsToAllExports(filesMap, allCssAssets);
|
|
1088
|
+
// Final deduplication of all assets
|
|
1089
|
+
filesMap = deduplicateAssets(filesMap);
|
|
960
1090
|
_this.emitFile({
|
|
961
1091
|
type: 'asset',
|
|
962
1092
|
fileName: mfManifestName,
|
|
963
|
-
source: JSON.stringify(generateMFManifest(
|
|
1093
|
+
source: JSON.stringify(generateMFManifest(filesMap))
|
|
964
1094
|
});
|
|
965
1095
|
});
|
|
966
1096
|
} catch (e) {
|
|
@@ -968,6 +1098,11 @@
|
|
|
968
1098
|
}
|
|
969
1099
|
}
|
|
970
1100
|
}];
|
|
1101
|
+
/**
|
|
1102
|
+
* Generates the final manifest JSON structure
|
|
1103
|
+
* @param preloadMap - Map of module assets to include
|
|
1104
|
+
* @returns Complete manifest object
|
|
1105
|
+
*/
|
|
971
1106
|
function generateMFManifest(preloadMap) {
|
|
972
1107
|
var options = getNormalizeModuleFederationOptions();
|
|
973
1108
|
var name = options.name;
|
|
@@ -976,23 +1111,23 @@
|
|
|
976
1111
|
path: '',
|
|
977
1112
|
type: 'module'
|
|
978
1113
|
};
|
|
979
|
-
|
|
980
|
-
var
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
1114
|
+
// Process remotes
|
|
1115
|
+
var remotes = Array.from(Object.entries(getUsedRemotesMap())).flatMap(function (_ref2) {
|
|
1116
|
+
var remoteKey = _ref2[0],
|
|
1117
|
+
modules = _ref2[1];
|
|
1118
|
+
return Array.from(modules).map(function (moduleKey) {
|
|
1119
|
+
return {
|
|
985
1120
|
federationContainerName: options.remotes[remoteKey].entry,
|
|
986
1121
|
moduleName: moduleKey.replace(remoteKey, '').replace('/', ''),
|
|
987
1122
|
alias: remoteKey,
|
|
988
1123
|
entry: '*'
|
|
989
|
-
}
|
|
1124
|
+
};
|
|
990
1125
|
});
|
|
991
1126
|
});
|
|
992
|
-
//
|
|
1127
|
+
// Process shared dependencies
|
|
993
1128
|
var shared = Array.from(getUsedShares()).map(function (shareKey) {
|
|
994
|
-
var _preloadMap$shareKey, _preloadMap$shareKey2;
|
|
995
1129
|
var shareItem = getNormalizeShareItem(shareKey);
|
|
1130
|
+
var assets = preloadMap[shareKey] || createEmptyAssetMap();
|
|
996
1131
|
return {
|
|
997
1132
|
id: name + ":" + shareKey,
|
|
998
1133
|
name: shareKey,
|
|
@@ -1000,42 +1135,40 @@
|
|
|
1000
1135
|
requiredVersion: shareItem.shareConfig.requiredVersion,
|
|
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
|
-
async:
|
|
1008
|
-
sync:
|
|
1142
|
+
async: assets.css.async,
|
|
1143
|
+
sync: assets.css.sync
|
|
1009
1144
|
}
|
|
1010
1145
|
}
|
|
1011
1146
|
};
|
|
1012
|
-
}).filter(
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
// assets(.css, .jpg, .svg等)其他资源, 不重要, 暂未处理
|
|
1147
|
+
}).filter(Boolean);
|
|
1148
|
+
// Process exposed modules
|
|
1149
|
+
var exposes = Object.entries(options.exposes).map(function (_ref3) {
|
|
1150
|
+
var key = _ref3[0],
|
|
1151
|
+
value = _ref3[1];
|
|
1018
1152
|
var formatKey = key.replace('./', '');
|
|
1019
|
-
var sourceFile =
|
|
1153
|
+
var sourceFile = value["import"];
|
|
1154
|
+
var assets = preloadMap[sourceFile] || createEmptyAssetMap();
|
|
1020
1155
|
return {
|
|
1021
|
-
id: name +
|
|
1156
|
+
id: name + ":" + formatKey,
|
|
1022
1157
|
name: formatKey,
|
|
1023
1158
|
assets: {
|
|
1024
1159
|
js: {
|
|
1025
|
-
async:
|
|
1026
|
-
sync:
|
|
1160
|
+
async: assets.js.async,
|
|
1161
|
+
sync: assets.js.sync
|
|
1027
1162
|
},
|
|
1028
1163
|
css: {
|
|
1029
|
-
|
|
1030
|
-
|
|
1164
|
+
async: assets.css.async,
|
|
1165
|
+
sync: assets.css.sync
|
|
1031
1166
|
}
|
|
1032
1167
|
},
|
|
1033
1168
|
path: key
|
|
1034
1169
|
};
|
|
1035
|
-
}).filter(
|
|
1036
|
-
|
|
1037
|
-
}); // Filter out any null values
|
|
1038
|
-
var result = {
|
|
1170
|
+
}).filter(Boolean);
|
|
1171
|
+
return {
|
|
1039
1172
|
id: name,
|
|
1040
1173
|
name: name,
|
|
1041
1174
|
metaData: _extends({
|
|
@@ -1050,8 +1183,6 @@
|
|
|
1050
1183
|
types: {
|
|
1051
1184
|
path: '',
|
|
1052
1185
|
name: ''
|
|
1053
|
-
// "zip": "@mf-types.zip",
|
|
1054
|
-
// "api": "@mf-types.d.ts"
|
|
1055
1186
|
},
|
|
1056
1187
|
globalName: name,
|
|
1057
1188
|
pluginVersion: '0.2.5'
|
|
@@ -1064,7 +1195,6 @@
|
|
|
1064
1195
|
remotes: remotes,
|
|
1065
1196
|
exposes: exposes
|
|
1066
1197
|
};
|
|
1067
|
-
return result;
|
|
1068
1198
|
}
|
|
1069
1199
|
};
|
|
1070
1200
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|