ice-lab / icestark

:tiger: Micro Frontends solution for large application(面向大型应用的微前端解决方案),站点国内镜像:https://icestark.gitee.io
https://micro-frontends.ice.work
MIT License
2.04k stars 173 forks source link

icestark 的2个问题 #156

Closed locknono closed 3 years ago

locknono commented 4 years ago

Do you want to request a feature or report a bug? bug What is the current behavior?

第一个问题

/pacakges/icestark-sandbox/src/index.ts

createProxySandbox(){
 ...
  get(target: Window, p: PropertyKey): any {
      ...
        if (targetValue) {
          // case of addEventListener, removeEventListener, setTimeout, setInterval setted in sandbox
          return targetValue;
        } else {
          const value = originalWindow[p];
          if (isWindowFunction(value)) {
            // fix Illegal invocation
            return value.bind(originalWindow);
          } else {
            // case of window.clientWidth、new window.Object()
            return value;
          }
        }
      }
}

这里应该判断 targetValue !== undefined, 否则 multiMode 下赋 falsy 值会导致出乎意料的结果, 比如window.foo = 0

第二个问题

/pacakges/icestark-module/src/modules.tsx

  componentDidUpdate(prevProps) {
    if (prevProps.moduleInfo !== this.props.moduleInfo || prevProps.moduleName !== this.props.moduleName) {
      this.mountModule();
    }
  }

moduleInfo是个对象,希望能深比较一下,否则传个引用不一样的值每次都会更新

ClarkXia commented 4 years ago

关于第二点可以在使用 MicroModule 的组件层面进行控制,如果每次都构造新的对象作为 props 属性,那发生 update 是符合预期的,而默认仅会做 PureComponent 的实现

locknono commented 4 years ago

@ClarkXia 重新描述下问题,微模块还会接受其他属性,但是在didupdate时只比较了moduleInfo和moduleName,其他属性的变化不会引起微模块更新,期望的效果是其他属性的变化也能引起组件更新。

maoxiaoke commented 3 years ago

@locknono 第二个问题 https://github.com/ice-lab/icestark/blob/master/packages/icestark-module/src/MicroModule.tsx#L48 已经对 moduleInfo 的属性进行了浅比较