Lietuvių

Atraskite mikro-priekinių sistemų galią su JavaScript modulių federacija Webpack 5. Išmokite kurti mastelio keitimui pritaikomas, prižiūrimas ir nepriklausomas žiniatinklio programas.

JavaScript modulių federacija su Webpack 5: išsamus mikro-priekinių sistemų vadovas

Nuolat besikeičiančiame žiniatinklio kūrimo pasaulyje didelių ir sudėtingų programų kūrimas gali būti didžiulis iššūkis. Tradicinės monolitinės architektūros dažnai lemia ilgesnį kūrimo laiką, diegimo kliūtis ir iššūkius palaikant kodo kokybę. Mikro-priekinės sistemos (angl. micro-frontends) iškilo kaip galingas architektūrinis modelis šiems iššūkiams spręsti, leidžiantis komandoms kurti ir diegti nepriklausomas didesnės žiniatinklio programos dalis. Viena iš perspektyviausių technologijų mikro-priekinėms sistemoms įgyvendinti yra JavaScript modulių federacija, pristatyta „Webpack 5“.

Kas yra mikro-priekinės sistemos?

Mikro-priekinės sistemos yra architektūrinis stilius, kai priekinės sistemos (angl. frontend) programa yra suskaidoma į mažesnius, nepriklausomus vienetus, kuriuos gali savarankiškai kurti, testuoti ir diegti skirtingos komandos. Kiekviena mikro-priekinė sistema yra atsakinga už konkretų verslo domeną ar funkciją, ir jos yra sujungiamos vykdymo metu (angl. runtime), kad sudarytų vientisą vartotojo sąsają.

Pagalvokite apie tai kaip apie įmonę: vietoj vienos didžiulės kūrėjų komandos turite kelias mažesnes komandas, kurios koncentruojasi į konkrečias sritis. Kiekviena komanda gali dirbti nepriklausomai, kas leidžia greičiau vykdyti kūrimo ciklus ir palengvina priežiūrą. Pavyzdžiui, didelėje elektroninės prekybos platformoje, tokioje kaip „Amazon“, skirtingos komandos gali valdyti produktų katalogą, pirkinių krepšelį, atsiskaitymo procesą ir vartotojo paskyros valdymą. Visa tai galėtų būti nepriklausomos mikro-priekinės sistemos.

Mikro-priekinių sistemų privalumai:

Mikro-priekinių sistemų iššūkiai:

Kas yra JavaScript modulių federacija?

JavaScript modulių federacija yra „Webpack 5“ funkcija, leidžianti dalytis kodu tarp atskirai sukompiliuotų JavaScript programų vykdymo metu. Ji suteikia galimybę atverti dalį jūsų programos kaip „modulius“, kuriuos gali naudoti kitos programos, nereikalaujant jų publikuoti centralizuotoje saugykloje, pavyzdžiui, npm.

Modulių federaciją galima įsivaizduoti kaip būdą sukurti federacinę programų ekosistemą, kurioje kiekviena programa gali prisidėti savo funkcionalumu ir naudoti kitų programų funkcionalumą. Tai pašalina poreikį turėti priklausomybes kūrimo metu (angl. build-time) ir leidžia vykdyti išties nepriklausomus diegimus.

Pavyzdžiui, dizaino sistemos komanda gali atverti vartotojo sąsajos komponentus kaip modulius, o skirtingos programų komandos gali naudoti šiuos komponentus tiesiogiai iš dizaino sistemos programos, nereikalaujant jų diegti kaip npm paketų. Kai dizaino sistemos komanda atnaujina komponentus, pakeitimai automatiškai atsispindi visose juos naudojančiose programose.

Pagrindinės modulių federacijos sąvokos:

Modulių federacijos nustatymas su Webpack 5: praktinis vadovas

Panagrinėkime praktinį pavyzdį, kaip nustatyti modulių federaciją su „Webpack 5“. Sukursime dvi paprastas programas: pagrindinę (Host) programą ir nuotolinę (Remote) programą. Nuotolinė programa atvers komponentą, o pagrindinė programa jį naudos.

1. Projekto paruošimas

Sukurkite du atskirus katalogus savo programoms: `host` ir `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. Nuotolinės programos konfigūracija

`remote` kataloge sukurkite šiuos failus:

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

Tai yra nuotolinis komponentas!

Atvaizduotas iš nuotolinės programos.

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

Sukurkite `public/index.html` su bazine HTML struktūra. Svarbu, kad būtų `

`

3. Pagrindinės programos konfigūracija

`host` kataloge sukurkite šiuos failus:

  • `src/index.js`: Programos įvesties taškas.
  • `webpack.config.js`: „Webpack“ konfigūracijos failas.

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

Įkeliamas nuotolinis komponentas...
}>
); 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'], }, }; ```

Sukurkite `public/index.html` su bazine HTML struktūra (panašiai kaip nuotolinėje programoje). Svarbu, kad būtų `

`

4. Įdiekite „Babel“

Tiek `host`, tiek `remote` kataloguose įdiekite „Babel“ priklausomybes:

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

5. Paleiskite programas

Tiek `host`, tiek `remote` kataloguose pridėkite šį scenarijų į `package.json`:

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

Dabar paleiskite abi programas:

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

Atidarykite naršyklę ir eikite į `http://localhost:3000`. Turėtumėte pamatyti pagrindinę programą, kurios viduje atvaizduotas nuotolinis komponentas.

Pagrindinių konfigūracijos parinkčių paaiškinimas:

Pažangios modulių federacijos technikos

Modulių federacija siūlo daug pažangių funkcijų, kurios gali padėti kurti dar sudėtingesnes mikro-priekinių sistemų architektūras.

Dinaminės nuotolinės programos

Užuot griežtai nurodžius nuotolinių programų URL adresus „Webpack“ konfigūracijoje, galite juos įkelti dinamiškai vykdymo metu. Tai leidžia lengvai atnaujinti nuotolinių programų vietą, nereikalaujant perkurti pagrindinės programos.

Pavyzdžiui, galite saugoti nuotolinių programų URL adresus konfigūracijos faile arba duomenų bazėje ir įkelti juos dinamiškai naudojant JavaScript.

```javascript // webpack.config.js faile remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Tarkime, remoteUrl yra kažkas panašaus į 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // modulių federacijos esmė yra ta, kad nuotolinė programa yra // pasiekiama naudojant pavadinimą, nurodytą nuotolinėje programoje resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Dabar galite įkelti pagrindinę programą su užklausos parametru `?remote=http://localhost:3001/remoteEntry.js`

Bendrinami moduliai su versijavimu

Modulių federacija gali automatiškai tvarkyti bendrinamų modulių versijavimą ir dublikatų šalinimą, kad būtų įkelta tik viena suderinama kiekvieno modulio versija. Tai ypač svarbu dirbant su didelėmis ir sudėtingomis programomis, turinčiomis daug priklausomybių.

Galite nurodyti kiekvieno bendrinamo modulio versijų diapazoną „Webpack“ konfigūracijoje.

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

Individualūs modulių įkėlėjai

Modulių federacija leidžia apibrėžti individualius modulių įkėlėjus, kuriuos galima naudoti moduliams iš skirtingų šaltinių ar skirtingais formatais įkelti. Tai gali būti naudinga įkeliant modulius iš CDN arba iš individualaus modulių registro.

Būsenos bendrinimas tarp mikro-priekinių sistemų

Vienas iš mikro-priekinių sistemų architektūrų iššūkių yra būsenos bendrinimas tarp skirtingų mikro-priekinių sistemų. Yra keletas būdų, kaip spręsti šį iššūkį:

Geriausios praktikos diegiant mikro-priekines sistemas su modulių federacija

Štai keletas geriausių praktikų, kurias verta prisiminti diegiant mikro-priekines sistemas su modulių federacija:

Realaus pasaulio modulių federacijos pavyzdžiai

Nors konkretūs atvejų tyrimai dažnai yra konfidencialūs, štai keletas apibendrintų scenarijų, kur modulių federacija gali būti nepaprastai naudinga:

Išvada

JavaScript modulių federacija „Webpack 5“ suteikia galingą ir lankstų būdą kurti mikro-priekinių sistemų architektūras. Ji leidžia dalytis kodu tarp atskirai sukompiliuotų JavaScript programų vykdymo metu, sudarant sąlygas nepriklausomam diegimui, technologijų įvairovei ir didesnei komandų autonomijai. Laikydamiesi šiame vadove aprašytų geriausių praktikų, galite pasinaudoti modulių federacija kurdami mastelio keitimui pritaikomas, prižiūrimas ir inovatyvias žiniatinklio programas.

Priekinių sistemų kūrimo ateitis neabejotinai krypsta link modulinių ir paskirstytų architektūrų. Modulių federacija suteikia esminį įrankį šioms modernioms sistemoms kurti, leidžiantį komandoms greičiau, lanksčiau ir atspariau kurti sudėtingas programas. Technologijai bręstant, galime tikėtis dar daugiau inovatyvių jos panaudojimo atvejų ir geriausių praktikų atsiradimo.