Eesti

Avage mikro-frontendide võimsus JavaScript Module Federationi abil Webpack 5-s. Õppige, kuidas ehitada skaleeritavaid, hooldatavaid ja iseseisvaid veebirakendusi.

JavaScript Module Federation Webpack 5-ga: Põhjalik Juhend Mikro-frontendidest

Pidevalt arenevas veebiarenduse maastikul võib suurte ja keerukate rakenduste ehitamine olla hirmutav ülesanne. Traditsioonilised monoliitsed arhitektuurid toovad sageli kaasa pikema arendusaja, juurutamise kitsaskohad ja väljakutsed koodikvaliteedi säilitamisel. Mikro-frontendid on esile kerkinud võimsa arhitektuurimustrina, et neid väljakutseid lahendada, võimaldades meeskondadel ehitada ja juurutada suurema veebirakenduse iseseisvaid osi. Üks lootustandvamaid tehnoloogiaid mikro-frontendide rakendamiseks on JavaScript Module Federation, mis tutvustati Webpack 5-s.

Mis on mikro-frontendid?

Mikro-frontendid on arhitektuuristiil, kus frontend-rakendus jaotatakse väiksemateks, iseseisvateks üksusteks, mida erinevad meeskonnad saavad autonoomselt arendada, testida ja juurutada. Iga mikro-frontend vastutab konkreetse ärivaldkonna või funktsiooni eest ning need koostatakse käitusajal kokku, et moodustada täielik kasutajaliides.

Mõelge sellest kui ettevõttest: selle asemel, et omada üht hiiglaslikku arendusmeeskonda, on teil mitu väiksemat meeskonda, mis keskenduvad konkreetsetele valdkondadele. Iga meeskond saab töötada iseseisvalt, mis võimaldab kiiremaid arendustsükleid ja lihtsamat hooldust. Kujutage ette suurt e-kaubanduse platvormi nagu Amazon; erinevad meeskonnad võivad hallata tootekataloogi, ostukorvi, kassaprotsessi ja kasutajakonto haldust. Need kõik võiksid olla iseseisvad mikro-frontendid.

Mikro-frontendide eelised:

Mikro-frontendide väljakutsed:

Mis on JavaScript Module Federation?

JavaScript Module Federation on Webpack 5 funktsioon, mis võimaldab teil käitusajal jagada koodi eraldi kompileeritud JavaScripti rakenduste vahel. See võimaldab teil paljastada oma rakenduse osi "moodulitena", mida teised rakendused saavad tarbida, ilma et peaksite neid avaldama kesksesse hoidlasse nagu npm.

Mõelge Module Federationist kui viisist luua födereeritud rakenduste ökosüsteem, kus iga rakendus saab panustada oma funktsionaalsusega ja tarbida funktsionaalsust teistelt rakendustelt. See välistab vajaduse kompileerimisaegsete sõltuvuste järele ja võimaldab tõeliselt iseseisvaid juurutusi.

Näiteks saab disainisüsteemi meeskond paljastada UI komponente moodulitena ja erinevad rakenduste meeskonnad saavad neid komponente tarbida otse disainisüsteemi rakendusest, ilma et peaksid neid npm-pakettidena installima. Kui disainisüsteemi meeskond komponente uuendab, kajastuvad muudatused automaatselt kõigis tarbivates rakendustes.

Module Federationi põhimõisted:

Module Federationi seadistamine Webpack 5-ga: Praktiline juhend

Vaatame läbi praktilise näite Module Federationi seadistamisest Webpack 5-ga. Loome kaks lihtsat rakendust: Host rakenduse ja Remote rakenduse. Remote-rakendus paljastab komponendi ja Host-rakendus tarbib seda.

1. Projekti seadistamine

Looge oma rakenduste jaoks kaks eraldi kataloogi: `host` ja `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. Remote-rakenduse seadistamine

Kataloogis `remote` looge järgmised failid:

src/index.js:

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

Remote Rakendus

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

src/RemoteComponent.jsx:

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

See on Remote Komponent!

Renderdatud Remote-rakendusest.

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

Looge `public/index.html` fail põhilise HTML struktuuriga. Oluline on `

`

3. Host-rakenduse seadistamine

Kataloogis `host` looge järgmised failid:

  • `src/index.js`: Rakenduse sisenemispunkt.
  • `webpack.config.js`: Webpacki seadistusfail.

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 Rakendus

Laen Remote Komponenti...
}>
); 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'], }, }; ```

Looge `public/index.html` fail põhilise HTML struktuuriga (sarnaselt remote-rakendusele). Oluline on `

`

4. Installi Babel

Nii `host` kui ka `remote` kataloogides installige Babeli sõltuvused:

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

5. Käivitage rakendused

Nii `host` kui ka `remote` kataloogides lisage `package.json` faili järgmine skript:

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

Nüüd käivitage mõlemad rakendused:

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

Avage oma brauser ja navigeerige aadressile `http://localhost:3000`. Peaksite nägema Host-rakendust, mille sees on renderdatud Remote-komponent.

Põhiseadistusvalikute selgitus:

Edasijõudnud Module Federation tehnikad

Module Federation pakub palju edasijõudnud funktsioone, mis aitavad teil ehitada veelgi keerukamaid mikro-frontend arhitektuure.

Dünaamilised remote'id

Selle asemel, et remote-rakenduste URL-e Webpacki seadistuses kõvakodeerida, saate neid käitusajal dünaamiliselt laadida. See võimaldab teil hõlpsasti uuendada remote-rakenduste asukohta, ilma et peaksite host-rakendust uuesti ehitama.

Näiteks võite salvestada remote-rakenduste URL-id konfiguratsioonifaili või andmebaasi ja laadida need dünaamiliselt JavaScripti abil.

```javascript // In webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Eeldame, et remoteUrl on midagi sarnast 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // module federationi võti on see, et remote-rakendus on // kättesaadav remote'is määratud nime kaudu resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Nüüd saate laadida host-rakenduse päringu parameetriga `?remote=http://localhost:3001/remoteEntry.js`

Versioonitud jagatud moodulid

Module Federation suudab automaatselt hallata jagatud moodulite versioonimist ja dubleerimise vältimist, et tagada ainult ühe ühilduva versiooni laadimine igast moodulist. See on eriti oluline suurte ja keerukate rakenduste puhul, millel on palju sõltuvusi.

Saate määrata iga jagatud mooduli versioonivahemiku Webpacki seadistuses.

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

Kohandatud moodulilaadijad

Module Federation võimaldab teil määratleda kohandatud moodulilaadijaid, mida saab kasutada moodulite laadimiseks erinevatest allikatest või erinevates vormingutes. See võib olla kasulik moodulite laadimiseks CDN-ist või kohandatud mooduliregistrist.

Oleku jagamine mikro-frontendide vahel

Üks mikro-frontend arhitektuuride väljakutseid on oleku jagamine erinevate mikro-frontendide vahel. Selle väljakutse lahendamiseks on mitu lähenemisviisi:

Parimad praktikad mikro-frontendide rakendamiseks Module Federationiga

Siin on mõned parimad praktikad, mida meeles pidada mikro-frontendide rakendamisel Module Federationiga:

Reaalse maailma näited Module Federationi kasutamisest

Kuigi konkreetsed juhtumiuuringud on sageli konfidentsiaalsed, on siin mõned üldistatud stsenaariumid, kus Module Federation võib olla uskumatult kasulik:

Kokkuvõte

JavaScript Module Federation Webpack 5-s pakub võimsat ja paindlikku viisi mikro-frontend arhitektuuride ehitamiseks. See võimaldab teil jagada koodi eraldi kompileeritud JavaScripti rakenduste vahel käitusajal, võimaldades iseseisvaid juurutusi, tehnoloogilist mitmekesisust ja paremat meeskonna autonoomiat. Järgides selles juhendis toodud parimaid praktikaid, saate Module Federationi abil ehitada skaleeritavaid, hooldatavaid ja uuenduslikke veebirakendusi.

Frontend-arenduse tulevik kaldub kahtlemata modulaarsete ja hajutatud arhitektuuride poole. Module Federation pakub olulist tööriista nende kaasaegsete süsteemide ehitamiseks, võimaldades meeskondadel luua keerukaid rakendusi suurema kiiruse, paindlikkuse ja vastupidavusega. Tehnoloogia küpsedes võime oodata veelgi uuenduslikumate kasutusjuhtude ja parimate praktikate esilekerkimist.