首頁 > web前端 > js教程 > 《Codex 守護者》一集——擁抱 PWA 和微前端

《Codex 守護者》一集——擁抱 PWA 和微前端

Patricia Arquette
發布: 2024-11-17 16:33:01
原創
682 人瀏覽過

Episode  The Guardian of Codex – Embracing PWAs and Micro-Frontends

第 12 集:Codex 守護者 – 擁抱 PWA 和微前端

Arin 站在 Codex 廣闊邊界的邊緣,發光資料場的光芒與深邃的太空相遇。相互連接的節點在她腳下嗡嗡作響,與生命和潛力產生共鳴。今天不同了。這不僅僅是行星防禦軍團(PDC)的又一天。該使命不僅是防禦對手,還在於增強 Codex 的彈性,確保它能夠抵禦幹擾,同時為依賴它的用戶提供無縫體驗。

生命週期船長的聲音劃破了寂靜,平靜但嚴厲。 「學員阿林,請記住:韌性不僅僅是力量;更是力量。這是關於適應性的。使用者是 Codex 的本質,必須不惜一切代價保護他們的體驗。」

阿林深吸了一口氣,眼睛掃視著閃閃發光的地平線。任務很明確:使用工具和技術強化 Codex,增強其防禦能力並維持使用者信任。


1.漸進式 Web 應用程式 (PWA) 的力量

Arin 查閱了 Codex 的檔案,那裡儲存著漸進式 Web 應用程式 (PWA) 的古老藍圖。她知道 PWA 不僅僅是應用程序,它們還是 Codex 和斷開連接帶來的混亂之間的守護者。這些強大的結構支援離線功能,確保即使資料路徑出現問題,使用者也能繼續存取重要資源。

什麼是 PWA?
漸進式 Web 應用程式 (PWA) 利用服務工作者和清單來提供行為類似於本機應用程式的 Web 應用程序,支援離線使用、更快的載入時間和可安裝性。

程式碼範例:Service Worker 設定
Arin 開始打造 Service Worker,即快取資產並提供無縫離線支援的無聲守護者:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('Service Worker registered with scope:', registration.scope);
      })
      .catch(error => {
        console.error('Service Worker registration failed:', error);
      });
  });
}
登入後複製
登入後複製
登入後複製

當 Arin 將服務工作者的程式碼嵌入 Codex 的防禦時,它的光芒閃閃發光,確保用戶即使在沒有網路連線的情況下也永遠不會面臨空白。

優點

  • 離線功能即使網路存取中斷也能保持應用程式的可用性。
  • 由於快取資源,載入時間更快
  • 透過類似原生的體驗增強使用者參與度

缺點

  • 管理複雜性:讓服務人員保持最新狀態可能具有挑戰性。
  • 快取的偵錯問題可能很難解決。

何時使用

  • 建置必須在連接較差的區域保持功能的應用程式時。
  • 對於優先考慮使用者參與度的高流量應用。

何時避免

  • 對於不需要離線功能的簡單網路應用程式。
  • 如果管理服務人員所增加的複雜性超過了好處。

2.微前端的模組化強度

阿林的眼睛掃視著法典巨大而龐大的介面,每個區域都充滿了其獨特的能量特徵。隨著時間的推移,這個星球變得越來越複雜,每一次增加都讓維護變得更加困難。她回憶起可擴展性建構者的教導:「分而治之。每個部分都必須能夠獨立且和諧地發揮作用。」

什麼是微前端?
微前端將微服務架構的原理擴展到前端,使團隊能夠將單一應用程式分解為更小的、可獨立部署的單元,這些單元充當一個內聚的應用程式。

這種方法對於多個團隊在應用程式的不同部分工作的大型應用程式特別有益。微前端允許每個團隊保持自主權、更新和部署他們的部分,而不影響整個應用程式。

微前端的主要優點

  • 團隊自主和並行開發。
  • 獨立部署確保快速更新,無需停機。
  • 可擴充架構可以隨著應用的需求而成長。

潛在挑戰

  • 微前端之間的通訊複雜性
  • 管理共享狀態可能會導致程式碼複雜度增加。
  • 如果不仔細管理,就會出現依賴重複

測試案例:神奇寶貝應用程式
Arin 設想了一個神奇寶貝應用程式,其中不同的部分,例如Poke BattlePokedex,被開發為單獨的微前端。這個部門將確保 Pokedex 的更新不會影響 Poke Battle,反之亦然。

設定容器應用程式:
容器應用程式充當將微前端綁定在一起的協調器。以下是使用 Webpack Module Federation 用於整合微前端的範例設定。

container-app/package.json:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('Service Worker registered with scope:', registration.scope);
      })
      .catch(error => {
        console.error('Service Worker registration failed:', error);
      });
  });
}
登入後複製
登入後複製
登入後複製

container-app/webpack.config.js:

{
  "name": "container-app",
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.2.0"
  },
  "scripts": {
    "start": "webpack serve --config webpack.config.js"
  }
}
登入後複製
登入後複製

container-app/src/index.js:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  entry: './src/index.js',
  mode: 'development',
  devServer: {
    port: 8080,
  },
  output: {
    publicPath: 'http://localhost:8080/',
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'container',
      remotes: {
        pokebattle: 'pokebattle@http://localhost:8081/remoteEntry.js',
        pokedex: 'pokedex@http://localhost:8082/remoteEntry.js',
      },
      shared: ['react', 'react-dom']
    }),
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};
登入後複製
登入後複製

創建 Poke Battle 微前端:
Poke Battle 微前端有自己的程式碼庫和 Webpack 設定。

pokebattle/package.json:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(registration => {
        console.log('Service Worker registered with scope:', registration.scope);
      })
      .catch(error => {
        console.error('Service Worker registration failed:', error);
      });
  });
}
登入後複製
登入後複製
登入後複製

pokebattle/webpack.config.js:

{
  "name": "container-app",
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.2.0"
  },
  "scripts": {
    "start": "webpack serve --config webpack.config.js"
  }
}
登入後複製
登入後複製

pokebattle/src/App.js:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  entry: './src/index.js',
  mode: 'development',
  devServer: {
    port: 8080,
  },
  output: {
    publicPath: 'http://localhost:8080/',
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'container',
      remotes: {
        pokebattle: 'pokebattle@http://localhost:8081/remoteEntry.js',
        pokedex: 'pokedex@http://localhost:8082/remoteEntry.js',
      },
      shared: ['react', 'react-dom']
    }),
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};
登入後複製
登入後複製

設定 Pokedex 微前端:
pokedex/package.json:

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

const PokeBattle = React.lazy(() => import('pokebattle/App'));
const Pokedex = React.lazy(() => import('pokedex/App'));

function App() {
  return (
    <Router>
      <React.Suspense fallback={<div>Loading...</div>}>
        <Switch>
          <Route path="/pokebattle" component={PokeBattle} />
          <Route path="/pokedex" component={Pokedex} />
        </Switch>
      </React.Suspense>
    </Router>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
登入後複製

pokedex/webpack.config.js:

{
  "name": "pokebattle",
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  },
  "scripts": {
    "start": "webpack serve --config webpack.config.js"
  }
}
登入後複製

pokedex/src/App.js:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');

module.exports = {
  entry: './src/index.js',
  mode: 'development',
  devServer: {
    port: 8081,
  },
  output: {
    publicPath: 'http://localhost:8081/',
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'pokebattle',
      filename: 'remoteEntry.js',
      exposes: {
        './App': './src/App',
      },
      shared: ['react', 'react-dom']
    }),
    new HtmlWebpackPlugin({
      template: './public/index.html',
    }),
  ],
};
登入後複製

阿林的啟示
Arin 退後一步,看著 Codex 的新微前端架構煥發活力。每個部分都是一個更大整體的獨立而和諧的部分。 「法典現在更強大了,」她想。 「每個部分都可以自行戰鬥、適應和進化。」

優點

  • 團隊自主允許多個團隊獨立開發。
  • 獨立部署意味著快速、獨立的更新。
  • 模組化架構支援可擴充​​、可維護的程式碼庫。

缺點

  • 微前端之間的通訊可能很複雜。
  • 管理共享依賴項如果處理不當可能會導致重複。
  • 初始設定比傳統的單頁應用程式更複雜。

何時使用

  • 大型應用程式需要單獨的團隊處理不同的功能。
  • 當模組化和獨立的部署週期有益時。

何時避免

  • 小型應用程式的複雜性不合理。
  • 如果您的團隊沒有能力處理微前端通訊的細微差別。

3.透過程式碼分割與延遲載入提升使用者體驗

阿林轉向生命週期隊長,後者贊同地點點頭。 「用戶必須感覺到 Codex 始終響應迅速,始終做好準備,」他說。 程式碼分割延遲載入是確保這一點的關鍵。透過僅載入必要的內容,Codex 可以保持其敏捷性並讓用戶沉浸在他們的體驗中。

程式碼分割範例:

import React from 'react';

function App() {
  return (
    <div>
      <h1>Poke Battle Arena</h1>
      <p>Choose your Pokémon and battle your friends!</p>
    </div>
  );
}

export default App;
登入後複製

優點

  • 縮短了初始載入時間,因為僅載入必要的程式碼。
  • 增強使用者體驗減少載入和渲染時間。

缺點

  • 管理載入狀態變得必要。
  • 偵錯延遲載入的元件可能會更複雜。

何時使用

  • 對於具有大型組件且最初不需要加載的應用程式。
  • 優化效能和更快的互動至關重要。

何時避免

  • 對於簡單的應用程序,拆分不會帶來顯著的效能改進。
  • 在處理最小的應用程式複雜度時,延遲載入會增加不必要的開銷。

要點

Concept Definition Pros Cons When to Use When to Avoid
Progressive Web Apps (PWAs) Web apps with offline capabilities and native-like features. Offline access, improved performance, user engagement. Complex service worker management, debugging challenges. For apps needing offline capabilities and quick load. Apps that don’t benefit from offline or native features.
Micro-Frontends Independent, deployable micro-apps forming one application. Team autonomy, independent deployments, modular architecture. Communication complexity, potential dependency duplication. Large apps needing scalable, modular development. Simple apps where the complexity isn’t justified.
Code Splitting Splitting code into smaller chunks that load on demand. Reduces initial load time, improves UX. Requires managing loading states, can complicate debugging. Apps with large, seldom-used components. Lightweight apps with minimal performance concerns.
概念
定義

優點 缺點 何時使用 何時避免 標題> 漸進式網路應用 (PWA) 具有離線功能和類似本機功能的網路應用程式。 離線存取、提高效能、用戶參與度。 複雜的 Service Worker 管理、除錯挑戰。 適用於需要離線功能和快速載入的應用。 無法從離線或本機功能中受益的應用。 微前端 獨立的、可部署的微應用形成一個應用程式。 團隊自治、獨立部署、模組化架構。 通訊複雜性、潛在的依賴重複。 需要可擴充、模組化開發的大型應用。 簡單的應用程序,其複雜性不合理。 程式碼分割 將程式碼分割成按需載入的較小區塊。 減少初始載入時間,改善使用者體驗。 需要管理載入狀態,可能會使偵錯複雜化。 具有大型且很少使用的組件的應用。 具有最小效能問題的輕量級應用。 表> Arin 退後一步,看著 Codex 煥發出新的能量。它不再是一個整體,而是一系列強大的、相互關聯的節點​​——有彈性、適應性強,並準備好迎接即將到來的挑戰。隨著每一次的增強,她意識到真正的防禦不僅僅是蠻力;而是。這是關於明智的戰略適應。 「使用者永遠是安全的,」她低聲說道,感覺法典的脈動與她的決心一致。

以上是《Codex 守護者》一集——擁抱 PWA 和微前端的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板