قدرت میکروسرویسهای فرانتاند را با فدراسیون ماژول جاوااسکریپت در Webpack 5 آزاد کنید. ساخت اپلیکیشنهای وب مقیاسپذیر، قابل نگهداری و مستقل را بیاموزید.
فدراسیون ماژول جاوااسکریپت با Webpack 5: راهنمای جامع میکروسرویسهای فرانتاند
در چشمانداز همیشه در حال تحول توسعه وب، ساخت اپلیکیشنهای بزرگ و پیچیده میتواند یک کار دلهرهآور باشد. معماریهای یکپارچه (monolithic) سنتی اغلب منجر به افزایش زمان توسعه، گلوگاههای استقرار و چالشهایی در حفظ کیفیت کد میشوند. میکروسرویسهای فرانتاند به عنوان یک الگوی معماری قدرتمند برای مقابله با این چالشها ظهور کردهاند که به تیمها اجازه میدهد بخشهای مستقلی از یک اپلیکیشن وب بزرگتر را بسازند و مستقر کنند. یکی از امیدوارکنندهترین فناوریها برای پیادهسازی میکروسرویسهای فرانتاند، فدراسیون ماژول جاوااسکریپت (JavaScript Module Federation) است که در Webpack 5 معرفی شد.
میکروسرویسهای فرانتاند (Micro-frontends) چیستند؟
میکروسرویسهای فرانتاند یک سبک معماری هستند که در آن یک اپلیکیشن فرانتاند به واحدهای کوچکتر و مستقل تجزیه میشود که میتوانند توسط تیمهای مختلف به صورت خودکار توسعه، تست و مستقر شوند. هر میکروسرویس فرانتاند مسئول یک حوزه کسبوکار یا ویژگی خاص است و آنها در زمان اجرا با هم ترکیب میشوند تا رابط کاربری کامل را تشکیل دهند.
آن را مانند یک شرکت در نظر بگیرید: به جای داشتن یک تیم توسعه غولپیکر، چندین تیم کوچکتر دارید که روی حوزههای خاصی تمرکز میکنند. هر تیم میتواند به طور مستقل کار کند که این امر به چرخههای توسعه سریعتر و نگهداری آسانتر منجر میشود. یک پلتفرم تجارت الکترونیک بزرگ مانند آمازون را در نظر بگیرید؛ تیمهای مختلف ممکن است کاتالوگ محصولات، سبد خرید، فرآیند پرداخت و مدیریت حساب کاربری را مدیریت کنند. همه اینها میتوانند میکروسرویسهای فرانتاند مستقل باشند.
مزایای میکروسرویسهای فرانتاند:
- استقرارهای مستقل: تیمها میتوانند میکروسرویسهای فرانتاند خود را به طور مستقل و بدون تأثیر بر سایر بخشهای اپلیکیشن مستقر کنند. این کار ریسک استقرار را کاهش داده و چرخههای انتشار سریعتری را ممکن میسازد.
- عدم وابستگی به فناوری: میکروسرویسهای فرانتاند مختلف میتوانند با استفاده از فناوریها یا فریمورکهای متفاوتی (مانند React، Angular، Vue.js) ساخته شوند. این به تیمها اجازه میدهد بهترین فناوری را برای نیازهای خاص خود انتخاب کنند و به تدریج فناوریهای جدید را بدون نیاز به بازنویسی کل اپلیکیشن بپذیرند. تصور کنید یک تیم از React برای کاتالوگ محصولات، تیم دیگر از Vue.js برای صفحات فرود بازاریابی و تیم سوم از Angular برای فرآیند پرداخت استفاده میکند.
- افزایش استقلال تیم: تیمها مالکیت کامل میکروسرویسهای فرانتاند خود را دارند که منجر به افزایش استقلال، تصمیمگیری سریعتر و بهبود بهرهوری توسعهدهندگان میشود.
- افزایش مقیاسپذیری: میکروسرویسهای فرانتاند به شما اجازه میدهند تا با استقرار هر میکروسرویس فرانتاند روی سرورهای مختلف، اپلیکیشن خود را به صورت افقی مقیاسپذیر کنید.
- قابلیت استفاده مجدد از کد: کامپوننتها و کتابخانههای اشتراکی میتوانند به راحتی بین میکروسرویسهای فرانتاند به اشتراک گذاشته شوند.
- نگهداری آسانتر: کدهای کوچکتر به طور کلی برای درک، نگهداری و اشکالزدایی آسانتر هستند.
چالشهای میکروسرویسهای فرانتاند:
- پیچیدگی افزایشیافته: مدیریت چندین میکروسرویس فرانتاند میتواند به پیچیدگی کلی معماری اضافه کند، به خصوص از نظر ارتباطات، مدیریت وضعیت (state) و استقرار.
- سربار عملکرد: بارگذاری چندین میکروسرویس فرانتاند میتواند سربار عملکردی ایجاد کند، به ویژه اگر به درستی بهینهسازی نشده باشند.
- نگرانیهای مشترک (Cross-Cutting Concerns): مدیریت نگرانیهای مشترک مانند احراز هویت، مجوزدهی و تمبندی میتواند در یک معماری میکروسرویس فرانتاند چالشبرانگیز باشد.
- سربار عملیاتی: نیازمند شیوهها و زیرساختهای DevOps بالغ برای مدیریت استقرار و نظارت بر چندین میکروسرویس فرانتاند است.
فدراسیون ماژول جاوااسکریپت چیست؟
فدراسیون ماژول جاوااسکریپت یک ویژگی Webpack 5 است که به شما اجازه میدهد کد را بین اپلیکیشنهای جاوااسکریپت که به طور جداگانه کامپایل شدهاند در زمان اجرا به اشتراک بگذارید. این ویژگی به شما امکان میدهد بخشهایی از اپلیکیشن خود را به عنوان «ماژول» در معرض دید قرار دهید تا توسط اپلیکیشنهای دیگر مصرف شوند، بدون اینکه نیازی به انتشار آنها در یک مخزن مرکزی مانند npm باشد.
فدراسیون ماژول را به عنوان راهی برای ایجاد یک اکوسیستم فدرال از اپلیکیشنها در نظر بگیرید، جایی که هر اپلیکیشن میتواند عملکرد خود را ارائه دهد و از عملکرد اپلیکیشنهای دیگر استفاده کند. این امر نیاز به وابستگیهای زمان ساخت (build-time) را از بین میبرد و امکان استقرارهای واقعاً مستقل را فراهم میکند.
به عنوان مثال، یک تیم سیستم طراحی (design system) میتواند کامپوننتهای رابط کاربری را به عنوان ماژول در معرض دید قرار دهد و تیمهای مختلف اپلیکیشن میتوانند این کامپوننتها را مستقیماً از اپلیکیشن سیستم طراحی مصرف کنند، بدون اینکه نیاز به نصب آنها به عنوان پکیج npm داشته باشند. هنگامی که تیم سیستم طراحی کامپوننتها را بهروزرسانی میکند، تغییرات به طور خودکار در تمام اپلیکیشنهای مصرفکننده منعکس میشود.
مفاهیم کلیدی در فدراسیون ماژول:
- Host (میزبان): اپلیکیشن اصلی که ماژولهای از راه دور (remote) را مصرف میکند.
- Remote (از راه دور): اپلیکیشنی که ماژولهایی را برای مصرف توسط اپلیکیشنهای دیگر در معرض دید قرار میدهد.
- ماژولهای اشتراکی (Shared Modules): ماژولهایی که بین اپلیکیشنهای میزبان و از راه دور به اشتراک گذاشته میشوند (مانند React، Lodash). فدراسیون ماژول میتواند به طور خودکار نسخهبندی و حذف موارد تکراری (deduplication) ماژولهای اشتراکی را مدیریت کند تا اطمینان حاصل شود که فقط یک نسخه از هر ماژول بارگذاری میشود.
- ماژولهای در معرض دید (Exposed Modules): ماژولهای خاصی از یک اپلیکیشن از راه دور که برای مصرف توسط اپلیکیشنهای دیگر در دسترس قرار میگیرند.
- RemoteEntry.js: فایلی که توسط Webpack تولید میشود و حاوی فراداده (metadata) مربوط به ماژولهای در معرض دید یک اپلیکیشن از راه دور است. اپلیکیشن میزبان از این فایل برای کشف و بارگذاری ماژولهای از راه دور استفاده میکند.
راهاندازی فدراسیون ماژول با Webpack 5: یک راهنمای عملی
بیایید یک مثال عملی از راهاندازی فدراسیون ماژول با Webpack 5 را بررسی کنیم. ما دو اپلیکیشن ساده ایجاد خواهیم کرد: یک اپلیکیشن Host (میزبان) و یک اپلیکیشن Remote (از راه دور). اپلیکیشن Remote یک کامپوننت را در معرض دید قرار میدهد و اپلیکیشن Host آن را مصرف میکند.
۱. راهاندازی پروژه
دو دایرکتوری جداگانه برای اپلیکیشنهای خود ایجاد کنید: `host` و `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 ```۲. پیکربندی اپلیکیشن Remote
در دایرکتوری `remote`، فایلهای زیر را ایجاد کنید:
- `src/index.js`: نقطه ورود برای اپلیکیشن.
- `src/RemoteComponent.jsx`: کامپوننتی که در معرض دید قرار خواهد گرفت.
- `webpack.config.js`: فایل پیکربندی Webpack.
src/index.js:
```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; import RemoteComponent from './RemoteComponent'; const App = () => (Remote Application
src/RemoteComponent.jsx:
```javascript import React from 'react'; const RemoteComponent = () => (This is a Remote Component!
Rendered from the Remote Application.
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'], }, }; ```فایل `public/index.html` را با ساختار HTML پایه ایجاد کنید. مهم این است که `
` را داشته باشد.۳. پیکربندی اپلیکیشن Host
در دایرکتوری `host`، فایلهای زیر را ایجاد کنید:
- `src/index.js`: نقطه ورود برای اپلیکیشن.
- `webpack.config.js`: فایل پیکربندی Webpack.
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
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'], }, }; ```فایل `public/index.html` را با ساختار HTML پایه ایجاد کنید (مشابه اپلیکیشن remote). مهم این است که `
` را داشته باشد.۴. نصب Babel
در هر دو دایرکتوری `host` و `remote`، وابستگیهای Babel را نصب کنید:
```bash npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader ```۵. اجرای اپلیکیشنها
در هر دو دایرکتوری `host` و `remote`، اسکریپت زیر را به `package.json` اضافه کنید:
```json "scripts": { "start": "webpack serve" } ```حالا، هر دو اپلیکیشن را اجرا کنید:
```bash cd remote npm start cd ../host npm start ```مرورگر خود را باز کرده و به `http://localhost:3000` بروید. باید اپلیکیشن Host را ببینید که کامپوننت Remote در داخل آن رندر شده است.
توضیح گزینههای کلیدی پیکربندی:
- `name`: یک نام منحصر به فرد برای اپلیکیشن.
- `filename`: نام فایلی که حاوی فراداده مربوط به ماژولهای در معرض دید خواهد بود (مثلاً `remoteEntry.js`).
- `exposes`: یک نگاشت از نام ماژولها به مسیر فایلها، که مشخص میکند کدام ماژولها باید در معرض دید قرار گیرند.
- `remotes`: یک نگاشت از نام اپلیکیشنهای از راه دور به URLها، که مشخص میکند فایل remoteEntry.js برای هر اپلیکیشن از راه دور را کجا پیدا کند.
- `shared`: لیستی از ماژولهایی که باید بین اپلیکیشنهای میزبان و از راه دور به اشتراک گذاشته شوند. گزینه `singleton: true` تضمین میکند که فقط یک نمونه از هر ماژول اشتراکی بارگذاری میشود. گزینه `eager: true` تضمین میکند که ماژول اشتراکی به صورت مشتاقانه (یعنی قبل از هر ماژول دیگری) بارگذاری میشود.
تکنیکهای پیشرفته فدراسیون ماژول
فدراسیون ماژول ویژگیهای پیشرفته زیادی را ارائه میدهد که میتواند به شما در ساخت معماریهای میکروسرویس فرانتاند پیچیدهتر کمک کند.
Remoteهای پویا
به جای کدنویسی سخت (hardcoding) URLهای اپلیکیشنهای از راه دور در پیکربندی Webpack، میتوانید آنها را به صورت پویا در زمان اجرا بارگذاری کنید. این به شما امکان میدهد به راحتی مکان اپلیکیشنهای از راه دور را بدون نیاز به بازسازی اپلیکیشن میزبان بهروز کنید.
به عنوان مثال، میتوانید URLهای اپلیکیشنهای از راه دور را در یک فایل پیکربندی یا یک پایگاه داده ذخیره کرده و آنها را به صورت پویا با استفاده از جاوااسکریپت بارگذاری کنید.
```javascript // در webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // فرض کنید remoteUrl چیزی شبیه 'http://localhost:3001/remoteEntry.js' است const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // کلید فدراسیون ماژول این است که اپلیکیشن ریموت // با استفاده از نامی که در ریموت تعریف شده در دسترس است resolve(window.remote); }; document.head.appendChild(script); })`, }, ```حالا میتوانید اپلیکیشن میزبان را با یک پارامتر کوئری `?remote=http://localhost:3001/remoteEntry.js` بارگذاری کنید.
ماژولهای اشتراکی نسخهبندی شده
فدراسیون ماژول میتواند به طور خودکار نسخهبندی و حذف موارد تکراری ماژولهای اشتراکی را مدیریت کند تا اطمینان حاصل شود که فقط یک نسخه سازگار از هر ماژول بارگذاری میشود. این امر به ویژه هنگام کار با اپلیکیشنهای بزرگ و پیچیده که وابستگیهای زیادی دارند، مهم است.
شما میتوانید محدوده نسخه هر ماژول اشتراکی را در پیکربندی Webpack مشخص کنید.
```javascript // در webpack.config.js shared: { react: { singleton: true, eager: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, eager: true, requiredVersion: '^18.0.0' }, }, ```بارگذارندههای ماژول سفارشی
فدراسیون ماژول به شما اجازه میدهد بارگذارندههای ماژول سفارشی را تعریف کنید که میتوانند برای بارگذاری ماژولها از منابع مختلف یا در فرمتهای مختلف استفاده شوند. این میتواند برای بارگذاری ماژولها از یک CDN یا از یک رجیستری ماژول سفارشی مفید باشد.
اشتراکگذاری وضعیت (State) بین میکروسرویسهای فرانتاند
یکی از چالشهای معماریهای میکروسرویس فرانتاند، اشتراکگذاری وضعیت بین میکروسرویسهای فرانتاند مختلف است. چندین رویکرد برای مقابله با این چالش وجود دارد:
- مدیریت وضعیت مبتنی بر URL: وضعیت را در URL ذخیره کرده و از URL برای ارتباط بین میکروسرویسهای فرانتاند استفاده کنید. این یک رویکرد ساده و مستقیم است، اما برای وضعیتهای پیچیده میتواند دستوپاگیر شود.
- رویدادهای سفارشی (Custom events): از رویدادهای سفارشی برای پخش تغییرات وضعیت بین میکروسرویسهای فرانتاند استفاده کنید. این امر امکان اتصال سست (loose coupling) بین میکروسرویسهای فرانتاند را فراهم میکند، اما مدیریت اشتراک رویدادها میتواند دشوار باشد.
- کتابخانه مدیریت وضعیت مشترک: از یک کتابخانه مدیریت وضعیت مشترک مانند Redux یا MobX برای مدیریت وضعیت کل اپلیکیشن استفاده کنید. این یک راه متمرکز و سازگار برای مدیریت وضعیت فراهم میکند، اما میتواند وابستگی به یک کتابخانه مدیریت وضعیت خاص را ایجاد کند.
- کارگزار پیام (Message Broker): از یک کارگزار پیام مانند RabbitMQ یا Kafka برای تسهیل ارتباط و اشتراکگذاری وضعیت بین میکروسرویسهای فرانتاند استفاده کنید. این یک راهحل پیچیدهتر است، اما درجه بالایی از انعطافپذیری و مقیاسپذیری را ارائه میدهد.
بهترین شیوهها برای پیادهسازی میکروسرویسهای فرانتاند با فدراسیون ماژول
در اینجا چند بهترین شیوه برای به خاطر سپردن هنگام پیادهسازی میکروسرویسهای فرانتاند با فدراسیون ماژول آورده شده است:
- مرزهای مشخصی برای هر میکروسرویس فرانتاند تعریف کنید: هر میکروسرویس فرانتاند باید مسئول یک حوزه کسبوکار یا ویژگی خاص باشد و باید رابطهای به خوبی تعریف شدهای داشته باشد.
- از یک پشته فناوری سازگار استفاده کنید: در حالی که فدراسیون ماژول به شما اجازه میدهد از فناوریهای مختلف برای میکروسرویسهای فرانتاند مختلف استفاده کنید، به طور کلی ایده خوبی است که از یک پشته فناوری سازگار برای کاهش پیچیدگی و بهبود قابلیت نگهداری استفاده کنید.
- پروتکلهای ارتباطی واضحی ایجاد کنید: پروتکلهای ارتباطی واضحی برای نحوه تعامل میکروسرویسهای فرانتاند با یکدیگر تعریف کنید.
- فرآیند استقرار را خودکار کنید: فرآیند استقرار را خودکار کنید تا اطمینان حاصل شود که میکروسرویسهای فرانتاند میتوانند به طور مستقل و قابل اعتماد مستقر شوند. استفاده از پایپلاینهای CI/CD و ابزارهای زیرساخت به عنوان کد (infrastructure-as-code) را در نظر بگیرید.
- عملکرد میکروسرویسهای فرانتاند خود را نظارت کنید: عملکرد میکروسرویسهای فرانتاند خود را برای شناسایی و رفع هرگونه گلوگاه عملکردی نظارت کنید. از ابزارهایی مانند Google Analytics، New Relic یا Datadog استفاده کنید.
- مدیریت خطای قوی پیادهسازی کنید: مدیریت خطای قوی را پیادهسازی کنید تا اطمینان حاصل شود که اپلیکیشن شما در برابر خرابیها مقاوم است.
- یک مدل حاکمیت غیرمتمرکز را بپذیرید: به تیمها قدرت دهید تا در مورد میکروسرویسهای فرانتاند خود تصمیم بگیرند، در حالی که سازگاری و کیفیت کلی را حفظ میکنید.
نمونههای دنیای واقعی از فدراسیون ماژول در عمل
در حالی که مطالعات موردی خاص اغلب محرمانه هستند، در اینجا چند سناریوی کلی وجود دارد که فدراسیون ماژول میتواند در آنها فوقالعاده مفید باشد:
- پلتفرمهای تجارت الکترونیک: همانطور که قبلاً ذکر شد، پلتفرمهای بزرگ تجارت الکترونیک میتوانند از فدراسیون ماژول برای ساخت میکروسرویسهای فرانتاند مستقل برای کاتالوگ محصولات، سبد خرید، فرآیند پرداخت و مدیریت حساب کاربری استفاده کنند. این به تیمهای مختلف اجازه میدهد تا روی این ویژگیها به طور مستقل کار کرده و آنها را بدون تأثیر بر سایر بخشهای اپلیکیشن مستقر کنند. یک پلتفرم جهانی میتواند ویژگیها را برای مناطق مختلف از طریق ماژولهای از راه دور سفارشی کند.
- اپلیکیشنهای خدمات مالی: اپلیکیشنهای خدمات مالی اغلب دارای رابطهای کاربری پیچیده با ویژگیهای مختلف زیادی هستند. فدراسیون ماژول میتواند برای ساخت میکروسرویسهای فرانتاند مستقل برای انواع حسابهای مختلف، پلتفرمهای معاملاتی و داشبوردهای گزارشدهی استفاده شود. ویژگیهای انطباق منحصر به فرد برای کشورهای خاص میتواند از طریق فدراسیون ماژول ارائه شود.
- پورتالهای مراقبتهای بهداشتی: پورتالهای مراقبتهای بهداشتی میتوانند از فدراسیون ماژول برای ساخت میکروسرویسهای فرانتاند مستقل برای مدیریت بیمار، زمانبندی قرار ملاقات و دسترسی به سوابق پزشکی استفاده کنند. ماژولهای مختلف برای ارائهدهندگان بیمه یا مناطق مختلف میتوانند به صورت پویا بارگذاری شوند.
- سیستمهای مدیریت محتوا (CMS): یک CMS میتواند از فدراسیون ماژول استفاده کند تا به کاربران اجازه دهد با بارگذاری ماژولهای از راه دور از توسعهدهندگان شخص ثالث، عملکرد سفارشی را به وبسایتهای خود اضافه کنند. تمها، پلاگینها و ویجتهای مختلف میتوانند به عنوان میکروسرویسهای فرانتاند مستقل توزیع شوند.
- سیستمهای مدیریت یادگیری (LMS): یک LMS میتواند دورههایی را ارائه دهد که به طور مستقل توسعه یافته و از طریق فدراسیون ماژول در یک پلتفرم یکپارچه ادغام شدهاند. بهروزرسانیهای دورههای فردی نیازی به استقرار مجدد در کل پلتفرم ندارد.
نتیجهگیری
فدراسیون ماژول جاوااسکریپت در Webpack 5 یک راه قدرتمند و انعطافپذیر برای ساخت معماریهای میکروسرویس فرانتاند فراهم میکند. این به شما امکان میدهد کد را بین اپلیکیشنهای جاوااسکریپت که به طور جداگانه کامپایل شدهاند در زمان اجرا به اشتراک بگذارید و استقرارهای مستقل، تنوع فناوری و استقلال تیمی بهبود یافته را ممکن میسازد. با پیروی از بهترین شیوههای ذکر شده در این راهنما، میتوانید از فدراسیون ماژول برای ساخت اپلیکیشنهای وب مقیاسپذیر، قابل نگهداری و نوآورانه استفاده کنید.
آینده توسعه فرانتاند بدون شک به سمت معماریهای ماژولار و توزیعشده متمایل است. فدراسیون ماژول ابزاری حیاتی برای ساخت این سیستمهای مدرن فراهم میکند و به تیمها امکان میدهد اپلیکیشنهای پیچیده را با سرعت، انعطافپذیری و پایداری بیشتری ایجاد کنند. با بلوغ این فناوری، میتوانیم انتظار داشته باشیم که موارد استفاده نوآورانهتر و بهترین شیوههای بیشتری ظهور کنند.