alibaba / ice

🚀 ice.js: The Progressive App Framework Based On React(基于 React 的渐进式应用框架)
https://ice.work
MIT License
17.83k stars 2.09k forks source link

子应用异步调用 runApp,主应用报错 #4420

Closed GreyZhou closed 3 years ago

GreyZhou commented 3 years ago

What is the current behavior? 发生了什么?

子应用 src/app.tsx 中,异步执行 runApp 时,子应用本身无报错,但主应用会报错 [@ice/stark] microapp should export mount/unmout or register registerAppEnter/registerAppLeave.

image

What is the expected behavior? 期望的结果是什么?

子应用异步执行 runApp 不影响主应用注册子应用

Any additional comments? 相关环境信息?

ClarkXia commented 3 years ago

提供下 子应用 app.ts 逻辑,及 build.json 配置

GreyZhou commented 3 years ago

runApp 只要异步调用就能复现

setTimeout(() => {
  runApp(appConfig);
}, 0);

build.json

{
  "plugins": [
    "build-plugin-icestark",
    [
      "build-plugin-fusion",
      {
        "themePackage": "@alife/theme-10369"
      }
    ],
    [
      "build-plugin-moment-locales",
      {
        "locales": [
          "zh-cn"
        ]
      }
    ],
    "@ali/build-plugin-ice-def",
    "./build.plugin.js",
    "@ali/build-plugin-ice-def"
  ],
  "modeConfig": {
    "local": {
      "define": {
        "ENV": "development"
      },
      "vendor": false
    },
    "prod": {
      "define": {
        "ENV": "production"
      }
    }
  }
}
maoxiaoke commented 3 years ago

@GreyZhou 好的,我看看。另外,为啥 runApp 会需要异步调用?

GreyZhou commented 3 years ago

异步拉取一些配置之后,再 runApp 实例化

GreyZhou commented 3 years ago

除了 runApp,如果子应用可以允许后续扩展内部配置,感觉也可以解决我的问题

maoxiaoke commented 3 years ago

@GreyZhou 比如哪些配置?

GreyZhou commented 3 years ago

比如 routes 的拼接

maoxiaoke commented 3 years ago

@GreyZhou 完整微应用的 app.tsx 内容可以提供下吗?我这边没有复现

GreyZhou commented 3 years ago

后来我自己测试时候,仅用 setTimeout 包裹一下 runApp 就会报错,子应用单独运行是没问题的,应该不是 app.tsx 的原因,我在主应用 package.json 里找到这个

"resolutions": {
    "@ice/stark": "2.3.1-0"
  }
maoxiaoke commented 3 years ago

@GreyZhou 还是没有复现,你可以内网找一下我具体处理下~

GreyZhou commented 3 years ago

👌🏻

maoxiaoke commented 3 years ago

@GreyZhou 可以通过 定制运行时能力 或者 自定义导出的生命周期方法。

function mount () {
  setTimeout(() => runApp(appConfig), 0)
}

function unmount (props) {
  ReactDOM.unmountComponentAtNode(props.container);
}

建议通过 定制运行能力 来扩展 runApp 能力,而非异步调用。