O'zbek

Webpack 5'dagi JavaScript Module Federation yordamida mikro-frontendlar imkoniyatlarini oching. Masshtablanuvchi, qo'llab-quvvatlanadigan va mustaqil veb-ilovalar yaratishni o'rganing.

Webpack 5 bilan JavaScript Module Federation: Mikro-frontendlar uchun keng qamrovli qo'llanma

Doimiy rivojlanib borayotgan veb-dasturlash sohasida katta va murakkab ilovalarni yaratish qiyin vazifa bo'lishi mumkin. An'anaviy monolit arxitekturalar ko'pincha dasturlash vaqtining uzayishiga, joylashtirishdagi to'siqlarga va kod sifatini saqlashdagi qiyinchiliklarga olib keladi. Mikro-frontendlar bu muammolarni hal qilish uchun kuchli arxitektura namunasi sifatida paydo bo'ldi, bu jamoalarga katta veb-ilovaning mustaqil qismlarini yaratish va joylashtirish imkonini beradi. Mikro-frontendlarni amalga oshirish uchun eng istiqbolli texnologiyalardan biri bu Webpack 5 da taqdim etilgan JavaScript Module Federationdir.

Mikro-frontendlar nima?

Mikro-frontendlar - bu frontend ilovasi kichikroq, mustaqil birliklarga ajratiladigan arxitektura uslubi bo'lib, ular turli jamoalar tomonidan avtonom ravishda ishlab chiqilishi, sinovdan o'tkazilishi va joylashtirilishi mumkin. Har bir mikro-frontend ma'lum bir biznes sohasi yoki funksiya uchun mas'uldir va ular ish vaqtida birgalikda yig'ilib, to'liq foydalanuvchi interfeysini tashkil qiladi.

Buni kompaniya kabi tasavvur qiling: bitta ulkan dasturchilar jamoasi o'rniga, sizda ma'lum sohalarga e'tibor qaratadigan bir nechta kichik jamoalar mavjud. Har bir jamoa mustaqil ishlay oladi, bu esa tezroq ishlab chiqish sikllari va osonroq texnik xizmat ko'rsatish imkonini beradi. Amazon kabi yirik elektron tijorat platformasini ko'rib chiqing; turli jamoalar mahsulotlar katalogi, xarid savati, to'lov jarayoni va foydalanuvchi hisobini boshqarishi mumkin. Bularning barchasi mustaqil mikro-frontendlar bo'lishi mumkin.

Mikro-frontendlarning afzalliklari:

Mikro-frontendlarning qiyinchiliklari:

JavaScript Module Federation nima?

JavaScript Module Federation - bu Webpack 5 xususiyati bo'lib, u ish vaqtida alohida kompilyatsiya qilingan JavaScript ilovalari o'rtasida kod almashish imkonini beradi. U sizga ilovangizning qismlarini boshqa ilovalar tomonidan iste'mol qilinishi mumkin bo'lgan "modullar" sifatida ochib berishga imkon beradi, bunda npm kabi markaziy repozitoriyga nashr etish shart emas.

Module Federation'ni ilovalarning federativ ekotizimini yaratish usuli deb o'ylang, bunda har bir ilova o'z funksionalligini qo'shishi va boshqa ilovalarning funksionalligidan foydalanishi mumkin. Bu kompilyatsiya vaqtidagi bog'liqliklarga bo'lgan ehtiyojni yo'qotadi va haqiqatan ham mustaqil joylashtirish imkonini beradi.

Masalan, dizayn tizimi jamoasi UI komponentlarini modullar sifatida ochib berishi mumkin va turli ilova jamoalari bu komponentlarni npm paketlari sifatida o'rnatmasdan to'g'ridan-to'g'ri dizayn tizimi ilovasidan iste'mol qilishlari mumkin. Dizayn tizimi jamoasi komponentlarni yangilaganida, o'zgarishlar barcha iste'mol qiluvchi ilovalarda avtomatik ravishda aks etadi.

Module Federation'dagi asosiy tushunchalar:

Webpack 5 bilan Module Federation'ni sozlash: Amaliy qo'llanma

Keling, Webpack 5 bilan Module Federation'ni sozlashning amaliy misolini ko'rib chiqamiz. Biz ikkita oddiy ilova yaratamiz: bir Host ilovasi va bir Remote ilovasi. Remote ilovasi bir komponentni ochib beradi va Host ilovasi uni iste'mol qiladi.

1. Loyihani sozlash

Ilovalaringiz uchun ikkita alohida papka yarating: `host` va `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 ilovasini sozlash

`remote` papkasida quyidagi fayllarni yarating:

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

Oddiy HTML tuzilishiga ega `public/index.html` faylini yarating. Muhim qismi - `

`

3. Host ilovasini sozlash

`host` papkasida quyidagi fayllarni yarating:

  • `src/index.js`: Ilovaning kirish nuqtasi.
  • `webpack.config.js`: Webpack sozlash fayli.

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

Oddiy HTML tuzilishiga ega `public/index.html` faylini yarating (remote ilovasiga o'xshash). Muhim qismi - `

`

4. Babel'ni o'rnatish

`host` va `remote` papkalarining ikkalasida ham Babel bog'liqliklarini o'rnating:

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

5. Ilovalarni ishga tushirish

`host` va `remote` papkalarining ikkalasida ham `package.json` fayliga quyidagi skriptni qo'shing:

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

Endi ikkala ilovani ham ishga tushiring:

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

Brauzeringizni oching va `http://localhost:3000` manziliga o'ting. Siz Host ilovasining ichida render qilingan Remote komponentini ko'rishingiz kerak.

Asosiy sozlash parametrlari izohi:

Module Federation'ning ilg'or usullari

Module Federation yanada murakkab mikro-frontend arxitekturalarini yaratishga yordam beradigan ko'plab ilg'or xususiyatlarni taklif etadi.

Dinamik Remotelar

Webpack sozlamalarida masofaviy ilovalarning URL manzillarini qat'iy belgilash o'rniga, ularni ish vaqtida dinamik ravishda yuklashingiz mumkin. Bu sizga host ilovasini qayta kompilyatsiya qilmasdan masofaviy ilovalarning joylashuvini osongina yangilash imkonini beradi.

Masalan, siz masofaviy ilovalarning URL manzillarini konfiguratsiya faylida yoki ma'lumotlar bazasida saqlashingiz va ularni JavaScript yordamida dinamik ravishda yuklashingiz mumkin.

```javascript // webpack.config.js ichida remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // remoteUrl 'http://localhost:3001/remoteEntry.js' kabi deb faraz qilaylik const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // modul federatsiyasining kaliti shundaki, masofaviy ilova // remote'dagi nom orqali mavjud bo'ladi resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Endi siz host ilovasini `?remote=http://localhost:3001/remoteEntry.js` so'rov parametri bilan yuklashingiz mumkin.

Versiyalangan umumiy modullar

Module Federation har bir modulning faqat bitta mos versiyasi yuklanishini ta'minlash uchun umumiy modullarning versiyalanishi va takrorlanishini avtomatik ravishda boshqarishi mumkin. Bu, ayniqsa, ko'plab bog'liqliklarga ega bo'lgan katta va murakkab ilovalar bilan ishlashda muhimdir.

Siz Webpack sozlamalarida har bir umumiy modulning versiya diapazonini belgilashingiz mumkin.

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

Maxsus modul yuklovchilar

Module Federation sizga turli manbalardan yoki turli formatlarda modullarni yuklash uchun ishlatilishi mumkin bo'lgan maxsus modul yuklovchilarni aniqlash imkonini beradi. Bu CDN'dan yoki maxsus modul reestridan modullarni yuklash uchun foydali bo'lishi mumkin.

Mikro-frontendlar o'rtasida holatni ulashish

Mikro-frontend arxitekturalarining qiyinchiliklaridan biri bu turli mikro-frontendlar o'rtasida holatni ulashishdir. Bu muammoni hal qilish uchun siz bir nechta yondashuvlardan foydalanishingiz mumkin:

Module Federation bilan mikro-frontendlarni amalga oshirishning eng yaxshi amaliyotlari

Module Federation bilan mikro-frontendlarni amalga oshirishda yodda tutish kerak bo'lgan ba'zi eng yaxshi amaliyotlar:

Amaliyotda Module Federation'ning real hayotdagi misollari

Maxsus keys-stadilar ko'pincha maxfiy bo'lsa-da, bu yerda Module Federation juda foydali bo'lishi mumkin bo'lgan ba'zi umumlashtirilgan stsenariylar keltirilgan:

Xulosa

Webpack 5'dagi JavaScript Module Federation mikro-frontend arxitekturalarini yaratishning kuchli va moslashuvchan usulini taqdim etadi. U ish vaqtida alohida kompilyatsiya qilingan JavaScript ilovalari o'rtasida kod almashish imkonini beradi, bu esa mustaqil joylashtirish, texnologik xilma-xillik va jamoa avtonomiyasini yaxshilashga yordam beradi. Ushbu qo'llanmada keltirilgan eng yaxshi amaliyotlarga rioya qilish orqali siz Module Federation'dan foydalanib masshtablanuvchi, qo'llab-quvvatlanadigan va innovatsion veb-ilovalarni yaratishingiz mumkin.

Frontend dasturlashning kelajagi, shubhasiz, modulli va taqsimlangan arxitekturalarga moyil bo'lmoqda. Module Federation ushbu zamonaviy tizimlarni yaratish uchun muhim vositani taqdim etadi, bu jamoalarga murakkab ilovalarni katta tezlik, moslashuvchanlik va chidamlilik bilan yaratish imkonini beradi. Texnologiya yetuklashgani sari, biz yanada innovatsion foydalanish holatlari va eng yaxshi amaliyotlar paydo bo'lishini kutishimiz mumkin.