vite构建项目并支持微前端

要使用vite构建项目并支持微前端,可以按照以下步骤进行:

第一步:初始化项目

npm init vite-app my-project

第二步:安装依赖

cd my-project
npm install

第三步:按需加载

要支持微前端,需要让每个子应用按需加载,而vite正好支持这一特性。你可以在子应用的entry.js中,只导入本子应用需要的模块,而不是导入整个应用的所有模块:

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

// 只导入本应用需要的模块
import Button from 'vant/lib/button';
import 'vant/lib/button/style';

const app = createApp(App);

// 使用本应用需要的模块
app.use(router)
   .use(store)
   .use(Button)
   .mount('#app');

第四步:启用跨域

微前端的架构需要解决跨域问题。在vite项目中使用http-proxy-middleware中间件,将需要跨域访问的接口地址转发到对应的服务器上。

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

// 只导入本应用需要的模块
import Button from 'vant/lib/button';
import 'vant/lib/button/style';

const app = createApp(App);

// 使用本应用需要的模块
app.use(router)
   .use(store)
   .use(Button)
   .mount('#app');

// 代理接口
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = {
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        ws: true,
        changeOrigin: true
      }
    }
  }
};

示例说明

示例一:主应用调用子应用

my-project
├── my-app
├── node_modules
├── index.html
├── main.js
├── package-lock.json
└── package.json

在主应用的index.html文件中添加子应用的入口,将子应用作为一个iframe嵌入到主应用中,使用postMessage实现主子通讯。

<!-- index.html -->
<template>
  <div>
    <h1>主应用</h1>
    <button @click="loadApp">加载子应用</button>
    <iframe :src="childAppUrl" ref="childApp"></iframe>
  </div>
</template>

<script>
export default {
  data() {
    return {
      childAppUrl: 'http://localhost:3001',
      childApp: null
    };
  },

  methods: {
    loadApp() {
      this.$refs.childApp.contentWindow.postMessage({
        type: 'loadApp'
      }, this.childAppUrl);
    },

    messageHandler(event) {
      if (event.origin !== this.childAppUrl) return;
      const { type } = event.data;

      if (type === 'appLoaded') {
        this.childApp = event.source;
      }
      // ...
    }
  },

  mounted() {
    window.addEventListener('message', this.messageHandler);
  },

  destroyed() {
    window.removeEventListener('message', this.messageHandler);
  }
};
</script>

在子应用的entry.js文件中,添加消息监听,用于接收来自主应用的消息。我们假设子应用可以在其他页面进行独立访问,所以需要判断是否需要加载子应用。

const appAddress = 'http://localhost:3001';
let isMasterApp = !window.parent || window === window.parent;
let masterApp = window.parent;

function registerApp() {
  console.log('注册子应用');
  masterApp.postMessage({
    type: 'appLoaded'
  }, appAddress);
}

if (!isMasterApp) {
  console.log('主应用加载子应用');
  window.addEventListener('message', (event) => {
    const { type } = event.data;

    if (type === 'loadApp') {
      registerApp();
    }
    // ...
  });

  registerApp();
}

示例二:子应用调用主应用

my-app
├── node_modules
├── public
├── src
├── vite.config.js
├── package-lock.json
└── package.json

在子应用的entry.js文件中,添加消息监听,用于接收来自主应用的消息。当我们需要子应用调用主应用时,只需要向window.parent.postMessage()发送一个消息即可。

const appAddress = 'http://localhost:3001';
let isMasterApp = !window.parent || window === window.parent;
let masterApp = window.parent;

if (!isMasterApp) {
  console.log('主应用加载子应用');
  window.addEventListener('message', (event) => {
    const { type } = event.data;

    if (type === 'loadApp') {
      registerApp();
    }
    // ...
  });

  registerApp();
}

// 子应用调用主应用
masterApp.postMessage({
  type: 'navigateTo',
  payload: {
    path: '/home'
  }
}, appAddress);

在主应用中添加对应的路由,用于子应用跳转。在index.html中使用<router-view>标签来显示对应路由的组件。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

createApp(App).use(router).mount('#app');

// router.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/home', component: Home },
  { path: '/about', component: About }
];

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

export default router;

// index.html
<template>
  <div>
    <h1>主应用</h1>
    <router-link to="/">首页</router-link>
    <router-link to="/about">关于我们</router-link>
    <router-view />
  </div>
</template>

<script>
export default {
  data() {
    return {
      childAppUrl: 'http://localhost:3001',
      childApp: null
    };
  },

  methods: {
    loadApp() {
      this.$refs.childApp.contentWindow.postMessage({
        type: 'loadApp'
      }, this.childAppUrl);
    },

    navigateTo(path) {
      this.$router.push(path);
    },

    messageHandler(event) {
      if (event.origin !== this.childAppUrl) return;
      const { type, payload } = event.data;

      if (type === 'appLoaded') {
        this.childApp = event.source;
      }
      else if (type === 'navigateTo') {
        const { path } = payload;
        this.navigateTo(path);
      }
    }
  },

  mounted() {
    window.addEventListener('message', this.messageHandler);
  },

  destroyed() {
    window.removeEventListener('message', this.messageHandler);
  }
};
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vite构建项目并支持微前端 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node.js实现身份认证的示例代码

    首先,我们需要了解身份认证的基本概念和流程。身份认证是指验证用户所提供的身份信息是否正确和有效。在前后端分离的应用中,身份认证通常采用 token 认证的方式,即客户端在登录后,向服务端获取 token 并保存到本地,后续的每次请求需要带上这个 token 来进行身份认证。在 node.js 中,主要使用 express 和 jsonwebtoken 两个库…

    node js 2023年6月8日
    00
  • windows系统下简单nodejs安装及环境配置

    Windows系统下简单nodejs安装及环境配置攻略 安装Node.js 打开 Node.js 官网(https://nodejs.org/zh-cn/),选择 “Download” 下载 Node.js 安装包。 打开下载好的 Node.js 安装包,按照提示一步步安装即可。安装过程中注意选择 “Add to Path” 选项,它会自动将 Node.js…

    node js 2023年6月8日
    00
  • NodeJS 实现手机短信验证模块阿里大于功能

    下面按照标准的 Markdown 格式给出详细的讲解: NodeJS 实现手机短信验证模块阿里大于功能 1. 介绍 阿里大于是阿里云的短信服务,提供了丰富的短信发送功能,可以用于各种短信发送需求。在 NodeJS 中,我们可以使用 阿里大于的 NodeJS SDK 来进行开发。 2. 准备工作 在开始之前,需要确保已经申请了阿里大于的短信服务,并获取到了 A…

    node js 2023年6月8日
    00
  • node.js文件的复制、创建文件夹等相关操作

    下面是node.js文件的复制、创建文件夹等相关操作的完整攻略: 文件复制 在Node.js中,文件复制可以使用fs模块的copyFile()方法。其基本语法如下: fs.copyFile(srcPath, destPath, (err) => { if (err) throw err; console.log(‘File was copied’); …

    node js 2023年6月8日
    00
  • TypeScript实现数组和树的相互转换

    类型脚本(TypeScript)是JavaScript的一个超集,它增加了可选的静态类型和其他语言特性,使得编写和维护大型JavaScript应用更加容易。可以使用TypeScript实现数组和树之间的相互转换,本文将提供一种详细的操作攻略。 步骤一:创建类型定义和数据结构 在TypeScript中,我们可以使用类型定义来定义数据结构。在本例中,我们将使用类…

    node js 2023年6月8日
    00
  • nodejs超出最大的调用栈错误问题

    当在Node.js中执行一个超出函数嵌套深度的操作时,可能会遇到“RangeError: Maximum call stack size exceeded”错误,这是由于JavaScript语言中存在调用栈的限制,一旦函数嵌套层数过深,调用栈就会超过它的最大限制。下面将介绍如何排查并修复此类“超出最大的调用栈”错误。 问题定位 当程序发生类似“RangeEr…

    node js 2023年6月8日
    00
  • node.js中fs\path\http模块的使用方法详解

    下面我来详细讲解一下 “node.js中fs\path\http模块的使用方法详解”。 1. node.js中fs模块的使用方法 在node.js中,可以通过fs模块来操作文件系统,常用的方法有读取文件、写入文件、创建文件夹等等。 1.1 读取文件 使用fs模块中的fs.readFile()方法来读取文件内容。该方法有两个参数,第一个参数是要读取的文件路径,…

    node js 2023年6月8日
    00
  • node.js突破nginx防盗链机制,下载图片案例分析 原创

    首先,让我们先了解一下防盗链机制。当我们在网站上嵌入图片时,如果图片链接被其他网站使用,就会产生带宽消耗和服务器压力,并且影响到网站速度和稳定性。为了防止这种情况发生,网站会针对使用外链引用(盗链)的请求进行拦截,这就是防盗链机制。 但有时我们也需要让其他网站可以使用我们的图片,这时就需要通过一些方法绕过防盗链机制,这就是本文讲解的内容。 第一种方法:使用n…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部