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