公司网站备案网站名称有什么用,马鞍山人才网,东莞网站建设案例,宝塔wordpress ip访问微前端乾坤方案
了解乾坤
官方文档
介绍
qiankun 是一个基于 single-spa 的微前端实现库#xff0c;旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。
qiankun 的核心设计理念 #x1f944; 简单 由于主应用微应用都能做到技术栈无关#xff0c;qiankun …微前端乾坤方案了解乾坤官方文档介绍qiankun 是一个基于 single-spa 的微前端实现库旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。qiankun 的核心设计理念 简单由于主应用微应用都能做到技术栈无关qiankun 对于用户而言只是一个类似 jQuery 的库你需要调用几个 qiankun 的 API 即可完成应用的微前端改造。同时由于 qiankun 的 HTML entry 及沙箱的设计使得微应用的接入像使用 iframe 一样简单。 解耦/技术栈无关微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用而 qiankun 的诸多设计均是秉持这一原则如 HTML entry、沙箱、应用间通信等。这样才能确保微应用真正具备 独立开发、独立运行 的能力。特性基于 single-spa封装提供了更加开箱即用的 API。技术栈无关任意技术栈的应用均可 使用/接入不论是 React/Vue/Angular/JQuery 还是其他等框架。HTML Entry 接入方式让你接入微应用像使用 iframe 一样简单。样式隔离确保微应用之间样式互相不干扰。JS 沙箱确保微应用之间 全局变量/事件 不冲突。⚡️资源预加载在浏览器空闲时间预加载未打开的微应用资源加速微应用打开速度。umi 插件提供了 umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统。qiankun 在 single-spa 的基础上都增加了啥以下是 qiankun 提供的特性实现了子应用的加载在原有 single-spa 的JS Entry基础上再提供了HTML Entry样式和 JS 隔离更多的生命周期beforeMount,afterMount,beforeUnmount,afterUnmount子应用预加载umi 插件全局状态管理全局错误处理qiankun 的使用主应用0、安装 qiankun$ yarn add qiankun # 或者 npm i qiankun -S1、引入import { registerMicroApps, start } from qiankun;2-1、注册子应用并启动registerMicroApps([ { name: react app, // app name registered entry: //localhost:7100, container: #yourContainer, activeRule: /yourActiveRule, }, { name: vue app, entry: { scripts: [//localhost:7100/main.js] }, container: #yourContainer2, activeRule: /yourActiveRule2, }, ]); // 启动 qiankun start();备注自动注册模式当微应用信息注册完之后一旦浏览器的 url 发生变化便会自动触发 qiankun 的匹配逻辑所有activeRule规则匹配上的微应用就会被插入到指定的container中同时依次调用微应用暴露出的生命周期钩子。主应用不限技术栈只需要提供一个容器 DOM然后注册微应用并start即可。2-2、手动加载子应用如果微应用不是直接跟路由关联的时候你也可以选择手动加载微应用。import { loadMicroApp } from qiankun; loadMicroApp({ name: app, entry: //localhost:7100, container: #yourContainer, });子应用改造微应用不需要额外安装任何其他依赖即可接入到qiankun主应用。1、前提子应用的资源和接口的请求都在主域名发起所以会有跨域问题子应用必须做cors 设置。// webpack const { name } require(./package); module.exports { devServer: (config) { // 因为内部请求都是 fetch 来请求资源所以子应用必须允许跨域 config.headers { Access-Control-Allow-Origin: *, Access-Control-Allow-Credentials: true, Access-Control-Allow-Headers: X-Requested-With,Content-Type, Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS, Content-Type: application/json; charsetutf-8, }; return config; }, };2、生命周期改造微应用需要在应用的入口文件 (通常就是你配置的 webpack 的 entry js) 导出bootstrap、mount、unmount、update四个生命周期钩子以供主应用在适当的时机调用。具体操作可以参考下面示例步骤一在src目录新增public-path.js用于修改运行时的publicPath。if (window.__POWERED_BY_QIANKUN__) { __webpack_public_path__ window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; }备注什么是运行时的 publicPath 运行时的publicPath和构建时的publicPath是不同的两者不能等价替代。步骤二修改入口文件主要改动引入public-path.jsexport生命周期函数将子应用路由的创建、实例的创建渲染挂载到mount函数上将实例的销毁挂载到unmount上// vue 2 // 入口文件 main.js 修改为了避免根 id #app 与其他的 DOM 冲突需要限制查找范围。 import ./public-path; import Vue from vue; import App from ./App.vue; import VueRouter from vue-router; import routes from ./router; import store from ./store; Vue.config.productionTip false; let router null; let instance null; function render(props { }) { const { container } props; router new VueRouter({ // histroy模式的路由需要设置base。app-vue 根据项目名称来定 base: window.__POWERED_BY_QIANKUN__ ? /app-vue/ : /, mode: history, // hash模式则不需要设置base routes, }); instance new Vue({ router, store, render: (h) h(App), }).$mount(container ? container.querySelector(#app) : #app); } // 独立运行时 if (!window.__POWERED_BY_QIANKUN__) { render(); } export async function bootstrap() { console.log([vue] vue app bootstraped); } export async function mount(props) { console.log([vue] props from main framework, props); render(props); } export async function unmount() { instance.$destroy(); instance.$el.innerHTML ; instance null; router null; }// react 16 // 以 create react app 生成的 react 16 项目为例搭配 react-router-dom 5.x。 // 入口文件 index.js 修改为了避免根 id #root 与其他的 DOM 冲突需要限制查找范围。 // 这里需要特别注意的是通过 ReactDOM.render 挂载子应用时需要保证每次子应用加载都应使用一个新的路由实例。 import ./public-path; import React from react; import ReactDOM from react-dom; import App from ./App; function render(props) { const { container } props; ReactDOM.render(App /, container ? container.querySelector(#root) : document.querySelector(#root)); } if (!window.__POWERED_BY_QIANKUN__) { render({ }); } export async function bootstrap() { console.log([react16] react app bootstraped); } export async function mount(props) { console.log([react16] props from main framework, props); render(props); } export async function unmount(props) { const { container } props; ReactDOM.unmountComponentAtNode(container ? container.querySelector(#root) : document.querySelector(#root)); }备注qiankun 基于 single-spa所以你可以在这里找到更多关于微应用生命周期相关的文档说明。无 webpack 等构建工具的应用接入方式请见这里注意点容器名修改index.html中项目初始化容器的根 id不要使用#app或#root避免与其他的项目冲突建议换成项目name的驼峰写法微应用建议使用history路由模式。路由模式为history时同时需要设置路由base值和它的activeRule是一样的vue:router new VueRouter({ mode: history, base: window.__POWERED_BY_QIANKUN__ ? /app-vue/ : /, });react:BrowserRouter basename{window.__POWERED_BY_QIANKUN__ ? /app-react : /}3、构建工具配置微应用分为有webpack构建和无webpack构建项目。注意qiankun v2 及以下版本只支持webpack并不支持vite下面以webpack为构建工具的微应用为例主要是指 Vue、React的配置说明配置点说明构建工具的配置主要有两个允许跨域打包成umd格式为什么要打包成umd格式呢是为了让qiankun拿到其export的生命周期函数。我们可以看下其打包后的app.js就知道了:配置示例微应用的打包工具需要增加如下配置react修改webpack配置安装插件rescripts/cli当然也可以选择其他的插件例如react-app-rewired。npm i -D rescripts/cli根目录新增.rescriptsrc.js// webpack const { name } require(./package); module.exports { webpack: (config) { config.output.library ${ name}-[name]; config.output.libraryTarget umd; // webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal config.output.jsonpFunction webpackJsonp_${ name}; config.output.globalObject window; return config; }, devServer: (_) { const config _; config.headers { Access-Control-Allow-Origin: *, }; config.historyApiFallback true; config.hot false; config.watchContentBase false; config.liveReload false; return config; }, };修改package.json- start: react-scripts start, start: rescripts start, - build: react-scripts build, build: rescripts build, - test: react-scripts test, test: rescripts test, - eject: react-scripts ejectvue// vue.config.js const { name } require(./package); module.exports { devServer: { headers: { Access-Control-Allow-Credentials: true, Access-Control-Allow-Origin: req.headers.origin || *, Access-Control-Allow-Headers: X-Requested-With,Content-Type, Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS, Content-Type: application/json; charsetutf-8, }, }, // 自定义webpack配置 configureWebpack: { output: { library: ${ name}-[name], // 微应用的包名这里与主应用中注册的微应用名称一致 libraryTarget: umd, // 把微应用打包成 umd 库格式可以在 AMD 或 CommonJS 的 require 访问。 // webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal jsonpFunction: webpackJsonp_${ name}, // webpack 用来异步加载 chunk 的 JSONP 函数。 }, }, };注意这个name默认从package.json获取可以自定义只要和父项目注册时的name保持一致即可。qiankun拿这三个生命周期是根据注册应用时你给的name值name不一致则会导致拿不到生命周期函数。webpack 不同版本的配置webpack v5:const packageName require(./package.json).name; module.exports { output: { library: ${ packageName}-[name], libraryTarget: umd, chunkLoadingGlobal: webpackJsonp_${ packageName}, }, };webpack v4:const packageName require(./package.json).name; module.exports { output: { library: ${ packageName}-[name], libraryTarget: umd, // webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal jsonpFunction: webpackJsonp_${ packageName}, }, };备注更多相关配置介绍可以查看 webpack 相关文档子项目开发的一些注意事项js 相关给 body 、 document 等绑定的事件请在 unmount 周期清除js 沙箱只劫持了window.addEventListener而使用了document.body.addEventListener或者document.body.onClick添加的事件并不会被沙箱移除会对其他的页面产生影响因此请在unmount生命周期清除绑定的事件。css 相关避免 css 污染组件内样式的css-scoped是必须的。对于一些插入到body的弹窗无法使用scoped请不要直接使用原class修改样式请添加自己的class来修改样式。.el-dialog { /* 不推荐使用组件原有的class */ } .my-el-dialog { /* 推荐使用自定义组件的class */ }谨慎使用 positionfixed在父项目中浮动定位未必准确应尽量避免使用确有相对于浏览器窗口定位需求可以用 position: sticky但是会有兼容性问题IE 不支持。如果定位使用的是 bottom 和 right则问题不大。还有个办法位置可以写成动态绑定 style 的形式:div :style{ top: isQiankun ? 10px : 0}/div静态资源 相关所有的资源图片/音视频等都应该放到 src 目录下不要放在 public 或者 static资源放src目录会经过webpack处理能统一注入publicPath。否则在主项目中会 404。参考vue-cli3 的官方文档介绍何时使用-public-文件夹第三方库 相关请给 axios 实例添加拦截器而不是 axios 对象后续会考虑子项目共享公共插件这时就需要避免公共插件的污染// 正确做法给 axios 实例添加拦截器 const instance axios.create(); instance.interceptors.request.use(function () { // ... }); // 错误用法直接给 axios 对象添加拦截器 axios.interceptors.request.use(function () { // ... });qiankun 功能介绍运行模式乾坤只有一种运行模式单例模式在微前端框架中子应用会随着主应用页面的打开和关闭反复的激活和销毁单例模式生命周期模式。单例模式子应用页面如果切走会调用unmount销毁子应用当前实例子应用页面如果切换回来,会调用mount渲染子应用新的实例。在单例式下改变url子应用的路由会发生跳转到对应路由。生命周期微应用需要在应用的入口文件导出bootstrap、mount、unmount、update四个生命周期钩子以供主应用在适当的时机调用。注意 qiankun 生命周期函数都必须要export暴露 qiankun 生命周期函数都必须是Promise函数使用async会返回一个 Promise 对象/** * bootstrap 只会在微应用初始化的时候调用一次下次微应用重新进入时会直接调用 mount 钩子不会再重复触发 bootstrap。 * 通常我们可以在这里做一些全局变量的初始化比如不会在 unmount 阶段被销毁的应用级别的缓存等。 */ export async function bootstrap() { console.log(app bootstraped); } /** * 应用每次进入都会调用 mount 方法通常我们在这里触发应用的渲染方法 */ export async function mount(props) { // ReactDOM.render(App /, props.container ? props.container.querySelector(#root) : document.getElementById(root)); console.log(app mount); } /** * 应用每次 切出/卸载 会调用的方法通常在这里我们会卸载微应用的应用实例 */ export async function unmount(props) { // ReactDOM.unmountComponentAtNode(props.container ? props.container.querySelector(#root) : document.getElementById(root)); console.log(app unmount); } /** * 可选生命周期钩子仅使用 loadMicroApp 方式加载微应用时生效 */ export async function update(props) { console.log(update props, props); }通讯方式项目之间的不要有太多的数据依赖毕竟项目还是要独立运行的。通信操作需要判断是否qiankun模式做兼容处理。props 通信如果父子应用都是vue项目通过props传递父项目的Vuex store可以实现响应式但假如子项目是不同的技术栈jQuery/react/angular这是就不能很好的监听到数据的变化了。注意vue 项目之间数据传递还是使用共享父组件的Vuex比较方便与其他技术栈的项目之间的通信使用 qiankun 提供的initGlobalState。通过 vuex/pinia 实现通信第一步在主应用中创建一个 store// src/store/index.ts const personModule { state: { id: 0, name: , age: 0, }, mutations: { setId(state: Object, id: number) { state.id id; }, setName(state: Object, name: string) { state.name name; }, setAge(state: Object, age: number) { state.age age; }, }, actions: { setId(context: Object, id: number) { context.commit(setId, id); }, setName(context: Object, name: string) { context.commit(setName, name); }, setAge(context: Object, age: number2025开年AI技术打得火热正在改变前端人的职业命运阿里云核心业务全部接入Agent体系字节跳动30%前端岗位要求大模型开发能力腾讯、京东、百度开放招聘技术岗80%与AI相关……大模型正在重构技术开发范式传统CRUD开发模式正在被AI原生应用取代最残忍的是业务面临转型领导要求用RAG优化知识库检索你不会带AI团队微调大模型要准备多少数据你不懂想转型大模型应用开发工程师等相关岗没项目实操经验……这不是技术焦虑而是职业生存危机曾经React、Vue等热门的开发框架已不再是就业的金钥匙。如果认为会调用API就是懂大模型、能进行二次开发那就大错特错了。制造、医疗、金融等各行业都在加速AI应用落地未来企业更看重能用AI大模型技术重构业务流的技术人。如今技术圈降薪裁员频频爆发传统岗位大批缩水相反AI相关技术岗疯狂扩招薪资逆势上涨150%大厂老板们甚至开出70-100W年薪挖掘AI大模型人才不出1年 “有AI项目开发经验”或将成为前端人投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘大模型目前在人工智能领域可以说正处于一种“炙手可热”的状态吸引了很多人的关注和兴趣也有很多新人小白想要学习入门大模型那么如何入门大模型呢下面给大家分享一份2025最新版的大模型学习路线帮助新人小白更系统、更快速的学习大模型2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享