Webpack 系列第 3 部分

aow054發表於2024-09-21
請查詢該系列的舊部分以充分理解這個概念。webpack 5 系列第 1 部分webpack 5 系列第 2 部分webpack 5 系列第 4 部分 線上電子商店申請讓我們使用微前端來構建一個線上商店應用程式以實現模組化。每個微前端將代表商店的不同部分,它們將共享公共庫,例如 react、設計系統和共享實用程式庫。目標:productlist 公開可以由其他應用匯入和使用的產品列表。購物車公開了從購物車新增/刪除產品的功能。結帳 使用購物車中的資料並處理結帳。 模組聯合的配置微前端1:產品列表公開 productlist 元件以供其他微前端使用。// webpack.config.js (productlist)const { modulefederationplugin } = require('webpack').container;module.exports = { plugins: [ new modulefederationplugin({ name: 'productlistapp', filename: 'remoteentry.js', exposes: { './productlist': './src/productlist', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, // share any other libraries like a ui library, e.g., material-ui }, }), ],};登入後複製微前端 2:購物車公開 cart 元件,它使用共享狀態庫(如 zustand)進行購物車管理。// webpack.config.js (cart)const { modulefederationplugin } = require('webpack').container;module.exports = { plugins: [ new modulefederationplugin({ name: 'cartapp', filename: 'remoteentry.js', exposes: { './cart': './src/cart', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, zustand: { singleton: true }, // zustand or redux for shared state }, }), ],};登入後複製微前端3:結賬使用 cart 和 productlist 元件以在結帳前顯示摘要。// webpack.config.js (checkout)const { modulefederationplugin } = require('webpack').container;module.exports = { plugins: [ new modulefederationplugin({ name: 'checkoutapp', remotes: { productlistapp: 'productlistapp@http://localhost:3001/remoteentry.js', cartapp: 'cartapp@http://localhost:3002/remoteentry.js', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), ],};登入後複製 元件實現:微前端1:產品列表由 productlist 微前端公開。// src/productlist.js (productlist)import react from 'react';const products = [ { id: 1, name: 'product 1', price: 50 }, { id: 2, name: 'product 2', price: 75 },];const productlist = () =&gt; ( <div> <h2>products</h2> <ul> {products.map(product =&gt; ( <li key="{product.id}"> {product.name} - ${product.price} </li> ))} </ul></div>);export default productlist;登入後複製微前端 2:購物車由 cart 微前端公開並管理狀態(例如,使用 zustand 或 redux)。// src/cart.js (cart)import react from 'react';import create from 'zustand';// zustand store for managing the cartconst usecartstore = create(set =&gt; ({ cart: [], addtocart: (product) =&gt; set(state =&gt; ({ cart: [...state.cart, product] })), removefromcart: (product) =&gt; set(state =&gt; ({ cart: state.cart.filter(item =&gt; item.id !== product.id) })),}));const cart = () =&gt; { const { cart, addtocart, removefromcart } = usecartstore(); return ( <div> <h2>cart</h2> <ul> {cart.map(product =&gt; ( <li key="{product.id}"> {product.name} - ${product.price} <button onclick="{()"> removefromcart(product)}&gt;remove</button> </li> ))} </ul></div> );};export default cart;登入後複製微前端3:結賬使用 cart 和 productlist 元件,將所有內容整合在一起。// src/Checkout.js (Checkout)import React, { lazy, Suspense } from 'react';const ProductList = lazy(() =&gt; import('productListApp/ProductList'));const Cart = lazy(() =&gt; import('cartApp/Cart'));const Checkout = () =&gt; ( <div> <h1>Checkout</h1> <suspense fallback="{&lt;div">Loading Products...</suspense></div>}&gt; <productlist></productlist><suspense fallback="{&lt;div">Loading Cart...}&gt; <cart></cart></suspense><button>Proceed to Payment</button> );export default Checkout;登入後複製 執行應用程式的步驟:執行微前端:每個微前端(productlist、cart、checkout)將在不同的埠上提供服務(例如,productlist 在 localhost:3001 上,cart 在 localhost:3002 上,checkout 在 localhost:3003 上)。您需要使用 webpack 開發伺服器設定每個微前端並單獨執行它們。使用遠端模組:在 checkout 微前端中,我們從各自的遠端微前端動態匯入 productlist 和 cart 元件。共享依賴項:每個微前端共享 react、react-dom,以及可能的其他共享依賴項,例如狀態庫(例如 zustand)或設計系統(material-ui)。 以上就是Webpack 系列第 3 部分的詳細內容,更多請關注我的其它相關文章!

相關文章