vite构建项目并支持微前端

yizhihongxing

要使用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日

相关文章

  • 使用Typescript和ES模块发布Node模块的方法

    发布Node模块需要满足以下要求: 代码必须是符合Node.js CommonJS规范的。 需要编译工具把你的TypeScript代码编译成JavaScript。 编译后的代码需要经过压缩和优化,最后才能发布到npm上。 在代码中引用外部依赖需要使用ES模块而不能使用CommonJS。 在此,我们提供一份使用 TypeScript和ES模块发布Node模块的…

    node js 2023年6月8日
    00
  • 理解Javascript_01_理解内存分配原理分析

    理解Javascript_01_理解内存分配原理分析 背景 Javascript 是一种动态、弱类型的编程语言,使用广泛,包括 Web 开发、桌面应用、移动应用等。Javascript 的运行需要内存支持,理解内存分配原理是深入学习 Javascript 的关键。 内存基础知识 在计算机中,内存被分为若干个存储单元,每个存储单元的大小是一个字节。我们可以通过…

    node js 2023年6月8日
    00
  • JS获取子节点、父节点和兄弟节点的方法实例总结

    下面我来详细讲解一下JS获取子节点、父节点和兄弟节点的方法实例总结。 1. 获取子节点 在JavaScript中,可以使用childNodes属性获取选定元素的子节点列表,该属性返回一个NodeList对象。NodeList对象类似于数组,但有些方法不同。要获取具体的子节点,可以使用索引值来获取。 示例1 <!DOCTYPE html> <…

    node js 2023年6月8日
    00
  • Nodejs中Express 常用中间件 body-parser 实现解析

    Node.js 是一个非常流行的服务器端 JavaScript 运行环境,而 Express.js 是一个基于 Node.js 的 Web 开发框架。在 Express.js 中,中间件是一种非常有用的机制,它允许在请求到达路由处理函数之前或之后,执行各种操作,比如,身份验证、权限控制、请求处理和响应处理等。其中,body-parser 中间件在处理 HTT…

    node js 2023年6月8日
    00
  • Egg框架的功能、原理,以及基本使用方法概述 原创

    Egg框架的功能、原理,以及基本使用方法概述 Egg框架的功能 Egg是一个基于Node.js和Koa的企业级应用开发框架,是一个约定俗成的目录结构和插件机制的框架。Egg框架提供了很多企业级应用开发所需的核心功能: 便捷的路由和控制器机制 简单易用的模板渲染引擎 灵活的插件机制,轻松集成其他插件拓展功能 方便的中间件机制,实现特定的功能 可定制的事件机制,…

    node js 2023年6月8日
    00
  • Node.js的包详细介绍

    对于“Node.js的包详细介绍”,以下是一份完整攻略。 什么是Node.js的包? Node.js的包(也称为模块)是由NPM(Node Package Manager)或者Yarn进行管理的一组代码集合,它们可以被轻松地安装、升级、删除同时使用。它们是由JavaScript编写的、被分层组织、并且容易复用。 Node.js的包在Node.js应用程序中广…

    node js 2023年6月8日
    00
  • 防止Node.js中错误导致进程阻塞的办法

    当使用Node.js开发Web应用或服务器时,难免会遇到各种错误导致进程阻塞的情况,例如同步I/O、死循环、大量计算等。为了避免这些问题,以下是几种防止Node.js中错误导致进程阻塞的办法: 1. 使用异步操作 Node.js运行在单线程上,如果使用同步I/O操作,会导致进程阻塞。因此,可以使用异步操作,例如使用setTimeout()或setInterv…

    node js 2023年6月8日
    00
  • 5个你不知道的JavaScript字符串处理库(小结)

    5个你不知道的JavaScript字符串处理库(小结) 1. Sugar.js Sugar.js 是一个JavaScript类库,提供了许多方便的字符串操作方法,能够更方便、更高效地处理和操作字符串。这个库支持链式操作,所以它可以把处理一个字符串的多个步骤一起串联起来,使代码更简洁易懂。 let str = ‘ hello world! ‘; console…

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