目录
前置知识
一、无界微前端的优缺点
1.优点
2.缺点
二、微前端技术选型决策树
三、无界通讯
1、通过props方法
2、通过 bus 方法
3.通过 postmessage 方法
4.路由跳转
四、插件系统
1. html-loader 可以对子应 html 进行处理
2. jsIgnoresh和cssIgnores(子应用自己加载)
3. js-excludes 和 css-excludes 可以排除子应用特定的 js 和 css 加载
4. js-before-loaders、js-loader、js-after-loaders 可以方便的对子应用 js 进行自定义
5. css-before-loaders、css-loader、css-after-loaders 可以方便的对子应用 css 进行自定义
五、基础改造
1、主应用
2、子应用
(1)vue.config.js主要是为了解决本地调用的时候跨域问题
(2)main.js(以智能网关为例)
3、主应用接入无界组件
4、子应用其他改造
六、应用共享
七、使用wujie-polyfill插件
前置知识
一、无界微前端的优缺点
1.优点
1.预加载和预执行
预执行指的是在应用空闲的时候将子应用提前渲染出来exec:true
预加载所需要的静态资源提前从网络中加载到内存中(preloadApp:({name: ‘唯一标识’,exec:true}))
提升子应用打开的首屏时间
2、弹框对比iframe可以全屏显示
3.如果路由保持活性,则可以通过浏览器前进和回退回到之前的路由
2.缺点
1、兼容性风险:不兼容旧版浏览器(如IE11)
2、Shadow DOM导致元素选择器失效,因此 body 也要加上定位
如果需要从外部影响Shadow DOM内的样式,使用::part 而不是用/deep/或>>>
<!-- 子应用 -->
<div part="alert-box" >
新增定义
</div>
<!--主应用-->
wujie-app::part(alert-box) {
background: red;
}
二、微前端技术选型决策树
├─是否需要绝对安全隔离?
├─ 是 → iframe
└─ 否 → 是否需要IE兼容?
├─ 是 → qiankun
└─ 否 → 是否需要高性能组件级集成
├─ 是 → 无界微前端
└─ 否 → qiankun(综合生态考量)
三、无界通讯
1、通过props方法
<!-- 主应用 -->
<WujieVue
...
:props="$store.state.wujieProps"
></WujieVue>
// 子应用
window.$wujie.props.serverPath
// 法二:
//主应用main.js
const props = {
jump: (name, query) => {
router.push({ name, query });
},
parent_Window: window,
};
setupApp({
name: item.code /** 唯一性用户必须保证 */,
url: item.path /** 需要渲染的url */,
exec: true /** 预执行 */,
props /** 注入给子应用的属性 */,
...lifecycles,
degrade:false,//true则话,子应用会变成iframe
});
//子应用
window.$wujie.props.parent_Window
2、通过 bus 方法
// 子应用 App.vue
watch: {
$route() {
window.$wujie?.bus.$emit('sub-route-change', 'vue2', this.$route.path);
}
},
// 主应用Main.js
bus.$on("sub-route-change", (name, path) => {
console.log(name, path)
});
3.通过 postmessage 方法
/* 主应用传给子应用
主应用代码
代码的test是来源于当前WujieVue标签中定义的那个name属性
*/
// 发送方为主应用的代码
handlePostmessageToChild() {
const subAppWindow = window.document.querySelector(
'iframe[name="test"]'
).contentWindow;
const data = {
type: "test",
message: "你好test-child1-base,我是主应用,现在发消息给你"+new Date().getTime()
};
subAppWindow.postMessage(JSON.stringify(data), "*");
}
// 发送方为子应用的代码
handlePostmessageToMain() {
window.parent.postMessage(
JSON.stringify({
type: "main",
message: `test-child1-base:已收到内容为"${this.parentMsg}"的信息`
}),
"*"
);
}
// 接收方的代码
mounted() {
window.addEventListener("message", this.handleMessage);
},
beforeDestroy() {
window.removeEventListener("message", this.handleMessage);
},
methods: {
handleMessage(e) {
try {
let res = JSON.parse(e.data);
if (res.type === "test") { //这个test 是主应用发送给子应用的消息类型
this.parentMsg = res.message; // 这个就是主应用发过来的信息
}
} catch (err) {
return;
}
}
}
4.路由跳转
场景1:主应用点击主应用的侧边栏,子应用会自动切换路由
handleClick(parent, item, isInit) {
this.vue2Url = this.$route.query.url + item.path;
if (!isInit) {// 保持路由活性的项目才需要通知子应用
this.handleClickPostmessage(item.path);
}
},
handleClickPostmessage(path) {
let str = 'iframe[name="'+this.$route.query.appDataCode+'"]';
const subAppWindow = window.document.querySelector(str)?.contentWindow;
const data = {
type: this.$route.query.appDataCode + 'routerChange',
message: path
};
subAppWindow.postMessage(JSON.stringify(data), '*');
}
场景2:子应用A点击子应用B
<template>
<div class="about">
<button @click="handleClick">去子应用B</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
window?.$wujie.props.jump(跳转的路由, 跳转的路由携带的参数); // 这个主要是根据主应用的定义的方法来实现
}
}
};
</script>
场景3:子应用内容跳转路由通知父应用激活相对应路由的侧边栏
// 子应用 App.vue
watch: {
$route() {
window.$wujie?.bus.$emit(
"sub-route-change", // 事件名称
"vue2", // 主应用的路由
this.$route.path
);
}
},
// 主应用
WujieVue.bus.$on("sub-route-change", (name, path) => {
this.menu.forEach((item) => {
if(item.path === path) {
this.defaultActive = item.id // 这个是侧边栏激活的id
} else if(item.children && item.children.length) {
this.digui(item.children,path)// 递归找id
}
});
});
四、插件系统
1. html-loader 可以对子应 html 进行处理
plugins:[ {
// 对子应用的html进行的内容进行修改
htmlLoader: (code) => {
return code.replace('test-child-base', 'vue22');
},
}],
2. jsIgnoresh和cssIgnores(子应用自己加载)
jsIgnores:如果用户想子应用自己加载某些js文件(通过script标签),而非框架劫持加载
css-ignores:如果用户想子应用自己加载某些`css`文件(通过`link`标签),而非框架劫持加载
plugins:[
{ jsIgnores: [/luckysheet\/luckysheet\.umd\.js/, /luckysheet\/plugins\/js\/plugin\.js/] },
{ cssIgnores: [
/luckysheet\/plugins\/css\/pluginsCss\.css/,/luckysheet\/plugins\/plugins\.css/,
/luckysheet\/css\/luckysheet\.css/, /luckysheet\/assets\/iconfont\/iconfont\.css/
]},
],
3. js-excludes 和 css-excludes 可以排除子应用特定的 js 和 css 加载
4. js-before-loaders、js-loader、js-after-loaders 可以方便的对子应用 js 进行自定义
js-before-loaders使用场景:
如果用户想在html中所有的js之前做:
在子应用运行一个src="http://xxxxx"的脚本
在子应用中运行一个内联的 js 脚本
执行一个回调函数
5. css-before-loaders、css-loader、css-after-loaders 可以方便的对子应用 css 进行自定义
plugins:[
{
// 对css脚本动态的进行替换
// code 为样式代码、url为样式的地址(内联样式为'')、base为子应用当前的地址
cssLoader: (code, url, base) => {
return code+".check-cssBeforeLoaders { background: red !important; }";
},
},
]
五、基础改造
1、主应用
安装命令
npm intstall wujie-vue2
// main.js... 以下是于无界相关的主应用改造
import WujieVue from 'wujie-vue2';
const { setupApp } = WujieVue;
Vue.use(WujieVue);
const props = {
jump: (name, query) => { // 这里是给子应用跳转到其他子应用的方法
router.push({ name, query });
}
};
const lifecycles = {
beforeLoad: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeLoad 生命周期`),
beforeMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeMount 生命周期`),
afterMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterMount 生命周期`),
beforeUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeUnmount 生命周期`),
afterUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterUnmount 生命周期`),
activated: (appWindow) => console.log(`${appWindow.__WUJIE.id} activated 生命周期`),
deactivated: (appWindow) => console.log(`${appWindow.__WUJIE.id} deactivated 生命周期`),
loadError: (url, e) => console.log(`${url} 加载失败`, e)
};
// 头部的应用数据
let appWujieData = [
{
name: 'test-child1-base',
code: 'test',
routerPath: '/vue2',
path: 'http://localhost:8083/#'
},
{
name: 'vue22',
code: 'test1',
routerPath: '/vue2',
path: 'http://localhost:8087/#'
},
{
name: '智能网关',
code: 'platform-gateway',
routerPath: '/indexOld',
path: 'http://localhost:8082/#'
},
{
name: '待办中心',
code: 'workitem',
routerPath: '/indexOld',
path: 'http://localhost:8084/#'
}
];
appWujieData.forEach((item) => {
setupApp({
name: item.code /** 唯一性用户必须保证 */,
url: item.path /** 需要渲染的url */,
exec: true /** 预执行 */,
props /** 注入给子应用的属性 */,
...lifecycles,
sandbox: {
css: 'strict', // 启用严格样式隔离
disableDocumentRewrite: false, // 允许DOM重写
excludeAssetFilter: (url) => {
return !url.includes('dynamic-module'); // 过滤特殊资源
}
},
plugins: [
{
// 强制卸载钩子
beforeUnmount: (app) => {
app.window.__WUJIE_UNMOUNT_ALL?.();
const shadow = app.shadowRoot;
while (shadow?.firstChild) {
shadow.firstChild.remove();
}
}
}
]
});
});
2、子应用
(1)vue.config.js主要是为了解决本地调用的时候跨域问题
// vue.config.js
module.exports = {
devServer: {
port: 端口号, // 子应用端口
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS"
}
}
}
(2)main.js(以智能网关为例)
// 子应用入口文件改造
if (window.__POWERED_BY_WUJIE__) { // 子应用是否在无界的环境中
let instance;
if(window.$wujie.props) {
store.commit('changePath', window.$wujie.props.serverPath ) // path.json放到主应用中请求了
}
window.__WUJIE_MOUNT = () => {
instance = new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});
};
window.__WUJIE_UNMOUNT = () => {
instance.$destroy();
};
} else {
axios.get('static/path.json').then(res => {
const path = res.data
const serverType = path.serverType;
const GATEWAY_MAP = path.GATEWAY_MAP;
const basePath = GATEWAY_MAP[serverType];
const serverPath = basePath;
store.commit('changePath', serverPath)
new Vue({
el: "#app",
router,
store,
components: { App },
template: "<App/>"
});
})
}
3、主应用接入无界组件
<!-- 这里的属性跟setupApp一致 -->
<WujieVue
v-if="vue2Url"
:key="`${$route.query.appDataCode}_${Date.now()}`"
width="100%"
height="100%"
:alive="false"
:exec="true"
:name="$route.query.appDataCode"
:props="$store.state.wujieProps"
:url="vue2Url"
></WujieVue>
4、子应用其他改造
1. body的样式需要设置为position: relative,不然element的那些下拉弹出框位置不对
2.e.target获取的是wujie-vue了,应该使用
(e.target.shadowRoot && e.composed) ? (e.composedPath()[0] || e.target) : e.target


3.子应用的获取window

六、应用共享
// 主应用的main.js
import lodash from "lodash";
// 将需要共享的包挂载到主应用全局
window.lodash = lodash;
plugins:[{ jsBeforeLoaders: [{ content: 'window.lodash = window.parent.lodash' }]}]
//子应用
let userInfo = window.lodash.clone(this.userInfo)
userInfo.age++
七、使用wujie-polyfill插件
npm install wujie-polyfill -S
//main.js
import { startApp } from 'wujie'
import {
LocationReloadPlugin,
EventTargetPlugin,
DocFullScrollPlugin
} from "wujie-polyfill";
setupApp({
name: '唯一id',
url: '子应用地址',
exec: true,
el: '容器',
sync: true
plugins: [
LocationReloadPlugin(),
EventTargetPlugin(),
DocFullScrollPlugin()
]
})
<template>
<div>
<WujieVue
width="100%"
height="100%"
name="xxx"
:url="xxx"
:plugins=“plugins”
>
</WujieVue>
</div>
</template>
<script lang="ts">
import WujieVue from 'wujie-vue2'
import {
LocationReloadPlugin,
EventTargetPlugin,
DocFullScrollPlugin
} from "wujie-polyfill";
export default {
name: 'micro-app',
components: {
WujieVue: WujieVue
},
data () {
return {
plugins: [
LocationReloadPlugin(),
EventTargetPlugin(),
DocFullScrollPlugin()
]
}
},
}
</script>
2025开年,AI技术打得火热,正在改变前端人的职业命运:
阿里云核心业务全部接入Agent体系;
字节跳动30%前端岗位要求大模型开发能力;
腾讯、京东、百度开放招聘技术岗,80%与AI相关……
大模型正在重构技术开发范式,传统CRUD开发模式正在被AI原生应用取代!
最残忍的是,业务面临转型,领导要求用RAG优化知识库检索,你不会;带AI团队,微调大模型要准备多少数据,你不懂;想转型大模型应用开发工程师等相关岗,没项目实操经验……这不是技术焦虑,而是职业生存危机!
曾经React、Vue等热门的开发框架,已不再是就业的金钥匙。如果认为会调用API就是懂大模型、能进行二次开发,那就大错特错了。制造、医疗、金融等各行业都在加速AI应用落地,未来企业更看重能用AI大模型技术重构业务流的技术人。
如今技术圈降薪裁员频频爆发,传统岗位大批缩水,相反AI相关技术岗疯狂扩招,薪资逆势上涨150%,大厂老板们甚至开出70-100W年薪,挖掘AI大模型人才!

不出1年 “有AI项目开发经验”或将成为前端人投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
大模型目前在人工智能领域可以说正处于一种“炙手可热”的状态,吸引了很多人的关注和兴趣,也有很多新人小白想要学习入门大模型,那么,如何入门大模型呢?
下面给大家分享一份2025最新版的大模型学习路线,帮助新人小白更系统、更快速的学习大模型!
2025最新版优快云大礼包:《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)

三、大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

四、大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2万+

被折叠的 条评论
为什么被折叠?



