96SEO 2026-02-20 10:23 9
。

但是再问深入一点#xff1a;它是干嘛的#xff0c;它有什么用#xff0c;可能就回答不出来了。
一方面没多少人研究和使用微前端。
可能还没来得及用微前端扩展项目#xff0c;公司就已经倒闭了。
single-spa。
但是再问深入一点它是干嘛的它有什么用可能就回答不出来了。
一方面没多少人研究和使用微前端。
可能还没来得及用微前端扩展项目公司就已经倒闭了。
另一方面是中文博客对微前端的研究少之又少很多文章只是简单翻译一下官方文档读几个API放个官方的
文档一样喜欢造概念。
讲一个东西的时候总是把别的库拉进来一起讲把一个简单的东西变得非常复杂。
最令人吐槽的一点就是官方的
的角度来聊一下官方文档的都讲了哪些内容相信看完这篇文章就能看懂
让我们从一个最小的需求开始说起。
有一天产品经理突然说我们要做一个
就好吧再不行复制粘贴也很快吧。
而程序员想的却是又要看屎山了。
又要重构了。
又要联调了。
测试数据有没有啊等一下联调的后端是谁啊
估计这是做大项目时经常遇到的需求了搬运一个现有的页面。
我想大多数人都会选择在自己项目里复制粘贴别人的代码然后稍微重构一下再测试环境联调最后上线。
但是这样就又多了一份代码了如果别人的页面改了那么自己项目又要跟着同步修改再联调再上线非常麻烦。
Modal显示的时候只能在那一小块地方展示不能全屏展示无法跟随浏览器前进后退天生的硬隔离无法与主应用进行资源共享交流也很困难
切换路由就是切换页面组件组件的挂载和卸载非常快单页应用肯定共享
技术栈无关主框架不限制接入应用的技术栈微应用具备完全自主权独立开发、独立部署微应用仓库独立前后端可独立开发部署完成后主框架自动完成同步更新增量升级在面对各种复杂场景时我们通常很难对一个已经存在的系统做全量的技术栈升级或重构而微前端是一种非常好的实施渐进式重构的手段和策略独立运行时每个微应用之间状态隔离运行时状态不共享
是开始加载子应用怎么加载由开发者自己实现等会会说到Unload
可以控制的我能理解那什么时候应该开始这一套生命周期呢应该是有一个契机来开始整套流程的或者某几个流程的。
app由开发者自己玩别的生命周期里要干嘛的还是由开发者造的子应用自己玩监听
说自己是微前端框架但是一个微前端的特性都没有实现都是需要开发者在加载自己子
APIregisterApplication表示注册一个子应用。
使用如下
singleSpa.registerApplication({name:
匹配规则表示啥时候开始走这个子应用的生命周期customProps:
./providesHelperMethod.js;helperMethod();
https://cdn.jsdelivr.net/npm/vue2.6.12/dist/vue.esm.browser.js}}
idcontainer我是{{name}}/divscript
https://cdn.jsdelivr.net/npm/vue2.6.12/dist/vue.esm.browser.js
importmap它还有很多的功能比如获取当前加载的所有模块、当前模块的
typesystemjs-importmap{imports:
//localhost:9000/react-mf-root-config.js}}
/scriptscriptsingleSpa.registerApplication({name:
System.import(react-mf/root-config),
匹配规则表示啥时候开始走这个子应用的生命周期customProps:
singleSpa.registerApplication({name:
匹配规则表示啥时候开始走这个子应用的生命周期customProps:
希望主应用应该就一个空壳子只需要管内容要放在哪个地方所有的功能、交互都应该交由
还是有点多余而且觉得有点奥特曼了。
不过为了跟着文档的节奏来这里假设就用
srchttps://storage.googleapis.com/polyglot.microfrontends.app/importmap.json/script%
typesystemjs-importmap{imports:
//localhost:9000/polyglot-mf-root-config.js}}/script%
srchttps://cdn.jsdelivr.net/npm/import-map-overrides2.2.0/dist/import-map-overrides.js/scriptscript
srchttps://cdn.jsdelivr.net/npm/systemjs6.8.3/dist/system.min.js/scriptscript
srchttps://cdn.jsdelivr.net/npm/systemjs6.8.3/dist/extras/amd.min.js/script
bodyscriptSystem.import(polyglot-mf/root-config);System.import(polyglot-mf/styleguide);/scriptimport-map-overrides-full
show-when-local-storagedevtools
dev-libs/import-map-overrides-full
single-spa;registerApplication({name:
System.import(polyglot-mf/navbar),activeWhen:
System.import(polyglot-mf/clients),activeWhen:
polyglot-mf/account-settings,app:
loadWithoutAmd(polyglot-mf/account-settings),activeWhen:
System.import(name).***n((module)
是完美的轻量微前端主应用但是就算再压缩主应用的交互那总得告诉子应用放置的位置吧那不还得
idsingle-spa-layoutsingle-spa-routernav
nameorganization/nav/application/navdiv
nameorganization/settings/application/routeroute
nameorganization/clients/application/route/divfooterapplication
nameorganization/footer/application/footer/single-spa-router/template/head
很像只能说一模一样吧。
当然上面这么写很直观但是浏览器并不认识这些元素所以
把识别这些元素的逻辑都封装成了函数并暴露给开发者开发者只要调用一下就能识别出
{constructApplications,constructRoutes,constructLayoutEngine,
constructRoutes(document.querySelector(#single-spa-layout));//
constructApplications({routes,loadApp({
applications.forEach(registerApplication);//
来渲染子应用的根组件ReactDOM.render(SubApp/,
document.getElementById(root));
singleSpaReact({React,ReactDOM,rootComponent:
reactLifecycles.unmount;single-spa
搞啊别的框架也要给它们整上一个一碗水端平所以有这了这些牛鬼蛇神
{document.head.appendChild(styleElement);},reactLifecycles.mount,
[https://example.com/main.css],//
[cssLifecycles.bootstrap,reactLifecycles.bootstrap
后会有样式闪一下的问题cssLifecycles.mount,reactLifecycles.mount
同理reactLifecycles.unmount,cssLifecycles.unmount
__webpack_require__.cssAssetFileName
文件名。
ExposeRuntimeCssAssetsPlugin
require(mini-css-extract-plugin);
require(single-spa-css/ExposeRuntimeCssAssetsPlugin.cjs);module.exports
MiniCssExtractPlugin({filename:
ExposeRuntimeCssAssetsPlugin({//
引入和移除问题但是又带来了另一个问题怎么保证各个子应用的样式不互相干扰呢官方给出的建议是
.app1__settings-67f89dd87sf89ds
require(postcss-prefix-selector);module.exports
#single-spa-application\\:\\org-name\\/project-name})]
这个问题和上面提到的处理“公共依赖”的问题是差不多的。
官方给出两个建议
其实上面两个方法都大同小异思路都是在主应用一波引入只是一个统一引入CSS另一个统一引入
singleSpaLeakedGlobals({globalVariableNames:
[leakedGlobalsLifecycles.bootstrap,
放在第一位frameworkLifecycles.bootstrap,
[leakedGlobalsLifecycles.mount,
时添加全局变量如果之前有记录在案的直接恢复frameworkLifecycles.mount,
[leakedGlobalsLifecycles.unmount,
删掉新添加的全局变量frameworkLifecycles.unmount,
single-spa-leaked-globalssingle-spa-css
这些库虽然它们也导出了生命周期但这些生命周期与页面渲染、url
来自动调度的而这些库是要通过手动调度的。
只不过我们一般选择在子应用里的生命周期里手动调用它们而已。
在微前端也有着非常重要的作用一般是在子应用的生命周期里提供一些功能像
unmount是Parcel功能组件比如给子应用的生命周期打一些补丁bootstrap,
Tools前者用的不多后者自己看一下就会了不多废话。
由于本文是通过发现问题到解决问题来讲述文档内容的所以从头看到尾还是有点乱这里就做一下总结
文档就这些了嘛没错就这些了。
文档好像给了很多“最佳实践”但真正将所有“最佳实践”结合起来并落地的又没多少。
来做样式隔离但是也没有详细说明要具体要怎么做。
像这样的例子还有很多文档往往只告诉了一条路怎么走还要看开发者自己。
这就你给人一种
的用上面提到的小库来搭建微前端是可以的但是要用到生产环境真的没那么容易。
微前端框架真正实现了微前端的所有特性不过这又是另外一个故事了。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback