Hrvatski

Otključajte moć mikro-frontenda s JavaScript Module Federation u Webpacku 5. Naučite kako izgraditi skalabilne, održive i neovisne web aplikacije.

JavaScript Module Federation s Webpack 5: Sveobuhvatni Vodič za Mikro-frontende

U svijetu web razvoja koji se neprestano mijenja, izrada velikih i složenih aplikacija može biti zastrašujući zadatak. Tradicionalne monolitne arhitekture često dovode do produljenog vremena razvoja, uskih grla pri implementaciji i izazova u održavanju kvalitete koda. Mikro-frontendi su se pojavili kao moćan arhitektonski obrazac za rješavanje ovih izazova, omogućujući timovima da grade i implementiraju neovisne dijelove veće web aplikacije. Jedna od najperspektivnijih tehnologija za implementaciju mikro-frontenda je JavaScript Module Federation, predstavljena u Webpacku 5.

Što su Mikro-frontendi?

Mikro-frontendi su arhitektonski stil u kojem se frontend aplikacija razlaže na manje, neovisne jedinice koje različiti timovi mogu autonomno razvijati, testirati i implementirati. Svaki mikro-frontend odgovoran je za određenu poslovnu domenu ili značajku, a sastavljaju se zajedno u stvarnom vremenu kako bi formirali cjelovito korisničko sučelje.

Zamislite to kao tvrtku: umjesto jednog ogromnog razvojnog tima, imate više manjih timova koji se fokusiraju na određena područja. Svaki tim može raditi neovisno, što omogućuje brže razvojne cikluse i lakše održavanje. Uzmimo za primjer veliku e-commerce platformu poput Amazona; različiti timovi mogu upravljati katalogom proizvoda, košaricom, procesom naplate i upravljanjem korisničkim računima. Sve to mogu biti neovisni mikro-frontendi.

Prednosti Mikro-frontenda:

Izazovi Mikro-frontenda:

Što je JavaScript Module Federation?

JavaScript Module Federation je značajka Webpacka 5 koja omogućuje dijeljenje koda između zasebno kompajliranih JavaScript aplikacija u stvarnom vremenu. Omogućuje vam da izložite dijelove svoje aplikacije kao "module" koje druge aplikacije mogu koristiti, bez potrebe za objavljivanjem u središnjem repozitoriju poput npm-a.

Zamislite Module Federation kao način stvaranja federiranog ekosustava aplikacija, gdje svaka aplikacija može doprinijeti vlastitom funkcionalnošću i koristiti funkcionalnost drugih aplikacija. To eliminira potrebu za ovisnostima u vrijeme izgradnje (build-time) i omogućuje istinski neovisne implementacije.

Na primjer, tim za sustav dizajna može izložiti UI komponente kao module, a različiti timovi aplikacija mogu te komponente koristiti izravno iz aplikacije sustava dizajna, bez potrebe da ih instaliraju kao npm pakete. Kada tim za sustav dizajna ažurira komponente, promjene se automatski odražavaju u svim aplikacijama koje ih koriste.

Ključni koncepti u Module Federationu:

Postavljanje Module Federationa s Webpackom 5: Praktični Vodič

Prođimo kroz praktičan primjer postavljanja Module Federationa s Webpackom 5. Stvorit ćemo dvije jednostavne aplikacije: Host (domaćin) aplikaciju i Remote (udaljenu) aplikaciju. Remote aplikacija će izložiti komponentu, a Host aplikacija će je koristiti.

1. Postavljanje projekta

Stvorite dva odvojena direktorija za svoje aplikacije: `host` i `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. Konfiguracija Remote aplikacije

U `remote` direktoriju stvorite sljedeće datoteke:

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 = () => (

Ovo je Remote komponenta!

Renderirano iz Remote aplikacije.

); 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'], }, }; ```

Stvorite `public/index.html` s osnovnom HTML strukturom. Važno je imati `

`

3. Konfiguracija Host aplikacije

U `host` direktoriju stvorite sljedeće datoteke:

  • `src/index.js`: Ulazna točka za aplikaciju.
  • `webpack.config.js`: Webpack konfiguracijska datoteka.

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

Učitavanje Remote komponente...
}>
); 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'], }, }; ```

Stvorite `public/index.html` s osnovnom HTML strukturom (slično kao remote aplikacija). Važno je imati `

`

4. Instalacija Babela

U oba direktorija, `host` i `remote`, instalirajte Babel ovisnosti:

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

5. Pokretanje aplikacija

U oba direktorija, `host` i `remote`, dodajte sljedeću skriptu u `package.json`:

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

Sada pokrenite obje aplikacije:

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

Otvorite preglednik i idite na `http://localhost:3000`. Trebali biste vidjeti Host aplikaciju s Remote komponentom renderiranom unutar nje.

Objašnjenje ključnih opcija konfiguracije:

Napredne tehnike Module Federationa

Module Federation nudi mnoge napredne značajke koje vam mogu pomoći u izgradnji još sofisticiranijih mikro-frontend arhitektura.

Dinamički Remotes

Umjesto da "hardkodirate" URL-ove remote aplikacija u Webpack konfiguraciji, možete ih učitavati dinamički u stvarnom vremenu. To vam omogućuje jednostavno ažuriranje lokacije remote aplikacija bez potrebe za ponovnom izgradnjom host aplikacije.

Na primjer, mogli biste pohraniti URL-ove remote aplikacija u konfiguracijskoj datoteci ili bazi podataka i učitavati ih dinamički pomoću JavaScripta.

```javascript // In webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Pretpostavimo da je remoteUrl nešto poput 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // ključ module federationa je da je remote aplikacija // dostupna pod imenom definiranim u remote aplikaciji resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Sada možete učitati host aplikaciju s query parametrom `?remote=http://localhost:3001/remoteEntry.js`

Verzionirani dijeljeni moduli

Module Federation može automatski upravljati verzioniranjem i deduplikacijom dijeljenih modula kako bi se osiguralo da se učitava samo jedna kompatibilna verzija svakog modula. To je posebno važno kod rada s velikim i složenim aplikacijama koje imaju mnogo ovisnosti.

Možete specificirati raspon verzija svakog dijeljenog modula u Webpack konfiguraciji.

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

Prilagođeni učitavači modula (Module Loaders)

Module Federation omogućuje definiranje prilagođenih učitavača modula koji se mogu koristiti za učitavanje modula iz različitih izvora ili u različitim formatima. To može biti korisno za učitavanje modula s CDN-a ili iz prilagođenog registra modula.

Dijeljenje stanja između Mikro-frontenda

Jedan od izazova mikro-frontend arhitektura je dijeljenje stanja između različitih mikro-frontenda. Postoji nekoliko pristupa kojima možete riješiti ovaj izazov:

Najbolje prakse za implementaciju Mikro-frontenda s Module Federationom

Evo nekoliko najboljih praksi koje treba imati na umu prilikom implementacije mikro-frontenda s Module Federationom:

Primjeri iz stvarnog svijeta primjene Module Federationa

Iako su specifične studije slučaja često povjerljive, evo nekoliko općenitih scenarija u kojima Module Federation može biti izuzetno koristan:

Zaključak

JavaScript Module Federation u Webpacku 5 pruža moćan i fleksibilan način za izgradnju mikro-frontend arhitektura. Omogućuje dijeljenje koda između zasebno kompajliranih JavaScript aplikacija u stvarnom vremenu, omogućujući neovisne implementacije, tehnološku raznolikost i poboljšanu autonomiju tima. Slijedeći najbolje prakse navedene u ovom vodiču, možete iskoristiti Module Federation za izgradnju skalabilnih, održivih i inovativnih web aplikacija.

Budućnost frontend razvoja nedvojbeno se naginje prema modularnim i distribuiranim arhitekturama. Module Federation pruža ključan alat za izgradnju ovih modernih sustava, omogućujući timovima da stvaraju složene aplikacije s većom brzinom, fleksibilnošću i otpornošću. Kako tehnologija sazrijeva, možemo očekivati pojavu još inovativnijih primjena i najboljih praksi.