qiankun框架实战总结:从微前端架构到跨应用通信的那些坑

树辰 Dev 前端 阅读 808
赞 113 收藏
二维码
手机扫码查看
反馈

qiankun框架实战总结

最近在项目中用了qiankun这个微前端框架,折腾了一阵子,总算有点心得。今天就来分享一下我在实际项目中的使用经验和踩坑经验。

我的写法,亲测靠谱

先说说最核心的部分,就是如何初始化和注册微应用。我一般这样处理:


import { registerMicroApps, start } from 'qiankun';

const apps = [
{
name: 'app1',
entry: '//jztheme.com/app1',
container: '#container',
activeRule: '/app1',
},
{
name: 'app2',
entry: '//jztheme.com/app2',
container: '#container',
activeRule: '/app2',
},
];

registerMicroApps(apps);

start();

这段代码看起来简单,但其实有几个关键点需要注意:

  • entry:这是微应用的入口地址,可以是绝对路径或相对路径。我建议用绝对路径,这样可以避免一些路径问题。
  • container:这是微应用挂载的容器,通常是一个DOM元素。我一般用一个全局的#container来统一管理。
  • activeRule:这是路由规则,用于匹配当前页面是否需要加载该微应用。我一般用路径前缀来匹配,比如/app1

这种写法的好处是配置简单明了,不容易出错。而且,如果将来需要添加或修改微应用,只需要修改apps数组即可。

这几种错误写法,别再踩坑了

当然,在实际开发过程中,我也踩了不少坑。下面是一些常见的错误写法,希望大家能避开:

错误1:直接使用相对路径


const apps = [
{
name: 'app1',
entry: './app1',
container: '#container',
activeRule: '/app1',
},
];

这种写法容易导致路径问题,特别是在多级目录结构下。建议大家尽量使用绝对路径。

错误2:没有正确配置publicPath


// webpack.config.js
module.exports = {
output: {
publicPath: '/',
},
};

如果你的微应用是通过webpack打包的,一定要正确配置publicPath。否则可能会导致资源加载失败。我之前就因为这个问题搞了半天,最后才发现是publicPath配置有问题。

错误3:忽略了sandbox配置


registerMicroApps(apps, {
sandbox: true,
});

默认情况下,qiankun会开启沙箱模式,防止微应用之间互相影响。但是有时候你可能不需要沙箱模式,或者需要自定义沙箱配置。这时候就需要显式地设置sandbox选项。忽略这个配置可能会导致一些奇怪的问题,比如样式冲突等。

实际项目中的坑

除了上面提到的一些常见错误,还有一些实际项目中遇到的坑。这些坑可能不会在文档中详细说明,但却是非常重要的。

跨域资源共享(CORS)问题

在微前端架构中,不同微应用可能部署在不同的域名下,这就涉及到跨域问题。为了解决这个问题,我一般会在后端配置CORS头,允许来自特定域名的请求。比如:


Access-Control-Allow-Origin: https://jztheme.com

另外,也可以在前端通过代理服务器来解决跨域问题。比如用nginx做反向代理:


server {
listen 80;
server_name jztheme.com;

location /app1 {
proxy_pass http://localhost:3000;
}

location /app2 {
proxy_pass http://localhost:4000;
}
}

这样就可以让微应用通过同一个域名访问到各自的后端服务。

样式冲突问题

微前端架构下,多个微应用共用同一个HTML文件,很容易出现样式冲突。为了解决这个问题,我一般会给每个微应用加上唯一的命名空间前缀。比如:


/* app1.css */
.app1-class {
color: red;
}

/* app2.css */
.app2-class {
color: blue;
}

这样可以有效避免样式冲突。当然,如果你有更复杂的样式需求,也可以考虑使用CSS模块化或者BEM命名规范。

数据共享问题

微前端架构下,主应用和微应用之间需要共享数据。我一般使用qiankun提供的initGlobalState方法来实现。比如:


import { initGlobalState } from 'qiankun';

const initialState = {
user: { name: 'John' },
};

const actions = initGlobalState(initialState);

// 在微应用中订阅状态变化
actions.onGlobalStateChange((state, prev) => {
console.log(state, prev);
});

// 修改全局状态
actions.setGlobalState({ user: { name: 'Jane' } });

这种方法可以方便地在主应用和微应用之间共享数据。但要注意,不要滥用全局状态,否则可能会导致状态管理变得复杂。

结尾

以上是我总结的qiankun框架的最佳实践和踩坑经验。希望对大家有所帮助。如果有更好的方案,欢迎在评论区交流。以后有机会我会继续分享更多关于微前端的经验。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论