人妻出轨合集500篇最新
  • 首页
  • 4hu44四虎www在线影院麻豆
  • 波多野结衣在线视频
  • 国产成人亚洲综合无码精品
  • sesese在线观看a片
  • sesese在线观看a片

    人妻少妇偷人精品视频 Vite 微前端實踐,實現一個組件化的有贪图

    发布日期:2022-05-19 02:17    点击次数:78

    本文轉載自微信公眾號「前端星辰」人妻少妇偷人精品视频,作家旋律 。轉載本文請聯系前端星辰公眾號。

    什么是微前端

    微前端是一種多個團隊通過獨立發布功能的神态來共同構建現代化 web 應用的技術本领及圭臬计谋。

    微前端借鑒了微服務的架構理念,將一個龐大的前端應用拆分為多個獨立靈活的袖珍應用,每個應用都不错獨立開發、獨立運行、獨立部署,再將這些袖珍應用聯合為一個完整的應用。微前端既不错將多個項目和会為一,又不错減少項目之間的耦合,擢升項目擴展性,比拟一整塊的前端倉庫,微前端架構下的前端倉庫傾向于更小更靈活。

    特点 技術棧無關 主框架不放手接入應用的技術棧,子應用可自主選擇技術棧 獨立開發/部署 各個團隊之間倉庫獨立,單獨部署,互不依賴 增量升級 當一個應用龐大之后,技術升級或重構相當麻煩,而微應器用備漸進式升級的特点 獨立運行時 微應用之間運行時互不依賴,有獨立的狀態解决 擢升成果 應用越龐大,越難以維護,協作成果越低下。微應用不错很好拆分,擢升成果 现在可用的微前端有贪图

    微前端的有贪图现在有以下幾種類型:

    基于 iframe 全都隔離的有贪图

    作為前端開發,我們對 iframe 已經越过老到了,在一個應用中不错獨立運行另一個應用。它具有顯著的優點:

    越过簡單,無需任何修订 齐全隔離,JS、CSS 都是獨立的運行環境 不放手使用,頁面上不错放多個 iframe 來組合業務

    當然,缺點也越过隆起:

    無法保持路由狀態,刷新后路由狀態就丟失 全都的隔離導致與子應用的交互變得極其困難 iframe 中的彈窗無法侵略其自己

    整個應用全量資源加載,加載太慢

    這些顯著的缺點也催生了其他有贪图的產生。

    基于 single-spa 路由劫持有贪图

    single-spa 通過劫持路由的神态來做子應用之間的切換,但接入神态需要和会自身的路由,有一定的局限性。

    qiankun 孵化自螞蟻金融科技基于微前端架構的云產品統一接入平臺。它對 single-spa 做了一層封裝。主要解決了 single-spa 的一些痛點和不及。通過 import-html-entry 包默契 HTML 獲取資源路徑,然后對資源進行默契、加載。

    通過對執行環境的修改人妻少妇偷人精品视频,它實現了 JS 沙箱人妻少妇偷人精品视频、樣式隔離 等特点。

    京東 micro-app 有贪图

    京東 micro-app 并沒有沿襲 single-spa 的端倪,而是借鑒了 WebComponent 的思惟,通過 CustomElement 結合自定義的 ShadowDom,將微前端封裝成一個類 webComponents 組件,從而實現微前端的組件化渲染。

    在 Vite 上使用微前端

    我們從 我們從 UmiJS 遷移到了 Vite 之后,微前端也成為了勢在必行,當時也調研了许多有贪图。

    為什么沒用 qiankun

    qiankun 是现在是社區主流微前端有贪图。它雖然很完善、流行,但最大的問題即是不解救 Vite。它基于 import-html-entry 默契 HTML 來獲取資源,由于 qiankun 是通過 eval 來執行這些 js 的內容,而 Vite 中的 script 標簽類型是 type="module",内部包含 import/export 等模塊代碼, 是以會報錯:不允許在非 type="module" 的 script 内部使用 import。

    退一步實現,我們采取了 single-spa 的神态,并使用 systemjs 的神态進行了微前端加載有贪图,也踩了不少的坑。single-spa 沒有一個友好的教程來接入,文檔雖然多,但大多都在講办法,當時讓人覺得有一種深奧的感覺。

    后來看了它的源碼發現,這都是些什么……内部大部分代碼都是圍繞路由劫持而展開的,根蒂沒有文檔上那種广大上的感覺。而我們又用不到它路由劫持的功能,那我們為什么要用它?

    從組件化的層面來說 single-spa 這種神态實現得一點都不優雅。

    它劫持了路由,與 react-router 和組件化的思維水火阻挡 接入神态一大堆繁雜的建树 單實例的有贪图,即兼并時刻, 表妺好紧竟然流水了在线观看只消一個子應用被展示

    后來辩论著 single-spa 的缺點,我們不错我方實現一個組件化的微前端有贪图。

    若何實現一個簡單、透明、組件化的有贪图

    通過組件化思維實現一個微應用越过簡單:子應用導出一個圭臬,主應用加載子應用并調用該圭臬,并傳入一個 Element 節點參數,子應用得回該 Element 節點,將自己的組件 appendChild 到 Element 節點上。

    人妻少妇偷人精品视频

    類型約定

    在此之前我們需要約定一個主應用與子應用之間的一個交互神态。主要通過三個鉤子來保證應用的正確執行、更新、和卸載。

    類型定義:

    export 人妻少妇偷人精品视频interface AppConfig {   // 掛載   mount?: (props: unknown) => void;   // 更新   render?: (props: unknown) => ReactNode | void;   // 卸載   unmount?: () => void; } 

    子應用導出

    通過類型的約定,我們不错將子應用導出:mount、render、unmount 為主要鉤子。

    React 子應用實現:

    export default (container: HTMLElement) => {   let handleRender: (props: AppProps) => void;    // 包裹一個新的組件,用作更新處理   function Main(props: AppProps) {     const [state, setState] = React.useState(props);     // 將 setState 圭臬索要給 render 函數調用,保持父子應用觸發更新     handleRender = setState;     return <App {...state} />;   }    return {     mount(props: AppProps) {       ReactDOM.render(<Main {...props} />, container);     },     render(props: AppProps) {       handleRender?.(props);     },     unmount() {       ReactDOM.unmountComponentAtNode(container);     },   }; }; 

     

    Vue 子應用實現:

    import { createApp } from 'vue'; import App from './App.vue';  export default (container: HTMLElement) => {   // 創建   const app = createApp(App);   return {     mount() {       // 裝載       app.mount(container);     },     unmount() {       // 卸載       app.unmount();     },   }; }; 
    主應用實現

    React 實現

    其中枢代碼僅十余行,主要處理與子應用交互 (為了易讀性,隱藏了錯誤處理代碼):

    export function MicroApp({ entry, ...props }: MicroAppProps) {   // 傳遞給子應用的節點   const containerRef = useRef<HTMLDivElement>(null);   // 子應用建树   const configRef = useRef<AppConfig>();    useLayoutEffect(() => {     import(/* @vite-ignore */ entry).then((res) => {       // 將 div 傳給子應用渲染       const config = res.default(containerRef.current);       // 調用子應用的裝載圭臬       config.mount?.(props);       configRef.current = config;     });     return () => {       // 調用子應用的卸載圭臬       configRef.current?.unmount?.();       configRef.current = undefined;     };   }, [entry]);    return <div ref={containerRef}>{configRef.current?.render?.(props)}</div>; } 

    完成人妻少妇偷人精品视频,現在已經實現了主應用與子應用的裝載、更新、卸載的操作。現在,它是一個組件,不错同時渲染出多個不同的子應用,這點就比 single-spa 優雅许多。

    entry 子應用地址,當然真實情況會根據 dev 和 prod 形式給出不同的地址:

    <MicroApp className="micro-app" entry="//localhost:3002/src/main.tsx" /> 

    Vue 實現

    <script setup lang="ts"> import { onMounted, onUnmounted,sesese在线观看a片 ref } from 'vue';  const { entry, ...props } = defineProps<{ entry: string }>(); const container = ref<HTMLDivElement | null>(null); const config = ref();  onMounted(() => {   const element = container.value;   import(/* @vite-ignore */ entry).then((res) => {     // 將 div 傳給子應用渲染     const config = res.default(element);     // 調用子應用的裝載圭臬     config.mount?.(props);     config.value = config;   }); });  onUnmounted(() => {   // 調用子應用的卸載圭臬   config.value?.unmount?.(); }); </script>  <template>   <div ref="container"></div> </template>

    若何讓子應用也能獨立運行

    single-spa 等眾多有贪图,都是將一個變量掛載到 window 上,通過判斷該變量是否處于微前端環境,這樣很不優雅。在 ESM 中,我們不错通過 import.meta.url 傳入參數來判斷:

    if (!import.meta.url.includes('microAppEnv')) {   ReactDOM.render(     <React.StrictMode>       <App />     </React.StrictMode>,     document.getElementById('root'),   ); } 

    进口導入修改:

    // 添加環境參數和當前時間幸免被緩存 import(/* @vite-ignore */ `${entry}?microAppEnv&t=${Date.now()}`); 

    瀏覽器兼容性

    IE 瀏覽器已經慢慢退出我們的視野,基于 Vite,我們只需要解救 import 的特点瀏覽器就夠了。當然,要是考慮 IE 瀏覽器的話也不是不能以,很簡單:將上头代碼的 import 替換為 System.import 即 systemjs,亦然 single-spa 的所珍视的用法。

    瀏覽器 Chrome Edge Firefox Internet Explorer Safari import 61 16 60 No 10.1 Dynamic import 63 79 67 No 11.1 import.meta 64 79 62 No 11.1

    模塊公用

    我們的子組件必須要使用 mount 、unount 形式嗎?谜底是不一定,要是我們的技術棧都是 React 的話。我們的子應用只導出一個 render 就夠了。這樣用的即是兼并個 React 來渲染,好處是子應用不错消費父應用的 Provider。但有個前提是兩個應用之間的 React 必須為兼并個實例,否則就會報錯。

    我們不错將 react、react-dom 、styled-componets 等常用模塊提前打包成 ESM 模塊人妻少妇偷人精品视频,然后放到文献服務中使用。

    革新 Vite 建树添加 alias:

    defineConfig({   resolve: {     alias: {       react: '//localhost:8000/react@17.js',       'react-dom': '//localhost:8000/react-dom@17.js',     },   }, }); 

    這樣就能高傲地使用兼并份 React 代碼了。還能抽離出主應用和子應用之間的公用模塊,讓應用總體積更小。當然要是沒上 http2 的話,就需要考慮顆粒度的問題了。

    在線 CDN 有贪图:https://esm.sh

    還有個 importmap 有贪图,兼容性不太好,但未來是趨勢:

    <script type="importmap">   {     "imports": {       "react": "//localhost:8000/react@17.js"     }   } </script

     

    父子通讯

    組件式微應用,不错傳遞參數而通讯,全都即是 React 組件通讯的模子。

    資源路徑

    import logo from './images/logo.svg';  <img src={logo} />; 

    在 Vite 的 dev 形式中,子應用内部靜態資源一般會這樣引入:

    import logo from './images/logo.svg';  <img src={logo} />; 

    圖片的路徑:/basename/src/logo.svg,在主應用顯示就會 404。因為該路徑仅仅存在于子應用。我們需要互助 URL 模塊使用,這樣路徑前边會帶上 origin 前綴:

    const logoURL = new URL(logo, import.meta.url);  <img src={logoURL.href} />; 

    當然這樣使用比較繁瑣,我們不错將其封裝為一個 Vite 插件自動處理該場景。

    路由同步人妻少妇偷人精品视频

    項目使用 react-router,那么它可能會存在路由不同步的問題,因為不是兼并個 react-router 實例。即路由之間出現不聯動的現象。

    在 react-router 解救自定義 history 庫,我們不错創建:

    import { createBrowserHistory } from 'history';  export const history = createBrowserHistory();  // 主應用:路由进口 <HistoryRouter history={history}>{children}</HistoryRouter>;  // 主應用:傳遞給子應用 <Route   path="/child-app/*"   element={<MicroApp entry="//localhost:3002/src/main.tsx" history={history} />} />;  // 子應用:路由进口 <HistoryRouter basename="/child-app" history={history}>   {children} </HistoryRouter>; 

    最終子應用使用兼并份 history 模塊。當然這不是惟一的實現,也不是優雅的神态,我們不错將路由實例 navigate 傳遞給子應用,這樣也能實現路由的交互。

    很多情况,我们确实需要在一个服务中访问多个数据源。虽然它让整体设计变的不那么优雅,但真实的世界确实需要它。比如,你的业务为两个比较大的客户服务,但你希望他们能够共用一套代码。

    今天,就让我们一起来看看这4个 for 循环。

    前两天写了一篇关于多目标排序模型的文章,有小伙伴给我留言说,多个目标好理解, 但是排序的时候怎么融合多个目标呢?

    之所以说并发编程出现的 Bug 比较诡异,是因为在并发编程中,很多时候出现的 Bug 不一定能完美的复现出来,也就是说,并发编程的 Bug 是很难重现,很难追踪的。

    为了给 css 扩展代码组织和动态计算的能力,社区出现了一些编译为 css 的预处理语言,比如 sass、less、stylus 等。

    上篇文章提到固定时间窗口限流无法处理突然请求洪峰情况,本文讲述的令牌桶线路算法则可以比较好的处理此场景。

    条款02:尽量以const,enum,inline替换 #define

    能干:子應用的 basename 必須與主應用的 path 名稱保持一致。這里還需要修改 Vite 的建树 base 字段:

    export default defineConfig({   base: '/child-app/',   server: {     port: 3002,   },   plugins: [react()], }); 

    JS 沙箱

    因為沙箱在 ESM 下不解救,因為無法動態改變執行環境中模塊 window 對象,也無法注入新的全局對象。

    一般 React、Vue 項目也很少修改全局變量,做好代碼規范檢查才是最主要的。

    CSS 樣式隔離

    自動 CSS 樣式隔離是有代價的,一般我們建議子應用使用不同的 CSS 前綴,再互助 CSS Modules 基本上能實現需求。

    打包部署

    部署不错根據子應用的 base 放手在不同的目錄,并將名稱對應。建树好 nginx 轉發規則就不错了。我們不错將子應用統全部由前綴,便于 nginx 將主應用區分開并建树通用規則。

    比如將主應用放手在 system 目錄,子應用放手在 app- 開頭的目錄:

    location ~ ^/app-.*(\..+)$ {     root /usr/share/nginx/html; }  location / {     try_files $uri $uri/ /index.html;     root /usr/share/nginx/html/system;     index  index.html index.htm; } 

    優點

    1. 簡單 中枢不及 100 行代碼,無需过剩的文檔

    2. 靈活 通過約定的神态接入,也不错漸進增強

    3. 透明 無任何劫持有贪图,更多邏輯透明性

    4. 組件化 組件化的渲染及參數通讯

    5. 基于 ESM 解救 Vite,面向未來

    6. 向下兼容 可選 SystemJS 有贪图,兼容低版块瀏覽器

    有示例嗎

    示例代碼在 Github,感興趣的至好不错 clone 下來學習。由于我們的技術棧是 React,是以這里示例的主應用的實現用的是 React 。

    微前端組件(React):https://github.com/MinJieLiu/micro-app

    微前端示例:https://github.com/MinJieLiu/micro-app-demo

    結語

    微前端的有贪图適合團隊場景的最佳,打造一個團隊能掌控的有贪图尤為着急。

    參考資料:

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/import.meta

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/import

     

     



    Powered by 人妻出轨合集500篇最新 @2013-2022 RSS地图 HTML地图