Федерация модулей Webpack: новый выбор для микрофронтенд-архитектуры
Федерация модулей Webpack: новый выбор для микрофронтенд-архитектуры

Webpack Module Federation — это революционная функция, представленная в Webpack 5, которая полностью меняет способ реализации микрофронтенд-архитектуры. Объединение модулей позволяет различным веб-приложениям (или микро-интерфейсным приложениям) динамически совместно использовать код во время выполнения без необходимости физического совместного использования во время традиционных процессов упаковки или выпуска. Это означает, что каждое микроприложение можно разрабатывать, создавать и развертывать независимо, а также легко совместно использовать компоненты, библиотеки и даже бизнес-логику.

основные понятия

  • Контейнерное приложение (Container): как микро-внешний Хост архитектуры интерфейса отвечает за загрузку и координацию различных микроприложений.
  • Удаленное приложение (Удаленное): независимое микроприложение, которое может предоставлять свои собственные модули другим приложениям и использовать модули из других приложений.

Этапы реализации

1. Конфигурация приложения-контейнера

Приложение в контейнереwebpack.config.jsсередина,использоватьModuleFederationPluginобъявить происхождение удаленного микроприложения。

Язык кода:javascript
копировать
// webpack.config.js (Container)
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  // ...другие конфигурации
  plugins: [
    new ModuleFederationPlugin({
      name: 'container',
      remotes: {
        app1: 'app1@http://localhost:3001/remoteEntry.js',
        app2: 'app2@http://localhost:3002/remoteEntry.js',
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};

здесь,remotesПоле указывает имя удаленного микроприложения и его файл удаленной записи.URL。sharedКонфигурация определяет, какие модули следует использовать как одиночные.,Такие как React и ReactDOM.,чтобы избежать повторной загрузки.

2. Удаленная настройка приложения.

в каждом удаленном приложенииwebpack.config.jsсередина,такой жеиспользоватьModuleFederationPlugin,Но на этот раз я здесь, чтобы показать свой модуль.

Язык кода:javascript
копировать
// webpack.config.js (Remote App1)
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  // ...другие конфигурации
  plugins: [
    new ModuleFederationPlugin({
      name: 'app1',
      filename: 'remoteEntry.js',
      exposes: {
        './MyComponent': './src/components/MyComponent',
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};

exposesПоля определяют, какие модули будут доступны внешнему миру.。существоватьэтот примерсередина,Компоненты MyComponent можно импортировать и использовать из контейнерных приложений или других микроприложений.

3. Использование удаленного модуля

В приложении-контейнере или другом удаленном приложении удаленно доступные модули можно импортировать напрямую.

Язык кода:jsx
копировать
// In a component of Container or another Remote App
import MyComponent from 'app1/MyComponent';

function App() {
  return (
    <div>
      <h1>Container App</h1>
      <MyComponent />
    </div>
  );
}

export default App;

Преимущества

  • Независимая разработка и развертывание. Каждое микроприложение можно разрабатывать, создавать и развертывать независимо, что повышает эффективность разработки и гибкость развертывания.
  • Загрузка по требованию: только когда модуль действительно используется, соответствующий удаленный код будет загружен, оптимизируя время загрузки первого экрана и общую производительность.
  • Управление версиями и изоляция. Каждое микроприложение может свободно обновлять свои зависимости, избегая конфликтов версий.
  • Простота обслуживания и расширения: слабая связанность объединения модулей позволяет быстро и легко добавлять или удалять микроприложения.

Объединение модулей Webpack обеспечивает эффективное и гибкое решение для разработки и обслуживания современных веб-приложений за счет упрощения механизма совместного использования кода в микрофронтенд-архитектуре.

Практический пример: создание простого микро-интерфейсного приложения.

Давайте рассмотрим простой пример, чтобы продемонстрировать, как использовать объединение модулей Webpack для создания двух микроприложений: приложения-контейнера и удаленного приложения.

1. Создайте приложение-контейнер.

Сначала создайте новое приложение React как приложение-контейнер:

Язык кода:bash
копировать
npx create-react-app container-app
cd container-app

Установите webpack и webpack-cli (обратите внимание, что поскольку create-react-app уже содержит Webpack, обычно нет необходимости устанавливать его отдельно, это только в демонстрационных целях):

Язык кода:bash
копировать
npm install webpack webpack-cli --save-dev

Измените package.json и добавьте сценарий запуска для настройки Webpack:

Язык кода:json
копировать
"scripts": {
  "start": "webpack serve --config webpack.config.js",
  // ...
}

создаватьwebpack.config.js,КонфигурацияModule Federation Plugin

Язык кода:javascript
копировать
// webpack.config.js (Container App)
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  // ...другие конфигурации
  plugins: [
    new HtmlWebpackPlugin({ template: './public/index.html' }),
    new ModuleFederationPlugin({
      name: 'containerApp',
      remotes: {
        remoteApp: 'remoteApp@http://localhost:3010/remoteEntry.js',
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};
2. Создайте удаленное приложение

Создайте удаленное приложение в другом каталоге:

Язык кода:bash
копировать
npx create-react-app remote-app
cd remote-app

такой же,Исправлятьpackage.json,Добавить скрипт запуска,и установитьwebpackиwebpack-cli(Только пример):

Язык кода:bash
копировать
npm install webpack webpack-cli --save-dev

существоватьremote-appизwebpack.config.jsсередина КонфигурацияModule Federation Pluginвыставить компоненты:

Язык кода:javascript
копировать
// webpack.config.js (Remote App)
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  // ...другие конфигурации
  plugins: [
    new ModuleFederationPlugin({
      name: 'remoteApp',
      filename: 'remoteEntry.js',
      exposes: {
        './MyWidget': './src/MyWidget',
      },
      shared: {
        react: { singleton: true },
        'react-dom': { singleton: true },
      },
    }),
  ],
};

существоватьremote-app/srcв каталогесоздаватьMyWidget.jsкомпоненты:

Язык кода:jsx
копировать
// MyWidget.js
import React from 'react';

const MyWidget = () => {
  return <h1>Hello from Remote App!</h1>;
};

export default MyWidget;
3. Приложение-контейнер использует удаленные компоненты.

Вернитесь в приложение-контейнер и импортируйте удаленные компоненты, где это необходимо:

Язык кода:jsx
копировать
// container-app/src/App.js
import React from 'react';
import MyWidget from 'remoteApp/MyWidget';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <MyWidget />
      </header>
    </div>
  );
}

export default App;
4. Запустите приложение

Запустите два приложения отдельно:

Язык кода:bash
копировать
# В каталоге удаленного приложения
npm start --port 3010
# В каталоге приложения-контейнера
npm start

Теперь откройте приложение-контейнер в своем браузере, и вы увидите, что компоненты удаленного приложения успешно загружаются и отображаются.

Расширенное использование и лучшие практики

1. Динамическая загрузка и ленивая загрузка.

в реальных проектах,Возможно, вам захочется динамически загружать удаленное приложение в зависимости от поведения пользователя или определенных условий. Федерация модулей Webpack поддерживает асинхронную загрузку.,Толькосуществовать При импортеиспользоватьimport()функция。

Язык кода:jsx
копировать
// container-app/src/App.js
import React, { lazy, Suspense } from 'react';
const MyWidget = lazy(() => import('remoteApp/MyWidget'));

function App() {
  return (
    <div className="App">
      <Suspense fallback={<div>Loading...</div>}>
        <MyWidget />
      </Suspense>
    </div>
  );
}

export default App;

Таким образом, компонент MyWidget будет загружаться по требованию, когда это необходимо, что повышает скорость загрузки первого экрана.

2. Управление версиями и управление зависимостями.

В микроархитектуре внешнего интерфейса,Убедитесь, что между различными приложениямииз Совместимость версий зависимостей является ключевым моментом。использоватьModuleFederationPluginизsharedКонфигурация,Вы можете указать диапазоны версий и стратегии загрузки для общих модулей (например,,singletonstrictVersionждать)。

Язык кода:javascript
копировать
// webpack.config.js
new ModuleFederationPlugin({
  // ...
  shared: {
    react: { version: '^17.0.0', singleton: true },
    'react-dom': { version: '^17.0.0', singleton: true },
  },
}),
3. Интеграция маршрутизации

В микроархитектуре внешнего интерфейса,Управление маршрутизацией является важнымизкомпоненты。ты можешьиспользоватькартинаreact-router-domтакиз Библиотека,объединитьMicrofrontends-Routerили индивидуализируйте решения для достижения перекрестного примененияиз Прыжок по маршруту。

Язык кода:jsx
копировать
// container-app/src/Routes.js
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import App1 from './App1';
import App2 from './App2';

function Routes() {
  return (
    <Router>
      <Switch>
        <Route path="/app1" component={App1} />
        <Route path="/app2" component={App2} />
      </Switch>
    </Router>
  );
}

export default Routes;
4. Управление статусами

Для требований общего состояния вы можете использовать Redux, MobX или Context APIждать Управление Библиотека статусов, или специально для микровнешности интерфейсдизайниз Управление статусами Куруsingle-spa-reduxqiankunизstoreрешениеждать。

5. Общие услуги и публичные библиотеки

Помимо компонентов, вы также можете делиться сервисами и публичными библиотеками. Например, создайте выделенное удаленное приложение для предоставления служб API или используйте общую библиотеку HTTP.

Язык кода:javascript
копировать
// webpack.config.js (Remote App for Services)
new ModuleFederationPlugin({
  name: 'services',
  filename: 'remoteEntry.js',
  exposes: {
    './ApiService': './src/services/ApiService',
    './HttpLibrary': './src/libs/http-library',
  },
  shared: {
    // ...другие общие библиотеки
  },
}),
6. Обработка и протоколирование ошибок

Чтобы обеспечить микро внешний вид интерфейсприложениеиз Стабильная работа,Необходимо реализовать глобальный перехват ошибок.ирегистрация。Можетиспользоватьwindow.onerrortry...catchзаявление,Или используйте специализированную библиотеку журналирования, например log4js.

Язык кода:jsx
копировать
// container-app/src/index.js
window.onerror = function (errorMessage, fileName, lineNumber, columnNumber, error) {
  // Сообщение об ошибке журнала
  console.error(errorMessage, fileName, lineNumber, columnNumber, error);
  // ...Другая логика обработки
  return true; // Запретить обработку ошибок браузера по умолчанию
};

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024. Приходите и разделите со мной приз!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose