Адрес исходного кода проекта:
https://github.com/wuxiaohuaer/webpack5-vue-admin
1. Что такое микрофронтенд
Микро-интерфейс — это относительно макроконцепция. Его суть — независимость, независимая разработка и независимое развертывание. Он больше подходит для больших команд для разработки тяжеловесных проектов.
На официальном сайте Micro Frontends мы можем узнать, что концепция микро-фронтендов является расширением концепции микросервисов, она отказывается от крупномасштабного единого метода и разбивает интерфейс на маленькие и простые блоки, которые можно разрабатывать самостоятельно. , протестированы и развернуты, но при этом все еще объединяются в виде продукта, который будет представлен клиентам. Можно понять, что микроинтерфейс — это архитектурный стиль, который объединяет несколько небольших интерфейсных приложений, которые могут быть доставлены независимо друг от друга в единое целое.
2. Зачем использовать микроинтерфейс?
У компании есть несколько похожих проектов, и каждый может использовать компонент диалога, тогда мы можем инкапсулировать его, чтобы другие проекты могли использовать его вместе.
В это время у всех возникнет вопрос, недостаточно запаковать его прямо на npm, зачем использовать такую сложную вещь, как микро-фронтенд? Мы упаковываем общие компоненты и загружаем их в менеджер пакетов npm, который действительно может использоваться другими проектами компании, но есть два недостатка.
1. Процедура обременительна
Разработайте три проекта фоновых приложений управления, извлеките те же бизнес-подмодули в пакеты NPM, на этот раз, если вы хотите обновить логику бизнес-подмодуля, вам необходимо выполнить следующие операции процесса:
更新npm包版本
更新A管理系统应用的npm包版本
发布部署A管理系统应用
对B和C管理系统应用循环2和3步骤
Потому что хоть он и относительно независим, но есть посредник вроде npm, но чтобы изменить компонент, нужно трогать все проекты.
Если в проекте есть ссылки на n компонентов, помимо обновления из npm, при сборке и развертывании вам также необходимо их все упаковать, и опыт разработки будет становиться все хуже и хуже.
Микросервисам не нужно локально собирать код этих подмодулей, тем самым уменьшая объем сборки и повышая эффективность разработки.
3. Схема реализации микроинтерфейса
ГОРЯЧИЕ ГОРЯЧИХ МИКРОВЫХ РЕШЕННЫХ РЕШЕНИЯ РЕШЕНИЯ РЕШЕНИЯМИ РЕШЕНИЯМИ ОТКРЫТИЯ ДОЛЖНО ОБЕСПЕЧИТЬ ЦИАНКУН:qiankun.umijs.org/zh/guide
Если вы заинтересованы, вы можете перейти на официальный сайт, чтобы узнать
Я сам не разрабатывал очень крупномасштабную систему, поэтому микросервисы меня мало интересуют. Некоторое время назад я только изучал webpack5 и обнаружил, что в webpack5 есть функция федеративного модуля (mf), которая является лучшим решением для общедоступной загрузки зависимостей микро-интерфейсов.
Ввиду возможностей mf мы можем полностью реализовать децентрализованную группу развертывания приложений: каждое приложение развертывается на своем собственном сервере, и каждое приложение может ссылаться на другие приложения, а также на него могут ссылаться другие приложения, то есть каждое приложение может действовать как хост или удаленно, без концепции центрального приложения.
В настоящее время основанная на mf относительно зрелая микроинтерфейсная архитектура представляет собой микроинтерфейсное решение EMP от команды YY.
Как специалист по vue, я реализую базовый микросервис на основе последней версии vue3.0+webpack5.
В-четвертых, создайте среду
1. Создайте папку
// 创建文件夹
mkdir hand-vue3-project && cd hand-vue3-project
// 初始化项目
npm init -y
2. Зависимости установки
yarn add webpack webpack-cli -D
3, создайте файл
Создайте папку SRC, index.html и webpack.config.js в корневом каталоге и создайте main.js в папке SRC
// webpack.config.js
const path = require('path')
module.exports = {
mode: 'development', // 环境模式
entry: path.resolve(__dirname, './src/main.js'), // 打包入口
output: {
path: path.resolve(__dirname, 'dist'), // 打包出口
filename: 'js/[name].js' // 打包完的静态资源文件名
}
}
"dev": "webpack --config ./webpack.config.js"
Распечатайте его в main.js
console.log('hello,world!')
Запустите команду:
yarn dev
В это время вы можете видеть, что в папке dist есть упакованный файл js.
Пять, введение vue3.0
Проект компании не решается использовать vue3.x, а может только покрасоваться на демке
Установить зависимости
yarn add vue@next -S
@next -S才能下载到最新的vue版本
yarn add html-webpack-plugin -D
将 index.html 作为模板,打出到 dist 文件夹
yarn add vue-loader@next
解析和转换 .vue 文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template
yarn add @vue/compiler-sfc
Vue 2.x 时代,需要 vue-template-compiler 插件处理 .vue 内容为 ast , Vue 3.x 则变成 @vue/compiler-sfc 。
yarn add vue-style-loader css-loader
элемент конфигурации
1. веб-пакет.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 最新的 vue-loader 中,VueLoaderPlugin 插件的位置有所改变
const { VueLoaderPlugin } = require('vue-loader/dist/index')
module.exports = {
mode: 'development',
entry: path.resolve(__dirname, './src/main.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].js'
},
module: {
rules: [
{
test: /\.vue$/,
use: [
'vue-loader'
]
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './index.html'),
filename: 'index.html',
title: '微前端框架1'
}),
// 添加 VueLoaderPlugin 插件
new VueLoaderPlugin()
]
}
2. Файлы в src
main.js
import { createApp } from 'vue' // Vue 3.x 引入 vue 的形式
import App from './app.vue' // 引入 APP 页面组建
const app = createApp(App) // 通过 createApp 初始化 app
app.mount('#root') // 将页面挂载到 root 节点
Новый app.vue
<template>
<div>距离2021年欧洲杯还有?</div>
</template>
<script>
export default {
}
</script>
В это время, когда запускается yarn dev, index.html будет упакован в папку dist.Вы можете увидеть эффект, когда откроете его, но слишком хлопотно упаковывать и открывать его каждый раз.
Представляем WDS
yarn add webpack-dev-server -D
webpack.config.js
devServer: {
contentBase: path.resolve(__dirname, './dist'),
port: 8080,
publicPath: '/'
}
package.json
"dev": "webpack serve --progress --config ./webpack.config.js"
Пробежать пряжу dev.
6. Внедрение микросервисов с использованием федеративных модулей
Мы только что назвали его для проекта А. Теперь нам нужно создать общий компонент проекта А и экспортировать его.
1. Создайте новый компонент
mountDown.vue
<template>
<div>{{ sum }}天</div>
</template>
<script>
import { defineComponent, onMounted, ref, computed } from 'vue'
export default {
setup() {
let sum = computed(() => parseInt((new Date('2021-06-13'.replace(/-/g, '/')).getTime() - new Date()) / (1000*3600*24)));
return {
sum
}
}
}
</script>
2. Экспорт компонентов
webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
new ModuleFederationPlugin({
name: "A", // 暴露出去的模块名
filename: "remoteEntry.js", // 构建出来的文件名
exposes: {
'./countDown': './src/components/countDown.vue' // 暴露出去。key,要写相对路径
}
})
3. Внедрение проекта B
webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
new ModuleFederationPlugin({
name: "B", // 暴露出去的模块名
filename: "remoteEntry.js", // 构建出来的文件名
remotes: {
A: 'A@http://localhost:8080/remoteEntry.js' // 引用
}
})
app.vue
<template>
<div>距离2021年欧洲杯还有?</div>
<countDown/>
</template>
import { defineAsyncComponent } from 'vue'
const countDown = defineAsyncComponent(() =>
import('A/countDown')
)
export default {
components: { countDown },
setup() {
return {
}
}
}
Если вы измените код в проекте A, проект B также будет обновлен вовремя.Если в разных приложениях есть одни и те же компоненты, нет необходимости копировать и вставлять один и тот же код в код каждого приложения, что решает проблема совместного использования кода между приложениями.
Семь основных концепций и конфигурация
• 使用Module Federation 时, 每个应用块都是一个独立的构建,这些构建都将被编译为 容器。
• 被应用的容器,被称为 remote
• 引用者,被称为 host
• 暴露出去被使用的模块,称为remote模块
принцип
Принцип чувств заключается в использовании JSONP. Создайте глобальную переменную в соответствии с модулем и получите исходный код для различных компонентов на основе глобальных переменных.
Ссылка на ссылку
https://juejin.cn/post/6921161482663100423#heading-2
https://www.yuque.com/violet-coyxa/ib3u7d/etzwyg