Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用模块联邦共享组件,子应用的window指向父应用的window #1003

Open
Cybbin opened this issue Dec 10, 2023 · 6 comments
Open
Assignees
Labels
bug Something isn't working TODO

Comments

@Cybbin
Copy link

Cybbin commented Dec 10, 2023

问题描述

  1. 接入webpack模块联邦共享组件,子应用的window指向父应用的window;
  2. 子应用中暴露出一个复用组件,父子应用同时使用这个组件,它的依赖文件中使用window均指向父应用,期望是父应用调用时指向父组件的window,子组件调用时指向子组件window;

复现步骤

  1. 启动项目 vue1、vue2;
  2. 访问主应用 http://localhost:8080
  3. 分别点击父子应用的点击按钮,均显示为父应用的window;

上传截图

image

复现仓库

https://github.com/Cybbin/microapp-test

环境信息

  • micro-app版本:1.0.0-rc.2
  • 主应用前端框架&版本:vue2.7.15
  • 子应用前端框架&版本:vue2.7.15
  • 构建工具&版本:vue-cli
@bailicangdu bailicangdu moved this to Todo in 1.0.0-rc.3 Dec 11, 2023
@bailicangdu bailicangdu self-assigned this Dec 11, 2023
@Cybbin
Copy link
Author

Cybbin commented Dec 13, 2023

修改为iframe沙箱模式可以解决这个问题,但又引出了另外一个问题:项目中使用svg-sprite-loader,在iframe沙箱模式下子应用的document指向子应用document,document.body又指向父应用的body,导致使用svg图标时会重复加载子应用,代码已经提交同个仓库,在vue1开启iframe模式可复现。

image

@bailicangdu bailicangdu moved this from Todo to In Progress in 1.0.0-rc.3 Dec 18, 2023
@bailicangdu bailicangdu added the bug Something isn't working label Dec 18, 2023
@Cybbin
Copy link
Author

Cybbin commented Dec 18, 2023

关于window指向问题,这边定位到问题了:

  1. 在父应用加载子应用模块联邦导出的组件js后,会在父应用全局变量里注入 webpackChunkvue2 变量;
  2. 通过micro-app加载子应用时,这个变量 webpackChunkvue2 会注入到子应用的 window
  3. 在子应用加载同样导出的组件时,会从 webpackChunkvue2 上判断有无加载过,因为不会去重复加载,直接取父应用加载过的组件,所以这个组件内及其依赖的执行环境上下文就是父应用;

这里的问题是:子应用的 window 并没有严格按照沙箱去初始化,父应用在没加载子应用前赋值到 window 上的变量,在子应用仍然拿得到。

目前的解决办法是,在子应用的 index.html 上清空从父应用继承下来的变量;

<script>
window.webpackChunkvue2 = undefined;
</script>

@Cybbin
Copy link
Author

Cybbin commented Dec 21, 2023

@bailicangdu ,请问下关于这个window的指向问题,是算bug还是feature

@bailicangdu
Copy link
Contributor

@bailicangdu ,请问下关于这个window的指向问题,是算bug还是feature

with沙箱实现机制导致子应用没有的全局变量会兜底到浏览器window上查找

@Cybbin
Copy link
Author

Cybbin commented Dec 26, 2023

可以对兜底逻辑做拦截吗?感觉这样没有严格沙箱化

@bailicangdu
Copy link
Contributor

bailicangdu commented Dec 28, 2023

可以对兜底逻辑做拦截吗?感觉这样没有严格沙箱化

可以通过插件系统针对特定变量进行严格隔离,例如:

microApp.start({
  plugins: {
    global: [{
        scopeProperties: ['webpackChunkvue2']
     }]
   }
})

@bailicangdu bailicangdu moved this from In Progress to Release in 1.0.0-rc.3 Jan 26, 2024
@bailicangdu bailicangdu moved this from Release to In Progress in 1.0.0-rc.3 Jan 26, 2024
@bailicangdu bailicangdu moved this from In Progress to Done in 1.0.0-rc.3 Jan 31, 2024
@bailicangdu bailicangdu moved this from Done to Release in 1.0.0-rc.3 Jan 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working TODO
Projects
None yet
Development

No branches or pull requests

2 participants