前端微前端:别让你的应用变成巨石应用

前端微前端:别让你的应用变成巨石应用

毒舌时刻

这应用做得跟巨石似的,想改个功能都得动全身。

各位前端同行,咱们今天聊聊前端微前端。别告诉我你还在维护一个巨大的单体应用,那感觉就像在没有分区的大房子里生活——能住,但乱得要命。

为什么你需要微前端

最近看到一个项目,代码量超过 100 万行,构建时间超过 10 分钟,团队协作困难。我就想问:你是在做应用还是在做代码仓库?

反面教材

// 反面教材:单体应用 // App.jsx import React from 'react'; import Header from './components/Header'; import Sidebar from './components/Sidebar'; import Dashboard from './components/Dashboard'; import Users from './components/Users'; import Products from './components/Products'; import Orders from './components/Orders'; import Settings from './components/Settings'; function App() { return ( <div> <Header /> <div> <Sidebar /> <main> <Dashboard /> <Users /> <Products /> <Orders /> <Settings /> </main> </div> </div> ); } export default App; 

毒舌点评:这代码,就像把所有东西都塞进一个大袋子里,管它有用没用。

正确姿势

1. Module Federation

// 正确姿势:Module Federation // 1. 安装依赖 // npm install webpack@5 // 2. 配置 webpack // webpack.config.js const { ModuleFederationPlugin } = require('webpack').container; module.exports = { plugins: [ new ModuleFederationPlugin({ name: 'host', remotes: { dashboard: 'dashboard@http://localhost:3001/remoteEntry.js', users: 'users@http://localhost:3002/remoteEntry.js', products: 'products@http://localhost:3003/remoteEntry.js', orders: 'orders@http://localhost:3004/remoteEntry.js', settings: 'settings@http://localhost:3005/remoteEntry.js', }, shared: { react: { singleton: true, requiredVersion: '^18.2.0', }, 'react-dom': { singleton: true, requiredVersion: '^18.2.0', }, }, }), ], }; // 3. 远程应用配置 // dashboard/webpack.config.js const { ModuleFederationPlugin } = require('webpack').container; module.exports = { plugins: [ new ModuleFederationPlugin({ name: 'dashboard', filename: 'remoteEntry.js', exposes: { './Dashboard': './src/Dashboard', }, shared: { react: { singleton: true, requiredVersion: '^18.2.0', }, 'react-dom': { singleton: true, requiredVersion: '^18.2.0', }, }, }), ], }; // 4. 主机应用 // App.jsx import React, { lazy, Suspense } from 'react'; import Header from './components/Header'; import Sidebar from './components/Sidebar'; const Dashboard = lazy(() => import('dashboard/Dashboard')); const Users = lazy(() => import('users/Users')); const Products = lazy(() => import('products/Products')); const Orders = lazy(() => import('orders/Orders')); const Settings = lazy(() => import('settings/Settings')); function App() { return ( <div> <Header /> <div> <Sidebar /> <main> <Suspense fallback={<div>加载中...</div>}> <Dashboard /> <Users /> <Products /> <Orders /> <Settings /> </Suspense> </main> </div> </div> ); } export default App; 

2. Single-SPA

// 正确姿势:Single-SPA // 1. 安装依赖 // npm install single-spa single-spa-react // 2. 注册应用 // src/registerApplications.js import { registerApplication, start } from 'single-spa'; registerApplication({ name: '@my-org/dashboard', app: () => import('@my-org/dashboard'), activeWhen: (location) => location.pathname.startsWith('/dashboard'), }); registerApplication({ name: '@my-org/users', app: () => import('@my-org/users'), activeWhen: (location) => location.pathname.startsWith('/users'), }); registerApplication({ name: '@my-org/products', app: () => import('@my-org/products'), activeWhen: (location) => location.pathname.startsWith('/products'), }); registerApplication({ name: '@my-org/orders', app: () => import('@my-org/orders'), activeWhen: (location) => location.pathname.startsWith('/orders'), }); registerApplication({ name: '@my-org/settings', app: () => import('@my-org/settings'), activeWhen: (location) => location.pathname.startsWith('/settings'), }); start(); // 3. 微应用配置 // packages/dashboard/src/index.js import React from 'react'; import ReactDOM from 'react-dom'; import singleSpaReact from 'single-spa-react'; import Dashboard from './Dashboard'; const lifecycles = singleSpaReact({ React, ReactDOM, rootComponent: Dashboard, errorBoundary(err, info, props) { return <div>应用出错了</div>; }, }); export const bootstrap = lifecycles.bootstrap; export const mount = lifecycles.mount; export const unmount = lifecycles.unmount; 

3. Qiankun

// 正确姿势:Qiankun // 1. 安装依赖 // npm install qiankun // 2. 注册应用 // src/main.js import { registerMicroApps, start } from 'qiankun'; registerMicroApps([ { name: 'dashboard', entry: '//localhost:3001', container: '#micro-app-container', activeRule: '/dashboard', }, { name: 'users', entry: '//localhost:3002', container: '#micro-app-container', activeRule: '/users', }, { name: 'products', entry: '//localhost:3003', container: '#micro-app-container', activeRule: '/products', }, { name: 'orders', entry: '//localhost:3004', container: '#micro-app-container', activeRule: '/orders', }, { name: 'settings', entry: '//localhost:3005', container: '#micro-app-container', activeRule: '/settings', }, ]); start(); // 3. 主应用 // src/App.jsx import React from 'react'; import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom'; function App() { return ( <Router> <div> <nav> <Link to="/dashboard">仪表盘</Link> <Link to="/users">用户</Link> <Link to="/products">产品</Link> <Link to="/orders">订单</Link> <Link to="/settings">设置</Link> </nav> <div></div> </div> </Router> ); } export default App; // 4. 微应用配置 // packages/dashboard/src/main.js import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; let instance = null; function render(props) { const { container } = props; instance = createApp(App); instance.use(router); instance.mount(container ? container.querySelector('#app') : '#app'); } if (!window.__POWERED_BY_QIANKUN__) { render({}); } export async function bootstrap() { console.log('dashboard bootstraped'); } export async function mount(props) { console.log('dashboard mounted', props); render(props); } export async function unmount() { console.log('dashboard unmounted'); instance.unmount(); instance = null; } 

毒舌点评:这才叫前端微前端,将应用拆分成多个独立的微应用,团队协作更高效,构建时间更短,再也不用担心巨石应用的问题了。

Read more

web3.0 开发实践

web3.0 开发实践

优质博文:IT-BLOG-CN 一、简介 Web3.0也称为去中心化网络,是对互联网未来演进的一种概念性描述。它代表着对现有互联网的下一代版本的设想和期望。Web3.0的目标是通过整合区块链技术、分布式系统和加密技术等新兴技术,构建一个更加去中心化、安全、隐私保护和用户的互联网。 Web 3.0具备四项主要功能 【1】去中心化: 去中心化的Web应用程序是Web 3.0的关键功能。其目的是在去中心化网络中分发和存储数据。在这些网络中,不同的实体拥有底层基础设施,用户直接向存储提供商付费以访问该空间。 去中心化的应用程序还将信息副本存储在多个位置,并确保整个过程中的数据一致性。每位用户可以控制其数据存放的位置,而不必将其移交给集中式基础设施。去中心化的互联网用户可根据需要出售自己的数据。 【2】去信任性: 在集中式Web应用程序和服务中,用户通常需要信任中央权威机构来管理其数据、交易和交互。这些中央权威机构可以控制用户数据,并且可以操纵系统的规则。数据可能存在安全风险或管理不善,从而导致用户信息丢失或滥用。 相比之下,Web3引入去信任性,因此用户可以在无需信任任何特定方

机器人与互联网软件测试对比

通过表格清晰对比扫地机器人与互联网公司软件测试的各项核心维度,再分别阐述二者测试的背景、原因,最后总结二者的测试差异与共性,具体内容如下: 扫地机器人与互联网公司软件测试对比图 对比维度扫地机器人软件测试互联网公司软件测试测试背景智能家居市场快速扩张,产品质量直接决定用户体验与品牌口碑,其软件需联动传感器、电机等硬件,还要适配复杂家居场景,需通过测试保障多组件协同稳定运行互联网产品以敏捷开发为核心,迭代频繁(日均迭代常见),面向海量在线用户,系统多为分布式架构,需通过测试避免高并发、频繁迭代引发的系统崩溃、数据泄露等问题测试原因1. 软件缺陷可能导致清洁漏扫、碰撞家具、无法回充等问题,严重影响使用;2. 传感器、电池等硬件与软件协同易出现兼容性问题;3. 家居环境多样性易暴露软件适配漏洞,需提前排查以降低售后成本1. 高频迭代易引发代码变更冲突,导致原有功能异常;2. 高并发场景下系统易出现响应延迟、宕机等问题,影响用户留存;3. 用户数据安全与隐私保护需求高,需防范黑客攻击、数据泄露等风险测试方法1. 场景化实测:模拟不同家居布局、地面材质、障碍物类型测试;2. 自动化测试:

1200PLC与爱普生机器人modbus_TCP通讯

1200PLC与爱普生机器人modbus_TCP通讯

1.前言 首先申明一下我的硬件信息 机器人:C4-A601S 控制器:RC700 PLC:西门子S7-1200(CPU:1217C/DC/DC/DC) 2.控制器IP地址查看及修改 在配置控制器相关信息时需要先用网线连接PC与机器人控制器连接,爱普生机器人出厂设定网址为192.168.0.1(我这里是之前修改过了) 若默认没有显示以太网连接,点击右侧的增加,选择“通过以太网连接到控制器”后点击确定 如果控制器网址被修改过了,不知道是多少,可以用一根PC线,一头接在控制器的“开发用PC连接专用USB端口”另一头接在电脑USB口 这时候再在通讯处选择USB连接就可以通上了 现在就可以在“系统配置”处看到控制器的IP地址以及相关信息了,如果有需要也可以直接在这修改IP地址。 3.机器人控制器配置 网线连接好后开始配置通讯相关信息 1.控制设备 控制设备修改为远程I/O 2.现场总线 现场总线类型修改为“Modbus TCP”

【前沿解析】2026年3月25日:从机器人协同到全模态AI生态——中关村论坛与昆仑万维双重突破定义AI产业新范式

摘要:2026年3月25日,北京中关村论坛盛大开幕,展示了跨品牌机器人协同服务与昆仑万维三大世界第一梯队模型的突破进展。本文深入解析具身智能机器人“组团上岗”的技术原理、昆仑万维Matrix-Game 3.0、SkyReels V4、Mureka V9的全模态能力,以及产业协同生态的战略价值,涵盖统一调度系统架构、多智能体协作机制、代码实现方案与未来发展趋势。 关键词:具身智能、机器人协同、多模态大模型、全模态AI、中关村论坛、昆仑万维、Matrix-Game 3.0、SkyReels V4、Mureka V9、AI产业生态 一、引言:AI产业化进程加速,生态协同成为新焦点 2026年3月25日,北京中关村论坛年会正式拉开帷幕,本届论坛以"科技创新与产业创新深度融合"为主题,吸引了全球AI领域的目光。与往年不同,今年论坛的"机器人浓度"