Qiankun 生命周期与数据通信实战

微前端架构实战:深入qiankun框架与应用案例 微前端是一种应用架构,将复杂的应用分解为一组小团队可以独立开发、测试和部署的小型前端应用集合。这种模式推动了前端开发的模块化和解耦,使得大型应用的维护和扩展变得更加灵活。qiankun还提供了一套事件通信机制,允许主应用和子应用之间通过自定义事件进行交互。这包括主应用向子应用广播事件,以及子应用向主应用派发事件。// 在主应用中派发一个事件if (event.origin === '子应用的域名') {console.log('接收到子应用派发的事件', payload);break; 阅读详情

微前端是一种前端架构模式 ,它将一个大型的前端应用拆分成多个独立、可独立部署的子应用 ,然后通过一个主应用(或基座应用)将这些子应用集成在一起。

项目支持作为子应用集成到 qiankun 微前端框架中,qiankun 是一个基于 single-spa 的微前端框架,主要特点包括:基于路由的自动激活、样式隔离、JS 沙箱、预加载、全局状态管理。

主应用代码分析

主应用与子应用交互流程如下:

1)注册阶段 :主应用调用 regMicroAllApp(list) 批量注册子应用

2)路由生成 :调用 getMicroAllRouter(microAll) 生成微应用路由

3)启动框架 :调用 loadingMicro() 启动 qiankun 框架

4)路由匹配 :当 URL 匹配到子应用的 activeRule 时

5)子应用挂载 :触发子应用的 mount 生命周期,调用 render(props) 渲染

6)状态同步 :通过 actions 同步主应用与子应用的状态

7)子应用卸载 :当离开子应用路由时,触发 unmount 生命周期

相关逻辑封装到 main\spa\node_modules@pangu\mixmicro\dist\index.esm.js 里

子应用注册机制

微前端路由采用双层路由体系:主应用配置子应用的入口路由和激活规则 ,控制子应用是否加载;子应用配置内部页面的具体路由 ,控制内部页面显示

regMicroAllApp(list) - 批量注册子应用

框架会记录每个子应用的 name 、 entry 、 activeRule 等信息,监听 URL 变化,当 URL 匹配到某个子应用的 activeRule 时,就会准备加载该子应用

  • 参数 list:包含所有子应用配置的数组

  • entry:子应用入口,支持自定义或默认路径( origin/pathname/name/index.html )

  • container:子应用挂载容器,固定为 #subapp-viewport

  • activeRule:子应用激活规则,支持多种 URL 格式

  • props:传递给子应用的数据,包括上层产品名、百度地图 API、侧边栏和主应用路由

const regMicroAllApp = (list) => {
  if (regMicroAllApp.length === 0)
    return;
  const microAllApp = [];
  list.map((item) => {
    microAllApp.push({
      name: item.name,
      entry: item.entry ? item.entry : window.location.origin + window.location.pathname + item.name + "/index.html",
      container: "#subapp-viewport",
      activeRule: ["/#/" + item.name, "/index.html#/" + item.name, window.location.pathname + "#/" + item.name, window.location.pathname + "index.html#/" + item.name],
      props: {
        "upper-name": item["upper-name"],
        "BMap": window.BMap,
        "Sidebar": window.Sidebar,
        "mainRouter": Router
      }
    });
  });
  registerMicroApps(microAllApp);
};

getMicroAllRouter(microAll) - 生成微应用路由

为每个子应用生成两个动态路由,使用 Vue Router 的 /:pathMatch(.) 和 /:pathMatch(.)* 匹配所有子应用路由,路由组件统一使用 @pangu/layout/index.vue

const getMicroAllRouter = (microAll) => {
  const microAllRouter = [];
  microAll.map((item) => {
    microAllRouter.push({
      name: item.name,
      path: "/" + item.name + "/:pathMatch(.*)",
      meta: { parameter: true },
      component: () => import("@pangu/layout/index.vue")
    });
    microAllRouter.push({
      name: item.name,
      path: "/" + item.name + "/:pathMatch(.*)*",
      meta: { parameter: true },
      component: () => import("@pangu/layout/index.vue")
    });
  });
  return microAllRouter;
};

当 URL 匹配到子应用的 activeRule 时,框架会:

1)加载子应用资源 :通过 entry 地址获取子应用的 HTML、CSS 和 JavaScript

2)创建挂载容器 :在主应用的 #subapp-viewport 容器中为子应用创建 DOM 节点

3)执行子应用代码 :调用子应用的 mount 生命周期函数

4)渲染子应用 :子应用在自己的容器中渲染内容

子应用生命周期管理

  • bootstrap:子应用初始化,目前为空实现
  • mount:子应用挂载,保存 props 到全局 window 对象,设置应用为嵌入模式,配置路由前置守卫,同步路由元信息到全局状态,并调用 render 函数挂载子应用
  • unmount :子应用卸载,检查是否需要清理数据(通过 microNeedClean 标识),若需要清理,调用 setting/exit 退出并卸载实例,否则仅卸载实例
  • update :子应用更新,目前为空实现
function life(render, instance = null) {
  const obj = {};
  obj.bootstrap = async () => {
  };
  obj.update = async () => {
  };
  obj.mount = async (props) => {
    window.props = props;
    console.log("++++微应用渲染++++");
    Store.commit("setting/SET_EMBEDDING", true);
    if (Router) {
      Router.beforeEach((to, from, next) => {
        props.setGlobalState && props.setGlobalState({
          meta: to.meta,
          cleanData: false
        });
        next();
      });
    }
    instance = render(props);
  };
  obj.unmount = async (props) => {
    const microNeedClean = window.localStorage.getItem("microNeedClean") === "true";
    if (microNeedClean) {
      localStorage.removeItem("microNeedClean");
      Store.dispatch("setting/exit");
      instance.unmount();
    } else {
      instance.unmount();
    }
  };
  window.qiankunLifecycle = {
    bootstrap: obj.bootstrap,
    mount: obj.mount,
    unmount: obj.unmount,
    update: obj.update
  };
}

数据通信

props 传递

在注册子应用时,通过 props 传递静态数据:

// 主应用注册时传递
props: {
  "upper-name": item["upper-name"], // 上层应用名
  "BMap": window.BMap, // 百度地图API
  "Sidebar": window.Sidebar, // 侧边栏组件
  "mainRouter": Router // 主应用路由实例
}

// 子应用中使用
console.log(window.props["upper-name"]); // 输出: "mainapp"

全局状态管理

通过 actions 对象实现主应用和子应用之间的动态数据共享:

  • 初始化全局状态 initialState ,包含元信息、皮肤、语言等
  • actions.onGlobalStateChange:监听全局状态变化,同步到 Vuex 的 micro 模块
  • actions.setGlobalStatePg:封装了全局状态设置方法
const initialState = {
  meta: null,
  cleanData: false,
  skin: "",
  lang: "",
  mobileCloudData: null,
  expandData: null,
  thcloud: null
};
const actions = initGlobalState(initialState);
actions.onGlobalStateChange((state, prev) => {
  if (state.meta) {
    state.meta.parent_id = getParentId();
  }
  Store.commit("micro/SET_PARAMETER", state);
});
actions.setGlobalStatePg = (val) => {
  actions.setGlobalState({ ...initialState, ...val });
};

微前端框架启动

使用 window.qiankunStarted 避免重复启动,调用 qiankun 的 start 方法启动框架,配置沙箱模式: strictStyleIsolation: false (不严格隔离样式)

function loadingMicro() {
  if (!window.qiankunStarted) {
    window.qiankunStarted = true;
    console.log("++++非容器内启动乾坤,加载路由会自动加载微应用");
    setTimeout(() => {
      start({
        sandbox: { strictStyleIsolation: false }
      });
    }, 0);
  }
}

子应用代码分析

代码目录

- .vscode/               # VS Code配置文件
- build/                 # 构建脚本
- dev/                   # 开发环境配置
- http-server/           # HTTP服务器配置(Go语言实现)
- public/                # 静态资源目录
- src/                   # 源代码目录
  - app/                  # 应用入口和全局配置
    - router/              # 路由配置
      - access.ts          # 路由权限控制
      - index.ts           # 路由实例
      - routes-stack.ts    # 路由栈管理
      - routes.ts          # 路由定义
    - store/               # Vuex状态管理
      - index.ts           # Store实例
    - App.vue              # 根组件
    - index.ts             # 应用初始化
  - assets/               # 静态资源(图片、图标、样式等)
  - common/               # 公共组件、工具和服务
  - modules/              # 业务功能模块
  - main.ts               # 应用入口文件
  - app-config.d.ts       # 应用配置类型定义
- .browserslistrc        # 浏览器兼容性配置
- .cz.yaml               # Commitizen配置
- .editorconfig          # 编辑器配置
- .env                   # 环境变量配置
- .eslintignore          # ESLint忽略配置
- .eslintrc.js           # ESLint配置
- .gitignore             # Git忽略配置
- .npmrc                 # npm配置
- .prettierrc            # Prettier配置
- Dockerfile             # Docker配置
- README.md              # 项目说明文档
- babel.config.js        # Babel配置
- config.js              # 项目配置
- package.json           # 项目依赖和脚本

入口文件 main.ts

作为应用程序的入口文件,负责微前端环境检测、生命周期函数定义和全局配置

环境检测

检测当前是否运行在 qiankun 微前端环境中,如果是微前端环境,动态设置 webpack 的 publicPath,确保资源正确加载

  • POWERED_BY_QIANKUN:qiankun 注入的全局变量,用于标识微前端环境
  • INJECTED_PUBLIC_PATH_BY_QIANKUN:qiankun 注入的资源基础路径,解决子应用资源加载路径问题
if ((window as any).__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = (window as any).__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

生命周期函数

  • bootstrap:初始化函数,只会在子应用第一次启动时调用一次
  • mount:挂载函数,当子应用被挂载到主应用时调用
  • unmount:卸载函数,当子应用从主应用中卸载时调用,负责清理资源
  • props:主应用传递给子应用的数据和方法
export async function bootstrap() {
  //console.log('VueMicroApp bootstraped');
}

export async function mount(props: any) {
  (window as any).__QIANKUN_PROPS__ = props;
  storeTest(props);
  render(props);
}

export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}

全局状态变化

通过 onGlobalStateChange 监听主应用传递的全局状态变化,实现主应用与子应用之间的状态同步,如语言切换、主题切换等

  • 参数: state 是当前全局状态, prev 是上一次的状态
function storeTest(props: any) {
  props.onGlobalStateChange &&
    props.onGlobalStateChange((state: any, prev: any) => {
      console.log(`[onGlobalStateChange - ${props.name}]:`, state);

      state?.lang && switchLang(state.lang);
      state?.skin && setTheme(state.skin);
    }, true);
}

应用路径工具 getAppPath.ts

处理应用程序在不同环境(独立运行/微前端)下的路径逻辑,确保 API 路由和资源定位的正确性

  • 微前端环境逻辑:优先从 qiankun props 中获取 upper-name 属性;如果没有,从 URL 路径中提取第一个路径段
  • 独立运行环境 :使用环境变量 VUE_APP_PRODUCT 的值
export function getAppPath(): string {
  let pathName;
  if ((window as any).__POWERED_BY_QIANKUN__) {
    if ('props' in window && (window as any).__QIANKUN_PROPS__['upper-name']) {
      pathName = (window as any).__QIANKUN_PROPS__['upper-name'];
    } else {
      pathName = window.location.pathname.split('/')[1];
    }
  } else {
    pathName = process.env.VUE_APP_PRODUCT;
  }
  global.AppPath_PRODUCT = pathName;
  return pathName;
}

应用启动文件 index.ts

实现应用程序的启动和模块加载逻辑,动态导入子模块并集成路由和状态管理

动态导入子模块

从环境变量 VUE_APP_CONFIG 中解析模块配置,使用 webpack 的动态导入功能按需加载模块:

  • 如果模块包含路由配置,调用 addRoute 添加到路由系统
  • 如果模块包含状态管理,调用 addModule 添加到 Vuex store
async function loadModules() {
  const config = process.env.VUE_APP_CONFIG;
  if (!config) {
    throw Error('No config found');
  }
  const conf = JSON.parse(JSON.parse(config)) as AppConfig;
  const modules = conf.modules;

  const modulesPromise = modules.map(
    (name) =>
      new Promise((resolve) => {
        import(
          /*
            webpackInclude: INCLUDED_MODULES,
            webpackMode: 'lazy-once',
            webpackChunkName: 'modules',
          */
          '@/modules/' + name + '/module.ts'
        ).then((result) => {
          const mod = result.default as AppModule;
          if (mod.router) {
            const r = mod.router;
            addRoute(r.name, r.path, r.routes);
          }
          if (mod.store) {
            const s = mod.store;
            addModule(s.name, s.module);
          }
          resolve(mod);
        });
      }),
  );
  await Promise.all(modulesPromise);

  return conf;
}

路由、状态管理

  • 路由守卫 :添加全局路由守卫,实现权限控制和状态同步
  • 状态同步 :通过 props.setGlobalState 将子应用状态同步给主应用
  • Vue 实例创建 :根据是否有容器参数决定挂载方式,支持独立运行和微前端挂载
export const start = async (selector: string, props: any) => {
  const [, conf] = await Promise.all([loadData(), loadModules()]);
  addRouteGuard();
  
  // 路由守卫,与主应用通信
  if (router) {
    router.beforeEach((to: any, from: any, next: any) => {
      if (props.setGlobalState) {
        props.setGlobalState({
          ignore: props.name,
          user: {
            name: props.name,
          },
          meta: to.meta,
        });
      }
      
      // 权限验证
      const token =
        sessionStorage.getItem('Authorization') || sessionStorage.getItem('ueba-Authorization');

      if (!token) {
        window.location.href = '#/404';
      } else {
        next();
      }
    });
  }
  
  // 初始化Vue实例
  const instance = new Vue({
    router,
    store,
    i18n,
    render: (h) => h(App, { props: { appConfig: conf } }),
  }).$mount(props.container ? props.container.querySelector(selector) : selector);
  return { instance, router };
};

开发环境代理配置 proxy.js

该文件是开发环境的 API 代理配置 ,用于在独立开发子应用时,将 API 请求转发到对应的后端服务

为不同的 API 路径配置不同的代理目标,自动添加认证信息和用户身份头,处理跨域和 SSL 证书问题

const generateProxyConfig = (config) => {
  return {
    target: config.target,               // 代理目标地址
    pathRewrite: config.pathRewrite || {},  // 路径重写规则
    auth: 'admin:secret+3s',             // 代理认证信息
    changeOrigin: true,                  // 启用跨域
    ssl: {
      rejectUnauthorized: false,         // 不验证SSL证书
      requestCert: false,
    },
    onProxyReq: (proxyReq) => {
      // 添加请求头,用于模拟用户身份
      proxyReq.setHeader('userId', '101');
      proxyReq.setHeader('userName', '666666666');
      // ...其他请求头
    },
    onProxyRes: (proxyRes, req, res) => {
      // 记录代理响应日志
      res.on('finish', () => {
        const code = res.statusCode;
        // 根据状态码打印不同颜色的日志
        // ...日志逻辑
      });
    },
  };
};

const proxyConfigs = {
  '/m1/1961322-1395971-default': generateProxyConfig({ target: 'http://127.0.0.1:4523' }),
  '/ueba/api': generateProxyConfig({ target: 'http://192.168.77.17:8087' }),
  '/model-manager/api': generateProxyConfig({ target: 'http://192.168.77.4:8088' }),
  '/csa': generateProxyConfig({ target: 'https://192.168.97.206:8443' }),
};

完整互动流程示例

场景 :用户登录主应用后,点击"数据分析"菜单进入数据子应用,查看图表后返回主应用。

1)注册阶段 :

主应用调用 regMicroAllApp 注册包括 “data-analysis” 在内的所有子应用,同时调用 getMicroAllRouter 生成子应用路由

2)用户访问主应用 :

主应用正常渲染,用户登录成功后,主应用通过 actions.setGlobalStatePg 设置全局用户信息

3)用户点击"数据分析"菜单 :

主应用路由跳转到 /data-analysis,框架检测到 URL 匹配 data-analysis 子应用的 activeRule

4)子应用加载 :

框架通过子应用的 entry 地址加载 HTML、CSS 和 JS,调用子应用的 bootstrap、mount 生命周期,并传递 props,子应用渲染数据分析界面

5)子应用内部操作 :

用户在子应用中切换图表类型,子应用通过 actions.setGlobalState 更新全局状态,主应用通过 onGlobalStateChange 监听到状态变化

6)返回主应用 :

用户点击主应用的"首页"菜单,主应用路由跳转到 /home,框架检测到 URL 不再匹配子应用的 activeRule,调用子应用的 unmount 生命周期,卸载子应用

乾坤微前端实践:qiankun与UMI的融合之道 微前端架构是一种前端架构设计方法,它将一个复杂的前端应用拆分为多个小的、独立的前端模块,这些模块可以是基于不同的技术栈、由不同的团队独立开发和维护。每个模块都被当作一个“微应用”,它们可以独立部署、独立测试,并且能够被集成到一个统一的主应用中。微前端的目标是降低前端系统的复杂性、提高系统的可维护性、可扩展性和团队协作的效率。乾坤(qiankun)是一个企业级微前端解决方案,它提供了开箱即用的微前端能力,能够帮助开发者更方便地构建和管理微前端架构的前端项目。 阅读详情

相关推荐

微前端 qiankun mirco-app

微前端 qiankun和mirco-app在vue3+vite中使用

JKC_HOWL的博客 1068

乾坤生命周期及window指向

如果子应用需要访问主应用的全局变量和方法,在不同阶段需要适时进行判断或等待。active 阶段:主应用获取到子应用的入口资源后,在一个沙盒环境中运行子应用的初始化函数,并将子应用的代码注入到页面中。fetch 阶段:主应用发送一个 HTTP 请求,获取子应用的入口资源(一般是一个 js 文件)。bootstrap 阶段:主应用加载阶段,负责初始化乾坤实例和加载子应用的静态资源。对象的指向可能会发生变化,并且子应用的代码中只能访问到当前生命周期阶段对应的。对象指向当前子应用的全局对象。

csdn_zhoushengnan的博客 809

冷源法测试噪声系数(Noise Figure)详细步骤

背景知识 电阻负载的功率谱密度 噪声等效模型 3 4 冷源法测试步骤 注意事项

eleday的电子世界 6873

微前端实战教程(qiankun应用)

微前端实战教程、qiankun的实战

weixin_42533732的博客 2970

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1654

U-net复现pytorch版本 以及制作自己的数据集并训练

GitHub链接: https://github.com/milesial/Pytorch-UNet 论文链接:

candice5566的博客 3万+

qiankun-微应用生命周期钩子

bootstrap bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。 export async function bootstrap() { console.log('react app bootstraped'); } mount 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法

weixin_44123848的博客 3262

保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)

本文提供了一份详细的Zemax 18.9单模光纤耦合仿真教程,以康宁SMF-28e为例,涵盖从软件设置、材料参数输入到系统构建和优化的全流程。通过光束耦合分析和物理光学传播(POP)技术,帮助用户准确模拟光纤耦合效率,并解决常见问题,适用于光学设计初学者和专业人士。

weixin_27330481的博客 316

qiankun常见的坑有哪些

解决方案: 使用 Qiankun 提供的 FrameworkConfiguration 中的 event 配置,支持子应用之间的事件通信。解决方案: 针对性地使用 Qiankun 提供的 cssIsolation 配置,或者在子应用中使用一些样式隔离的工具。解决方案: 在子应用的配置中设置 fetch 函数,确保子应用能够正确处理跨域请求。解决方案: 确保子应用的路由和状态管理配置正确,并在子应用中添加适当的兼容性处理。解决方案: 在子应用的构建配置中,根据需要进行代码拆分和优化,减小独立应用的体积。

qq_37759901的博客 2151

9.23华为OD机试真题 新系统 - 小菊的寻宝之旅 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 小菊的寻宝之旅 (Java/Py/C/C++/Js/Go)

算法大师! 1007

Android PMS——概述(一)

PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用

小旭的专栏 1668

微前端-qiankun上手

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、qiangkun是什么二、如何使用1.下载qiankun2.如何使用总结 前言 什么是微前端?现在前端的工作越来越复杂,项目越来越大。一个大型的项目,往往包含数千个页面。在如此庞大的体量下,项目的每一次完整的打包部署。所耗费的成本是非常可怕的,即便现在的构建工具(webpack之类)对此有着一些优化处理方案。但却没有在根本上解决问题,如果项目的体量持续增加下去。那么总有一个极限会让项目的构建速度变得不可接受。 微前端的概.

qq_32019935的博客 1178

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包)

(经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。

知识靠谱的博客 2万+

微前端--qiankun

qiankun分为accpication和parcel模式。基于路由工作,将应用分为两类,基座应用和子应用,基座应用维护路由注册表,根据路由的变化来切换子应用。子应用是一个独立的应用,需要提供生命周期方法供基座应用使用。和路由无关,子应用切换是手动控制的,具体是通过qiankun提供的loadMicroApp来实现的。

m0_73280507的博客 1144

Pdu Router(PduR)模块

1. PduR路由基本功能 2. PduR总线网关功能 3. PduR缓存机制 4. 总结

weixin_43759043的博客 3850

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

万字详解微服务框架之QianKun保姆级教程

本文探讨了在Vue项目中嵌入React工具的技术方案,重点对比了iframe与前端微服务两种方案。通过分析主流微前端框架(Single-SPA、无界、MicroApp、qiankun)的特性与优劣势,团队最终选择采用qiankun方案。文章详细介绍了qiankun的核心特性、架构设计、配置方法和应用场景,为不同技术栈的微前端集成提供了实践指导。qiankun凭借其技术栈无关性、完善的隔离机制和丰富的功能成为优选方案,能有效解决iframe方案的局限性,如路由同步、上下文隔离等问题。

前端小崔的博客 3516

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

前端微服务架构解析:qiankun 运行原理详解

加载流程复盘:用户访问 https://portal.com。1、主应用加载,初始化路由系统。2、用户点击导航跳转到 /app1。3、主应用的路由器捕获到变化,查询映射表,发现 /app1 对应 //app1.com/bundle.js。4、主应用通过 动态脚本加载(如 System.import() 或 自己创建5、主应用创建沙箱环境,在沙箱中运行微应用代码。

weixin_42707287的博客 918

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

qiankun/microApp微前端集成vue和react项目实战踩坑

最近除了自己开发一个协同办公的项目以外,又尝试用react开发了一个简易的低代码平台,了解到了微前端技术后,想尝试下使用微前端将现有的vue开发的协同办公和react低代码平台集成在一个项目里,特此用文章记录下中间的踩坑过程,如有不准确的地方,欢迎大家一起讨论技术选型。

goldfish_333的博客 1098

qiankun微前端状态管理方案:跨应用通信技巧

在微前端架构中,应用间的状态共享和通信一直是开发者面临的核心挑战。当多个独立开发的应用(如React、Vue、Angular)运行在同一页面时,如何优雅地实现数据同步和操作协同?qiankun作为企业级微前端解决方案,提供了三种经过验证的跨应用通信模式,本文将结合源码与实践案例,详解每种方案的实现原理与适用场景。 ## 一、基于全局状态的通信模式 qiankun内置的全局状态管理机制通过`ini...

gitblog_00129的博客 477

【微服务】前端微服务qiankun 2.x主子应用通信代码片段

【代码】【微服务】前端微服务qiankun 2.x主子应用通信代码片段。

mengran_code的博客 475

微前端架构和主流框架的使用

微前端的好处是不言而喻的,有效的拆分应用,实现敏捷开发和部署。相比较于微服务的概念,微服务的重点大概有两点:微前端也是一样,我们可以把数据库的概念换成dom,加上前端应用的特点,可以得出微前端的重点:该架构落地的方式有iframe、npm包、WebComponent以及现有成熟框架等。现有框架有single-spa、qiankun、MicroApp,qiankun是基于single-spa开发的,将这两者合并讲解。这两个框架的基本思路有较大区别:github上有个mini版微前端教学项目,实现方式虽不完全等

qq_42996469的博客 1242

前端微前端进阶:qiankun 源码拆解 + 跨应用通信、样式隔离踩坑实战

摘要 qiankun作为阿里开源的微前端框架,其核心机制包括沙箱隔离、应用加载和通信管理三大模块。通过ProxySandbox实现JS环境隔离,采用ShadowDOM或Scoped CSS进行样式隔离,确保主应用与子应用间的独立性。框架通过registerMicroApps注册子应用,结合路由监听实现动态加载。源码分析揭示了其轻量无侵入的设计理念,开发者可通过深入理解这些机制,解决实际项目中的样式冲突、通信障碍等进阶问题,提升微前端架构的实施效果。

网络工程师|十多年企业级运维实战|精通 ‌BGP、OSPF、VLAN、SDN、MPLS、ACL、NetFlow、SNMP、 608

初探微前端:技术架构思想与主流实现方案

微前端是一种将前端应用拆分成多个独立、自治、可单独开发和部署的“小前端应用”的架构理念,借鉴了微服务在后端的思想。通俗地说:把一个大前端项目拆分成多个小应用,每个小应用可以独立开发、测试、部署、运行,最终集成在一个主应用中。微前端就像把“大房子”拆成多个“独立小房间”,每个房间可以由不同团队装修(甚至风格不同),但最终拼成一个完整的“家”。

2401_85392853的博客 1418

初探 MicroApp,一个极致简洁的微前端框架

这个微前端框架真好吃

MonsterException的博客 5260

【微前端】

微前端(Micro-Frontends)是一种将前端应用拆分为多个独立、可部署的部分的架构模式,每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务 在后端的应用,是为了应对复杂前端应用的维护和扩展问题而提出的。2、微前端的背景以及核心思想在现代前端开发中,随着应用规模的不断扩大和复杂度的增加,前端单体应用逐渐暴露出维护困难、部署慢和团队协作受限等,微前端构架就是为了解决这些问题而诞生的微前端的核心思想就是将前端应用拆分成多个独立的模块,这些模块可以独立开发、测试、部署和运行。

s1111123x的博客 400
上一篇: Vue 项目 JSON 在线编辑、校验如何选?
下一篇: Claude 结合 spec-kit 使用指南
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值