@@ -51,40 +51,49 @@ export const remoteProjects = [
5151export function generateRemotesConfig ( isDev = false ) {
5252 const remotes = { }
5353
54- remoteProjects . forEach ( ( project ) => {
54+ // 支持通过环境变量覆盖并添加/替换远程项目
55+ const projects = parseRemotesFromEnv ( )
56+
57+ // helper: 与 webpack.common.js 中 toMfeName 行为保持一致
58+ const toSafeName = ( name ) => {
59+ const raw = ( name || '' ) . toString ( ) . trim ( ) || 'app'
60+ const safe = raw . replace ( / [ ^ a - z A - Z 0 - 9 _ ] / g, '_' )
61+ return / ^ [ 0 - 9 ] / . test ( safe ) ? `app_${ safe } ` : safe
62+ }
63+
64+ projects . forEach ( ( project ) => {
5565 let url
5666
57- // 优先使用环境变量(支持开发和生产环境)
5867 if ( project . envKey && process . env [ project . envKey ] ) {
5968 url = process . env [ project . envKey ] . toString ( ) . trim ( )
6069 } else {
61- // 回退到默认配置
6270 url = isDev ? project . devUrl : project . prodPath
6371 }
6472
65- // 使用 promise 语法动态加载脚本并从 window 对象获取容器
66- // 这是因为 remotes 使用了 library: { type: 'window' } 配置
73+ const rawName = project . name
74+ const safeName = toSafeName ( rawName )
75+
76+ // 尝试多种 window 全局名(rawName / safeName),以兼容不同构建时的 container 名称
6777 const promiseCode = `promise new Promise((resolve, reject) => {
68- if (typeof window.${ project . name } !== 'undefined') {
69- return resolve(window.${ project . name } );
70- }
71- const script = document.createElement('script');
72- script.src = '${ url } ';
73- script.async = true;
74- script.onload = () => {
75- if (typeof window.${ project . name } !== 'undefined') {
76- resolve(window.${ project . name } );
77- } else {
78- reject(new Error('Container ${ project . name } not found on window after loading script'));
78+ try {
79+ if (typeof window['${ rawName } '] !== 'undefined') return resolve(window['${ rawName } '])
80+ if (typeof window['${ safeName } '] !== 'undefined') return resolve(window['${ safeName } '])
81+ const script = document.createElement('script')
82+ script.src = '${ url } '
83+ script.async = true
84+ script.onload = () => {
85+ if (typeof window['${ rawName } '] !== 'undefined') return resolve(window['${ rawName } '])
86+ if (typeof window['${ safeName } '] !== 'undefined') return resolve(window['${ safeName } '])
87+ reject(new Error('Container ${ rawName } not found on window after loading script'))
7988 }
80- };
81- script.onerror = (error) => {
82- reject(new Error('Failed to load remote entry: ${ url } '));
83- };
84- document.head.appendChild(script);
89+ script.onerror = () => reject(new Error('Failed to load remote entry: ${ url } '))
90+ document.head.appendChild(script)
91+ } catch (err) {
92+ reject(err)
93+ }
8594 })`
8695
87- remotes [ project . name ] = promiseCode
96+ remotes [ rawName ] = promiseCode
8897 } )
8998
9099 return remotes
0 commit comments