Skip to content

Commit f09cc69

Browse files
author
ws-wangjg
committed
build: build vercel mfe
1 parent 497387b commit f09cc69

2 files changed

Lines changed: 31 additions & 23 deletions

File tree

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webpack/mfe.config.js

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,49 @@ export const remoteProjects = [
5151
export 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-zA-Z0-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

Comments
 (0)