Slovenčina

Odomknite silu mikro-frontendov s JavaScript Module Federation vo Webpack 5. Naučte sa budovať škálovateľné, udržiavateľné a nezávislé webové aplikácie.

JavaScript Module Federation s Webpack 5: Komplexný sprievodca mikro-frontendmi

V neustále sa vyvíjajúcom svete webového vývoja môže byť tvorba veľkých a zložitých aplikácií náročnou úlohou. Tradičné monolitické architektúry často vedú k predĺženiu času vývoja, problémom pri nasadzovaní a výzvam pri udržiavaní kvality kódu. Mikro-frontendy sa objavili ako silný architektonický vzor na riešenie týchto problémov, ktorý umožňuje tímom budovať a nasadzovať nezávislé časti väčšej webovej aplikácie. Jednou z najsľubnejších technológií na implementáciu mikro-frontendov je JavaScript Module Federation, predstavená vo Webpack 5.

Čo sú mikro-frontendy?

Mikro-frontendy sú architektonický štýl, pri ktorom je frontendová aplikácia rozložená na menšie, nezávislé jednotky, ktoré môžu byť vyvíjané, testované a nasadzované autonómne rôznymi tímami. Každý mikro-frontend je zodpovedný za špecifickú obchodnú doménu alebo funkciu a sú zložené dohromady za behu, aby vytvorili kompletné používateľské rozhranie.

Predstavte si to ako firmu: namiesto jedného obrovského vývojového tímu máte viacero menších tímov zameraných na špecifické oblasti. Každý tím môže pracovať nezávisle, čo umožňuje rýchlejšie vývojové cykly a jednoduchšiu údržbu. Zvážte veľkú e-commerce platformu ako Amazon; rôzne tímy by mohli spravovať katalóg produktov, nákupný košík, proces platby a správu používateľských účtov. Toto všetko by mohli byť nezávislé mikro-frontendy.

Výhody mikro-frontendov:

Výzvy mikro-frontendov:

Čo je JavaScript Module Federation?

JavaScript Module Federation je funkcia Webpacku 5, ktorá umožňuje zdieľať kód medzi samostatne kompilovanými JavaScriptovými aplikáciami za behu. Umožňuje vám vystaviť časti vašej aplikácie ako „moduly“, ktoré môžu byť konzumované inými aplikáciami, bez potreby publikovať ich do centrálneho repozitára ako npm.

Predstavte si Module Federation ako spôsob vytvorenia federovaného ekosystému aplikácií, kde každá aplikácia môže prispievať vlastnou funkcionalitou a konzumovať funkcionalitu z iných aplikácií. Tým sa eliminuje potreba závislostí v čase kompilácie a umožňuje sa skutočne nezávislé nasadenie.

Napríklad, tím zodpovedný za dizajn systém môže vystaviť UI komponenty ako moduly a rôzne aplikačné tímy môžu tieto komponenty konzumovať priamo z aplikácie dizajn systému, bez potreby inštalovať ich ako npm balíčky. Keď tím dizajn systému aktualizuje komponenty, zmeny sa automaticky prejavia vo všetkých konzumujúcich aplikáciách.

Kľúčové koncepty v Module Federation:

Nastavenie Module Federation s Webpack 5: Praktický sprievodca

Poďme si prejsť praktický príklad nastavenia Module Federation s Webpack 5. Vytvoríme dve jednoduché aplikácie: Hostiteľskú (Host) aplikáciu a Vzdialenú (Remote) aplikáciu. Vzdialená aplikácia vystaví komponent a Hostiteľská aplikácia ho bude konzumovať.

1. Nastavenie projektu

Vytvorte dva samostatné adresáre pre vaše aplikácie: `host` a `remote`.

```bash mkdir host remote cd host npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom cd ../remote npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom ```

2. Konfigurácia vzdialenej aplikácie

V adresári `remote` vytvorte nasledujúce súbory:

src/index.js:

```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; import RemoteComponent from './RemoteComponent'; const App = () => (

Remote Application

); const root = ReactDOM.createRoot(document.getElementById('root')); root.render(); ```

src/RemoteComponent.jsx:

```javascript import React from 'react'; const RemoteComponent = () => (

This is a Remote Component!

Rendered from the Remote Application.

); export default RemoteComponent; ```

webpack.config.js:

```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3001, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'remote', filename: 'remoteEntry.js', exposes: { './RemoteComponent': './src/RemoteComponent', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```

Vytvorte `public/index.html` so základnou HTML štruktúrou. Dôležitý je `

`

3. Konfigurácia hostiteľskej aplikácie

V adresári `host` vytvorte nasledujúce súbory:

  • `src/index.js`: Vstupný bod aplikácie.
  • `webpack.config.js`: Konfiguračný súbor Webpacku.

src/index.js:

```javascript import React, { Suspense } from 'react'; import ReactDOM from 'react-dom/client'; const RemoteComponent = React.lazy(() => import('remote/RemoteComponent')); const App = () => (

Host Application

Loading Remote Component...
}>
); const root = ReactDOM.createRoot(document.getElementById('root')); root.render(); ```

webpack.config.js:

```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3000, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'host', remotes: { remote: 'remote@http://localhost:3001/remoteEntry.js', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```

Vytvorte `public/index.html` so základnou HTML štruktúrou (podobne ako v remote aplikácii). Dôležitý je `

`

4. Inštalácia Babel

V oboch adresároch, `host` aj `remote`, nainštalujte závislosti pre Babel:

```bash npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader ```

5. Spustenie aplikácií

V oboch adresároch, `host` aj `remote`, pridajte nasledujúci skript do `package.json`:

```json "scripts": { "start": "webpack serve" } ```

Teraz spustite obe aplikácie:

```bash cd remote npm start cd ../host npm start ```

Otvorte prehliadač a prejdite na `http://localhost:3000`. Mali by ste vidieť Hostiteľskú aplikáciu s vykresleným Vzdialeným komponentom vo vnútri.

Vysvetlenie kľúčových konfiguračných možností:

Pokročilé techniky Module Federation

Module Federation ponúka mnoho pokročilých funkcií, ktoré vám môžu pomôcť vybudovať ešte sofistikovanejšie mikro-frontendové architektúry.

Dynamické vzdialené aplikácie (Dynamic Remotes)

Namiesto pevného kódovania URL adries vzdialených aplikácií v konfigurácii Webpacku ich môžete načítať dynamicky za behu. To vám umožňuje ľahko aktualizovať umiestnenie vzdialených aplikácií bez nutnosti znovu zostavovať hostiteľskú aplikáciu.

Napríklad, URL adresy vzdialených aplikácií by ste mohli uložiť v konfiguračnom súbore alebo databáze a načítať ich dynamicky pomocou JavaScriptu.

```javascript // V webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Predpokladajme, že remoteUrl je niečo ako 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // kľúčom module federation je, že vzdialená aplikácia je // dostupná pod menom definovaným vo vzdialenej aplikácii resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Teraz môžete načítať hostiteľskú aplikáciu s parametrom dopytu `?remote=http://localhost:3001/remoteEntry.js`

Verziované zdieľané moduly

Module Federation dokáže automaticky spravovať verziovanie a deduplikáciu zdieľaných modulov, aby sa zabezpečilo, že sa načíta iba jedna kompatibilná verzia každého modulu. To je obzvlášť dôležité pri práci s veľkými a zložitými aplikáciami, ktoré majú veľa závislostí.

V konfigurácii Webpacku môžete špecifikovať rozsah verzií pre každý zdieľaný modul.

```javascript // V webpack.config.js shared: { react: { singleton: true, eager: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, eager: true, requiredVersion: '^18.0.0' }, }, ```

Vlastné načítavače modulov

Module Federation vám umožňuje definovať vlastné načítavače modulov, ktoré môžu byť použité na načítanie modulov z rôznych zdrojov alebo v rôznych formátoch. To môže byť užitočné na načítanie modulov z CDN alebo z vlastného registra modulov.

Zdieľanie stavu medzi mikro-frontendmi

Jednou z výziev mikro-frontendových architektúr je zdieľanie stavu medzi rôznymi mikro-frontendmi. Existuje niekoľko prístupov, ktoré môžete použiť na riešenie tejto výzvy:

Osvedčené postupy pre implementáciu mikro-frontendov s Module Federation

Tu sú niektoré osvedčené postupy, na ktoré treba pamätať pri implementácii mikro-frontendov s Module Federation:

Príklady použitia Module Federation v reálnom svete

Hoci špecifické prípadové štúdie sú často dôverné, tu sú niektoré zovšeobecnené scenáre, kde môže byť Module Federation neuveriteľne užitočná:

Záver

JavaScript Module Federation vo Webpack 5 poskytuje silný a flexibilný spôsob budovania mikro-frontendových architektúr. Umožňuje zdieľať kód medzi samostatne kompilovanými JavaScriptovými aplikáciami za behu, čo umožňuje nezávislé nasadenia, technologickú rozmanitosť a zlepšenú autonómiu tímov. Dodržiavaním osvedčených postupov uvedených v tomto sprievodcovi môžete využiť Module Federation na budovanie škálovateľných, udržiavateľných a inovatívnych webových aplikácií.

Budúcnosť frontendového vývoja sa nepochybne prikláňa k modulárnym a distribuovaným architektúram. Module Federation poskytuje kľúčový nástroj na budovanie týchto moderných systémov, ktorý umožňuje tímom vytvárať zložité aplikácie s väčšou rýchlosťou, flexibilitou a odolnosťou. Ako technológia dozrieva, môžeme očakávať, že sa objavia ešte inovatívnejšie prípady použitia a osvedčené postupy.

JavaScript Module Federation s Webpack 5: Komplexný sprievodca mikro-frontendmi | MLOG