微前端qiankun接入Vue和React项目

主应用:Vue3+Webpack

1、创建主应用:

npx vue create main-vue3-app

2、安装qiankun

npx yarn add qiankun

3、项目中使用的vue、vue-router、qiankun依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8080,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    }
})

5、入口组件App.vue

<template>
  <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/vue2-webpack-app">wepback+vue2App</router-link> |
    <router-link to="/vue3-vite-app">vite+vue3App</router-link> |
    <router-link to="/vue3-webpack-app">wepback+vue3App</router-link> |
    <router-link to="/react-webpack-app">wepback+reactApp</router-link> |
    <router-link to="/react-vite-app">vite+reactApp</router-link> 



  </nav>
  <router-view/>
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

6、然后创建微应用对应的路由页面以及注册微应用

router.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'


const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'index',
    component: () => import('../views/Index.vue')
  },
  {
    path: '/vue2-webpack-app/:chapters*',
    name: 'vue2-webpack-app',
    component: () => import('../views/Vue2App.vue')
  },
  {
    path: '/vue3-vite-app/:chapters*',
    name: 'vue3-vite-app',
    component: () => import('../views/ViteApp.vue')
  },
  {
    path: '/vue3-webpack-app/:chapters*',
    name: 'vue3-webpack-app',
    component: () => import('../views/Vue3App.vue')
  },
  {
    path: '/react-webpack-app/:chapters*',
    name: 'react-webpack-app',
    component: () => import('../views/ReactWebpack.vue')
  },
{
    path: '/react-vite-app/:chapters*',
    name: 'react-vite-app',
    component: () => import('../views/ReactVite.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

微应用:Vue2+Webpack

1、在主应用下创建对应的路由页面 views/Vue2App.vue

<template>
    <div id="vue2-webpack-app"/>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue2-webpack-app',
        entry: '//localhost:8081/',
        container: '#vue2-webpack-app',
        activeRule: '/vue2-webpack-app',
       
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建vue2+webpack项目,选2.x版本

npx vue create vue2-app

3、项目中使用的vue、vue-router依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8081,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    },
    configureWebpack: {
        output: {
            library: `${packageName}-[name]`,
            libraryTarget: 'umd',
            chunkLoadingGlobal: `webpackJsonp_${packageName}`,
        },
    }
})

5、在src根目录下创建public-path.js

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ 
}

6、router/index.ts

import Vue from 'vue'
import VueRouter from 'vue-router'
import IndexVue from '../views/Index.vue'

Vue.use(VueRouter)

const routes= [
  {
    path: '/',
    name: 'index',
    component: IndexVue
    // component: () => import( '@/views/Index.vue')

  },
]
console.log(window.__POWERED_BY_QIANKUN__)
const router = new VueRouter({
  mode: 'history',
  base: window.__POWERED_BY_QIANKUN__ ? '/vue2-webpack-app' : '/',
  routes
})

export default router

7.入口文件main.ts/main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router';
import './public-path'

Vue.config.productionTip = false
let instance:any = null;

function render(props:any = {}) {
  const { container } = props
  instance = new Vue({
    name: 'root',
    router,
    render: h => h(App)
  }).$mount(container ? container.querySelector('#app') : '#app')

}
 
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}
/**
* bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
*/
export async function bootstrap() {
    console.log('vue2+webpack bootstraped');
}
 
/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props:unknown) {
    // ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));

    console.log('乾坤子应用容器加载完成,开始渲染 child')
    console.log('props from main mount', props)
    render(props)
}
 
/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount() {
  instance?.$destroy();

 
}
 
 
/**
* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
*/
export async function update(props:unknown) {
    console.log('update props', props);
}

微应用:Vue3+Wepback

1、在主应用下创建对应的路由页面 views/Vue3App.vue

<template>
    <div id="vue3-webpack-app"  />
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue3-webpack-app',
        entry: '//localhost:8082/',
        container: '#vue3-webpack-app',
        activeRule: '/vue3-webpack-app',
        
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start({
            prefetch:false,
            sandbox:{experimentalStyleIsolation:true}
        });
    }
});
</script>

<style scoped></style>

2、创建vue3+webpack项目,选3.x版本

npx vue create vue3-webpack-app

3、项目中使用的vue、vue-router依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
const path = require('path');
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8082,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    },
    configureWebpack: {
        output: {
            library: `${packageName}-[name]`,
            libraryTarget: 'umd',
            chunkLoadingGlobal: `webpackJsonp_${packageName}`,
        },
        resolve:{
            alias:{
                '@':path.join(__dirname,'src')
            }
        }
    }
})

5、在src根目录下创建public-path.js

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ 
}

6、router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import IndexView from '../views/Index.vue'

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'index',
    component: IndexView
    // component: () => import('../views/Index.vue')
  }
]

const router = createRouter({
  history: createWebHistory(window.__POWERED_BY_QIANKUN__?'/vue3-webpack-app':process.env.BASE_URL),
  routes
})

export default router

7.入口文件main.ts/main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import './public-path'

let app: any = null
function render(props: any = {}) {
    app = createApp(App)
    const { container } = props
    app.use(router).mount(container ? container.querySelector('#app') : '#app')
}


if (!window.__POWERED_BY_QIANKUN__) {
    render()
}

export async function bootstrap() {
    console.log('vue3+webpack bootstraped');
}

/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props: unknown) {
    // ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));

    console.log('乾坤子应用容器加载完成,开始渲染 child')
    console.log('props from main mount', props)
    render(props)
}

/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount() {
    console.log('unmount-------------------')
    app.unmount()
    app = null

}


/**
* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
*/
export async function update(props: unknown) {
    console.log('update props', props);
}

微应用:Vue3+Vite

1、在主应用下创建对应的路由页面 views/ViteApp.vue

<template>
    <div id="vue3-vite-app"  />
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue3-vite-app',
        entry: '//localhost:5174/',
        container: '#vue3-vite-app',
        activeRule: '/vue3-vite-app',
        
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建vue3+vite项目

npx pnpm create vite vue3-vite-app --template vue-ts

3、项目中使用的vue、vue-router依赖如下,vite版本为4.x

4、安装vite-plugin-qiankun插件

npx pnpm add vite-plugin-qiankun

在vite.config.ts使用

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import qiankun from 'vite-plugin-qiankun';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue() ,qiankun('vue3-vite-app', {
    useDevMode: true
  })],
  server:{
    host: '127.0.0.1',
    port: 5174,
  }
 
})

5、router/index.ts

import { createRouter, createWebHistory } from 'vue-router'
import {

  qiankunWindow
} from 'vite-plugin-qiankun/dist/helper';

const router = createRouter({
  history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vue3-vite-app' : '/'),
  routes: [
    {
      path: '/',
      name: 'index',
      component: () => import(/* webpackChunkName: "index" */ '../views/Index.vue')
    }
  ]
})

export default router

6、在src根目录下创建public-path.js

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ 
}

7、main.ts



import { createApp } from 'vue'
import './public-path'


import App from './App.vue'
import router from './router'

import {
    renderWithQiankun,
    qiankunWindow
  } from 'vite-plugin-qiankun/dist/helper';
  
  let app:any;
  if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
    createApp(App).use(router).mount('#app');
  } else {
    renderWithQiankun({
      mount(props) {
        console.log('--mount');
  console.log(props)
        app = createApp(App);
        app
          .use(router)
          .mount(
            (props.container
              ? props.container.querySelector('#app')
              : document.getElementById('app')) as Element
          );
      },
      bootstrap() {
        console.log('--bootstrap');
      },
      update() {
        console.log('--update');
      },
      unmount() {
        console.log('--unmount');
        app?.unmount();
      }
    });
  }
  

微应用:React 18+Webpack

1、在主应用下创建对应的路由页面 views/ReactWebpack.vue

<template>
    <div id="react-webpack-app"/>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'react-webpack-app',
        entry: '//localhost:3000/',
        container: '#react-webpack-app',
        activeRule: '/react-webpack-app',
        props: {

        }
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建React+Webpack项目

npx create-react-app react-app

3、项目中使用的react、react-dom、react-router-dom依赖如下,webpack版本为5.x

4、创建config-overrides.js,修改配置

 npm i react-scripts

修改package.json

5、封装路由组件,src/router/index.js

import React from 'react'

import Home from '../views/home'
// 导入路由依赖
import { Route,Routes} from 'react-router-dom'
 
export default function Router(){
    return (
        // 使用BrowserRouter包裹,配置路由
      <Routes >
        <Route element={<Home/>} path='/'></Route>
      </Routes>
    )
}

6、在App.jsx中引入路由组件

import Router from './router/index'
import './App.css';
function App() {
  return (
    <div>
      <Router></Router>
    </div>
  );
}
export default App;

7、index.js入口

import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom'
import './index.css';
import App from './App';
import './public-path';
import reportWebVitals from './reportWebVitals';
// let root = createRoot(document.querySelector('#root'))
let root = null;
function render (props) {
    const { container } = props;
    root = root || ReactDOM.createRoot(container ? container.querySelector("#root") : document.getElementById("root") );
    root.render(
        <BrowserRouter basename={window.__POWERED_BY_QIANKUN__ ? "/react-webpack-app" : "/"}>
            <React.StrictMode>
                <App />
            </React.StrictMode>
        </BrowserRouter>
    );
}

if (!window.__POWERED_BY_QIANKUN__) {
    render({});
}

export async function bootstrap () {
    console.log("[react18] react app bootstraped");
}

export async function mount (props) {
    console.log("[react18] props from main framework", props);
    render(props);
}

export async function unmount (props) {
    root.unmount();
    root = null;
}


reportWebVitals();

微应用:React18+Vite

1、在主应用下创建对应的路由页面 views/ReactVite.vue

<template>
    <div id="react-vite-app"/>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'react-vite-app',
        entry: '//localhost:5175/',
        container: '#react-vite-app',
        activeRule: '/react-vite-app',
       
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建React18+vite项目

npx pnpm create vite react-vite-app --template react-ts

3、项目中使用的react、react-dom 、react-router-dom依赖如下,vite版本为4.x

4、安装vite-plugin-qiankun插件

npx pnpm add vite-plugin-qiankun

在vite.config.ts使用

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import qiankun from 'vite-plugin-qiankun'


export default defineConfig({
  plugins: [
    // 在开发模式下需要把react()关掉
    // https://github.com/umijs/qiankun/issues/1257
    // react(),
    qiankun('react-vite-app', { // 微应用名字,与主应用注册的微应用名字保持一致
      useDevMode: true
    })
  ],
  server: {
    host: '127.0.0.1',
    port: 5175,
  }
})

5、封装路由组件,src/router/index.tsx

import React from 'react'

import Home from '../views/home'
// 导入路由依赖
import { Route,Routes} from 'react-router-dom'
 
export default function Router(){
    return (
        // 使用BrowserRouter包裹,配置路由
      <Routes >
        <Route element={<Home/>} path='/'></Route>
      </Routes>
    )
}

 6、在App.tsx中引入路由组件

import Router from './router/index'
import React from 'react';
import './App.css';
function App() {
  return (
    <div>
      <Router></Router>
    </div>
  );
}
export default App;

7、main.tsx入口

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import { BrowserRouter } from 'react-router-dom'

import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
let root:any;

const render = (container:HTMLElement | undefined) => {
  // 如果是在主应用的环境下就挂载主应用的节点,否则挂载到本地
  
  root = root || ReactDOM.createRoot(container ? container.querySelector("#root") : document.getElementById("root") );
  console.log(qiankunWindow.__POWERED_BY_QIANKUN__)
  root.render(
      <BrowserRouter basename={qiankunWindow.__POWERED_BY_QIANKUN__ ? "/react-vite-app" : "/"}>
          <React.StrictMode>
              <App />
          </React.StrictMode>
      </BrowserRouter>
  );
}

const initQianKun = () => {
  renderWithQiankun({
    // 当前应用在主应用中的生命周期
    // 文档 https://qiankun.umijs.org/zh/guide/getting-started#

    mount(props) {
      render(props.container)
      //  可以通过props读取主应用的参数:msg
      // 监听主应用传值
      props.onGlobalStateChange((res) => {
        console.log(res.count)
      })
    },
    bootstrap() { },
    unmount() {
    root.unmount();
      root = null
     },
  })
}


// 判断当前应用是否在主应用中
qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render(undefined)

演示:

20231027-120328

issue

发现使用webpack构建的微应用,不支持路由懒加载的写法,vite就可以

Vue路由懒加载报错,ChunkLoadError: Loading chunk 0 failed,需要二次进入子应用或者在子应用中刷新才正常。 · Issue #1929 · umijs/qiankun (github.com)

完整代码:

UzumakiHan/qiankun-demo (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/109426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…

【全志R128外设模块配置】USB外设功能配置

USB 外设功能配置 USB 功能简介 USB 功能模块包括了USB Host&#xff0c;USB Device 和OTG 功能。 USB Host 目前已经支持上的功能有&#xff1a;Mass Storage&#xff0c;UVC。 USB Device 目前已经支持上的功能有&#xff1a;ADB&#xff0c;UAC。 OTG 主要用作Host 与D…

微信小程序的高校报修后勤维修系统

本课题所设计的后勤维修系统&#xff0c;使用微信开发者与java进行开发&#xff0c;它的优点代码不能从浏览器查看&#xff0c;保密性非常好&#xff0c;比其他的后勤维修更具安全性。小程序还容易修改和调试&#xff0c;毕竟维修行业是在不断发展过程中&#xff0c;难免有更多…

大模型问答助手前端实现打字机效果 | 京东云技术团队

1. 背景 随着现代技术的快速发展&#xff0c;即时交互变得越来越重要。用户不仅希望获取信息&#xff0c;而且希望以更直观和实时的方式体验它。这在聊天应用程序和其他实时通信工具中尤为明显&#xff0c;用户习惯看到对方正在输入的提示。 ChatGPT&#xff0c;作为 OpenAI …

【前端框架】本文带你了解nvue

前言 各位公主给&#x1f478;&#x1f3fb;&#xff0c;王子&#x1f934;&#x1f3fb;好&#xff0c;我是你们的Aic山鱼&#xff0c;专注于前端领域的垂直更新。我热衷于分享我的经验和知识&#xff0c;希望能够帮助更多的人在前端领域取得进步。作为一名前端开发人员&#…

10.30二叉树一些性质,找公共祖先(一般与搜索树),操作的复杂度,选择题细节

课上 一些结论&#xff0c;性质 n0,n1,n2指的是子结点的数量&#xff0c;n0没有子节点&#xff0c;叶子结点 n2*n2n11,若n1为奇数&#xff0c;则n为偶数&#xff0c;不然&#xff0c;则为奇数 满二叉树 没有度为1的结点&#xff0c;即每个结点要么没有孩子结点&#xff0c;要么…

VC++程序崩溃时,使用Visual Studio静态分析dump文件

Window环境下的C程序如果发生异常崩溃&#xff0c;首先会和客户联系&#xff0c;让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话&#xff0c;从log一般分析不出特定原因&#xff0c;这时候dump文件就起作用了。可以通过Visual Studio和Windbg来静态…

2016年亚太杯APMCM数学建模大赛C题影视评价与定制求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 C题 影视评价与定制 原题再现 中华人民共和国成立以来&#xff0c;特别是政治改革和经济开放后&#xff0c;随着国家经济的增长、科技的发展和人民生活水平的提高&#xff0c;中国广播电视媒体取得了显著的成就&#xff0c;并得到了迅速的发展…

工业相机常见的工作模式、触发方式

参考&#xff1a;机器视觉——工业相机的触发应用(1) - 知乎 工业相机常见的工作模式一般分为&#xff1a; 触发模式连续模式同步模式授时同步模式 触发模式&#xff1a;相机收到外部的触发命令后&#xff0c;开始按照约定时长进行曝光&#xff0c;曝光结束后输出一帧图像。…

Android 快速实现隐私协议跳转链接

首先在string.xml创建对应字串 <string name"link">我已仔细阅读并同意<annotation value"privacy_policy">《隐私政策》</annotation>和<annotation value"service_agreement">《服务协议》</annotation></st…

c++-二叉树进阶

文章目录 前言一、二叉搜索树1、二叉搜索树介绍2、二叉搜索树循环实现3、二叉搜索树递归实现4、二叉搜索树的性能分析5、二叉搜索树的应用6、二叉树练习题6.1 根据二叉树创建字符串6.2 二叉树的层序遍历6.3 二叉树的层序遍历 II6.4 二叉树的最近公共祖先6.5 二叉搜索树与双向链…

Java SE 学习笔记(十八)—— 注解、动态代理

目录 1 注解1.1 注解概述1.2 自定义注解1.3 元注解1.4 注解解析1.5 注解应用于 junit 框架 2 动态代理2.1 问题引入2.2 动态代理实现 1 注解 1.1 注解概述 Java 注解&#xff08;Annotation&#xff09;又称Java标注&#xff0c;是JDK 5.0引入的一种注释机制&#xff0c;Java语…

二叉排序树c语言版

1、定义二叉树数据域、二叉树结点 /*** 二叉树节点数据 */ typedef struct treenodedata {int sort;char* name;} TreeNodeData;/**** 二叉树节点定义 */ typedef struct binarytree {/*** 结点数据域*/TreeNodeData* data;/**左子树*/struct binarytree* leftChild;/**左子树…

【C语言】指针那些事(上)

C语言系列 文章目录 文章目录 一. 字符指针 一.&#xff08;1 &#xff09; 数组创建空间的地址和指针指向的地址 二. 指针数组 二.&#xff08;1&#xff09;指针数组模拟一个二维数组 ​ 三. 数组指针 三.(1)数组指针到底有什么用 对一维数组没有什么用 二.(…

半导体产线应用Power Link 转EtherCAT协议网关数字化转型

随着数字化转型的推进&#xff0c;越来越多的企业开始意识到数字化转型的重要性&#xff0c;并将其作为发展战略的关键之一。半导体产线作为一个高度自动化的生产系统&#xff0c;自然也需要数字化转型来提高效率、降低成本和提高质量。Power Link 转EtherCAT协议网关是半导体产…

大数据之LibrA数据库系统告警处理(ALM-12002 HA资源异常)

告警解释 HA软件周期性检测Manager的WebService浮动IP地址和数据库。当HA软件检测到浮动IP地址或数据库异常时&#xff0c;产生该告警。 当HA检测到浮动IP地址或数据库正常后&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 如果Manager的WebService浮动IP地址异常…

高效分割分段视频:提升您的视频剪辑能力

在数字媒体时代&#xff0c;视频剪辑已经成为一项重要的技能。无论是制作个人影片、广告还是其他类型的视频内容&#xff0c;掌握高效的视频剪辑技巧都是必不可少的。本文将介绍如何引用云炫AI智剪高效地分割和分段视频&#xff0c;以提升您的视频剪辑能力。以下是详细的操作步…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果…

【设计模式】第19节:行为型模式之“中介模式”

一、简介 中介模式定义了一个单独的&#xff08;中介&#xff09;对象&#xff0c;来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互&#xff0c;来避免对象之间的直接交互。 中介模式的设计思想跟中间层很像&#xff0c;通过引入中介这个中间层&#xf…

【Java】LinkedList 集合

LinkedList集合特点 LinkedList 底层基于双向链表实现增删 效率非常高&#xff0c;查询效率非常低。 LinkedList源码解读分析 LinkedList 是双向链表实现的 ListLinkedList 是非线程安全的&#xff08;线程是不安全的&#xff09;LinkedList 元素允许为null,允许重复元素Linked…
最新文章