<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        使用異步組件優(yōu)化Vue應(yīng)用程序的性能

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:58:02
        文檔

        使用異步組件優(yōu)化Vue應(yīng)用程序的性能

        使用異步組件優(yōu)化Vue應(yīng)用程序的性能:單頁應(yīng)用其一個(gè)問題是首屏屏渲染速度較慢。這是因?yàn)轫撁媸状渭虞d時(shí)服務(wù)器將向客戶端發(fā)送大量JavaScript,在屏幕上顯示任何內(nèi)容之前必須下載并解析。可以想象,隨著應(yīng)用程序規(guī)模的擴(kuò)大,這個(gè)問題對(duì)用戶體驗(yàn)的影響也會(huì)越來越突出。 現(xiàn)在幸運(yùn)的是,當(dāng)使用Vue
        推薦度:
        導(dǎo)讀使用異步組件優(yōu)化Vue應(yīng)用程序的性能:單頁應(yīng)用其一個(gè)問題是首屏屏渲染速度較慢。這是因?yàn)轫撁媸状渭虞d時(shí)服務(wù)器將向客戶端發(fā)送大量JavaScript,在屏幕上顯示任何內(nèi)容之前必須下載并解析。可以想象,隨著應(yīng)用程序規(guī)模的擴(kuò)大,這個(gè)問題對(duì)用戶體驗(yàn)的影響也會(huì)越來越突出。 現(xiàn)在幸運(yùn)的是,當(dāng)使用Vue

        單頁應(yīng)用其一個(gè)問題是首屏屏渲染速度較慢。這是因?yàn)轫撁媸状渭虞d時(shí)服務(wù)器將向客戶端發(fā)送大量JavaScript,在屏幕上顯示任何內(nèi)容之前必須下載并解析。可以想象,隨著應(yīng)用程序規(guī)模的擴(kuò)大,這個(gè)問題對(duì)用戶體驗(yàn)的影響也會(huì)越來越突出。

        現(xiàn)在幸運(yùn)的是,當(dāng)使用Vue CLI構(gòu)建Vue應(yīng)用程序時(shí)(使用webpack),可以采取一些措施來抵消這種情況。在本文中,我將演示如何在應(yīng)用程序的初始渲染之后使用 異步組件 和webpack的代碼分割功能加載到頁面的某些部分。這將使初始加載時(shí)間降至最低,并為您的應(yīng)用程序提供更好的用戶體驗(yàn)。

        認(rèn)識(shí)異步組件

        在我們開始創(chuàng)建異步組件之前,讓我們看一下我們通常如何加載組件。為此,我們將使用一個(gè)非常簡單的消息組件作為例子:

        <!-- Message.vue -->
        <template>
         <h1>New message!</h1>
        </template>

        現(xiàn)在我們已經(jīng)創(chuàng)建了我們的 Message 組件,讓我們將它加載到我們的文件中并顯示它。我們可以導(dǎo)入組件并將其添加到組件選項(xiàng)中,以便我們可以在模板中使用它:

        <!-- App.vue -->
        <template>
         <div>
         <message></message>
         </div>
        </template>
        
        <script>
        import Message from "./Message";
        export default {
         components: {
         Message
         }
        };
        </script>

        但現(xiàn)在發(fā)生了什么?只要應(yīng)用程序加載,就會(huì)加載 Message 組件,因此它包含在初始加載過程中。

        對(duì)于一個(gè)簡單的應(yīng)用程序來說,這看起來可能不是一個(gè)大問題,但可以考慮像電商網(wǎng)站這樣復(fù)雜的場景。想象一下,用戶將項(xiàng)目添加到購物車,然后想要結(jié)帳,因此單擊結(jié)帳按鈕會(huì)生成一個(gè)包含所選商品的所有詳細(xì)信息的框。使用上述方法,此結(jié)帳框?qū)诔跏及校覀冎恍柙谟脩魡螕艚Y(jié)帳按鈕時(shí)使用該組件。用戶甚至可以在不點(diǎn)擊結(jié)賬按鈕的情況下瀏覽網(wǎng)站,這意味著在加載這個(gè)可能不會(huì)使用的組件時(shí)浪費(fèi)資源是沒有意義的。

        為了提高應(yīng)用程序的效率,我們可以結(jié)合延遲加載和代碼分割技術(shù)。

        Webpack提供的代碼拆分功能允許您將代碼拆分為各種捆綁包,然后可以按需加載或稍后并行加載。它只能在需要或使用時(shí)加載特定的代碼片段。

        Dynamic Imports(動(dòng)態(tài)導(dǎo)入)

        Vue使用Dynamic Imports解決這種情況。此功能引入了一種新的類似函數(shù)的導(dǎo)入形式,它將返回包含(Vue)組件的Promise。由于import是一個(gè)接收字符串的函數(shù),我們可以做一些強(qiáng)大的事情,比如使用表達(dá)式加載模塊。自版本61以來,Chrome中已提供動(dòng)態(tài)導(dǎo)入。有關(guān)這些內(nèi)容的詳細(xì)信息, 請(qǐng)?jiān)L問Google Developers網(wǎng)站 。

        代碼拆分由webpack,Rollup或Parcel等捆綁器處理,它們解析動(dòng)態(tài)導(dǎo)入語法并為每個(gè)動(dòng)態(tài)導(dǎo)入的模塊創(chuàng)建單獨(dú)的文件。稍后我們將在控制臺(tái)的網(wǎng)絡(luò)選項(xiàng)卡中看到這一點(diǎn)。但首先,我們來看看靜態(tài)和動(dòng)態(tài)導(dǎo)入之間的區(qū)別:

        // static import
        import Message from "./Message";
        
        // dynamic import
        import("./Message").then(Message => {
         // Message module is available here...
        });
        

        現(xiàn)在,讓我們將這些知識(shí)應(yīng)用到我們的 Message 組件中,我們將得到一個(gè)如下所示的組件: App.vue

        <!-- App.vue -->
        <template>
         <div>
         <message></message>
         </div>
        </template>
        
        <script>
        import Message from "./Message";
        export default {
         components: {
         Message: () => import("./Message")
         }
        };
        </script>

        如你所見,函數(shù)import()將解析返回組件的Promise,這意味著我們已成功異步加載組件。如果您查看 devtoolsnetwork 選項(xiàng)卡,您會(huì)注意到一個(gè)名為 0.js 包含異步組件的文件。

         

        根據(jù)條件加載異步組件

        現(xiàn)在我們已經(jīng)掌握了異步組件,讓我們僅在真正需要時(shí)加載它們。在本文的上一節(jié)中,我解釋了僅在用戶點(diǎn)擊結(jié)帳按鈕時(shí)才加載的結(jié)帳框的用例。讓我們把它構(gòu)建出來。

        項(xiàng)目設(shè)置

        如果您沒有安裝 vue/cli ,首先應(yīng)該安裝它:

        npm i -g @vue/cli

        接下來,使用CLI創(chuàng)建新項(xiàng)目,在出現(xiàn)提示時(shí)選擇默認(rèn)預(yù)設(shè)即可:

        vue create my-store

        轉(zhuǎn)到項(xiàng)目目錄,然后安裝我們將用于樣式的ant-design-vue庫:

        cd my-store
        npm i ant-design-vue

        接下來,導(dǎo)入Ant設(shè)計(jì)庫: src/main.js

        import 'ant-design-vue/dist/antd.css'

        最后我們在 src/comonents 里創(chuàng)建兩個(gè)新組件 Checkout.vueItems.vue

        touch src/components/{Checkout.vue,Items.vue}

        寫一個(gè)商店的視圖層

        打開 src/App.vue 并用以下代碼替換文件里代碼:

        <template>
         <div id="app">
         <h1>{{ msg }}</h1>
         <items></items>
         </div>
        </template>
        
        <script>
        import items from "./components/Items"
        
        export default {
         components: {
         items
         },
         name: 'app',
         data () {
         return {
         msg: 'My Fancy T-Shirt Store'
         }
         }
        }
        </script>
        
        <style>
        #app {
         font-family: 'Avenir', Helvetica, Arial, sans-serif;
         -webkit-font-smoothing: antialiased;
         -moz-osx-font-smoothing: grayscale;
         text-align: center;
         color: #2c3e50;
         margin-top: 60px;
        }
        
        h1, h2 {
         font-weight: normal;
        }
        
        ul {
         list-style-type: none;
         padding: 0;
        }
        
        li {
         display: inline-block;
         margin: 0 10px;
        }
        
        a {
         color: #42b983;
        }
        </style>

        這里沒有什么花哨的東西。我們所做的只是顯示一條消息并渲染一個(gè) <items> 組件。

        接下來,打開 src/components/Items.vue 并添加以下代碼:

        <template>
         <div>
         <div style="padding: 20px;">
         <Row :gutter="16">
         <Col :span="24" style="padding:5px">
         <Icon type="shopping-cart" style="margin-right:5px"/>{{shoppingList.length}} item(s)
         <Button @click="show = true" id="checkout">Checkout</Button>
         </Col>
         </Row>
         </div>
         <div v-if="show">
         <Row :gutter="16" style="margin:0 400px 50px 400px">
         <checkout v-bind:shoppingList="shoppingList"></checkout>
         </Row>
         </div>
         <div style="background-color: #ececec; padding: 20px;">
         <Row :gutter="16">
         <Col :span="6" v-for="(item, key) in items" v-bind:key="key" style="padding:5px">
         <Card v-bind:title="item.msg" v-bind:key="key">
         <Button type="primary" @click="addItem(key)">Buy ${{item.price}}</Button>
         </Card>
         </Col>
         </Row>
         </div>
         </div>
        </template>
        
        <script>
        import { Card, Col, Row, Button, Icon } from 'ant-design-vue';
        
        export default {
         methods: {
         addItem (key) {
         if(!this.shoppingList.includes(key)) {
         this.shoppingList.push(key);
         }
         }
         },
         components: {
         Card, Col, Row, Button, Icon,
         checkout: () => import('./Checkout')
         },
         data: () => ({
         items: [
         { msg: 'First Product', price: 9.99 },
         { msg: 'Second Product', price: 19.99 },
         { msg: 'Third Product', price: 15.00 },
         { msg: 'Fancy Shirt', price: 137.00 },
         { msg: 'More Fancy', price: 109.99 },
         { msg: 'Extreme', price: 3.00 },
         { msg: 'Super Shirt', price: 109.99 },
         { msg: 'Epic Shirt', price: 3.00 },
         ],
         shoppingList: [],
         show: false
         })
        }
        </script>
        <style>
        #checkout {
         background-color:#e55242;
         color:white;
         margin-left: 10px;
        }
        </style>

        在此文件中,我們顯示一個(gè)帶有商品數(shù)量的購物車圖標(biāo)。商品是從 items 數(shù)組中提取的。如果單擊項(xiàng)目的 Buy 按鈕,將會(huì)調(diào)用 addItem 方法,該方法會(huì)將相關(guān)商品push到 shoppingList 數(shù)組中。從而增加購物車的總數(shù)。

        我們還在頁面中添加了一個(gè) Checkout 按鈕:

        <Button @click="show = true" id="checkout">Checkout</Button>

        當(dāng)用戶點(diǎn)擊這個(gè)按鈕,我們設(shè)置的參數(shù) showtruetrue 是非常重要對(duì)于有通過條件地加載我們的異步組件。

        在接下來的幾行中,您可以找到 v-if 的聲明,這個(gè)語句僅用來顯示我們 checkout 組件的 <div> ,但是我們只想在用戶點(diǎn)擊 Checkout 按鈕時(shí)顯示結(jié)賬組件,我們該怎么辦?

        這里我們將 checkout 組件在 components 選項(xiàng)里異步加載。這里 v-bind 將參數(shù)傳遞給組件。正如你看的的這樣,創(chuàng)建條件異步組件是很容易的:

        <div v-if="show">
         <checkout v-bind:shoppingList="shoppingList"></checkout>
        </div>

        讓我們快速 Checkout 組件添加下面的代碼在 src/components/Checkout.vue 里:

        <template>
         <Card title="Checkout Items" key="checkout">
         <p v-for="(k, i) in this.shoppingList" :key="i">
         Item: {{items[Number(k)].msg}} for ${{items[Number(k)].price}}
         </p>
         </Card>
        </template>
        
        <script>
        import { Card } from 'ant-design-vue';
        
        export default {
         props: ['shoppingList'],
         components: {
         Card
         },
         data: () => ({
         items: [
         { msg: 'First Product', price: 9.99 },
         { msg: 'Second Product', price: 19.99 },
         { msg: 'Third Product', price: 15.00 },
         { msg: 'Fancy Shirt', price: 137.00 },
         { msg: 'More Fancy', price: 109.99 },
         { msg: 'Extreme', price: 3.00 },
         { msg: 'Super Shirt', price: 109.99 },
         { msg: 'Epic Shirt', price: 3.00 },
         ]
         })
        }
        </script>

        在這里,我們將接收一個(gè) shoppingList 并把他輸出到屏幕上。

        您可以使用該 npm run serve 命令運(yùn)行該應(yīng)用程序。然后導(dǎo)航到 http:// localhost:8080 。如果一切按計(jì)劃進(jìn)行,你應(yīng)該會(huì)看到如下圖所示的內(nèi)容。

        可以嘗試打開在 network 選項(xiàng)卡,點(diǎn)擊Checkout按鈕,可以發(fā)現(xiàn) network 里將異步加載 結(jié)賬組件

        您還可以在GitHub上查看此演示的代碼 。

        為異步組件添加加載中和加載錯(cuò)誤組件

        有時(shí)異步組件加載過長或加載時(shí)。顯示加載動(dòng)畫或錯(cuò)誤信息可能很有用,但要支持這會(huì)再次降低應(yīng)用程序的速度。異步組件應(yīng)該小而且加載速度快。這是一個(gè)例子:

        const Message = () => ({
         component: import("./Message"),
         loading: LoadingAnimation,
         error: ErrorComponent
        });

        總結(jié)

        創(chuàng)建和實(shí)現(xiàn)異步組件非常簡單,應(yīng)該成為標(biāo)準(zhǔn)開發(fā)例程的一部分。從用戶體驗(yàn)的角度來看,盡可能減少初始加載時(shí)間以保持用戶的注意力是非常重要。希望本教程可以幫助您構(gòu)建異步加載組件。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用異步組件優(yōu)化Vue應(yīng)用程序的性能

        使用異步組件優(yōu)化Vue應(yīng)用程序的性能:單頁應(yīng)用其一個(gè)問題是首屏屏渲染速度較慢。這是因?yàn)轫撁媸状渭虞d時(shí)服務(wù)器將向客戶端發(fā)送大量JavaScript,在屏幕上顯示任何內(nèi)容之前必須下載并解析。可以想象,隨著應(yīng)用程序規(guī)模的擴(kuò)大,這個(gè)問題對(duì)用戶體驗(yàn)的影響也會(huì)越來越突出。 現(xiàn)在幸運(yùn)的是,當(dāng)使用Vue
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲色中文字幕在线播放| 亚洲熟妇久久精品| AAAAA级少妇高潮大片免费看| 波多野结衣一区二区免费视频| 黄页网站在线免费观看| 内射无码专区久久亚洲| 四虎精品成人免费视频| 久久夜色精品国产亚洲av| 久久精品免费观看| 亚洲精品视频在线观看视频| 亚洲免费观看在线视频| 亚洲中文无码线在线观看| 久久久高清免费视频| 亚洲精华国产精华精华液网站| 亚洲欧洲日产国码一级毛片| 中文字幕在线视频免费观看| 亚洲福利视频导航| 91精品免费不卡在线观看| 亚洲字幕AV一区二区三区四区| 四虎永久免费影院在线| 91福利免费网站在线观看| 亚洲午夜成激人情在线影院| 午夜私人影院免费体验区| 国产激情久久久久影院老熟女免费 | 在线A亚洲老鸭窝天堂| 国内精品免费久久影院| 亚洲永久中文字幕在线| 在线观着免费观看国产黄| 你懂的在线免费观看| 在线综合亚洲中文精品| 亚洲精品WWW久久久久久| 88xx成人永久免费观看| 国产精品亚洲精品久久精品| 色噜噜AV亚洲色一区二区| 中文免费观看视频网站| 阿v免费在线观看| 亚洲美女视频免费| 成人亚洲综合天堂| 在线看片无码永久免费视频| 国产精品无码永久免费888| 亚洲人成在线中文字幕|