使用Webpack提升Vue.js應用程式的4種方法(翻譯)

2020-12-04 志學Python

本文翻譯自,翻譯技巧不太好,不喜勿碰 :4 Ways To Boost Your Vue.js App With Webpack眾所周知,webpack 是 開發 vue.js 單頁面應用程式的必備工具,通過管理複雜的構建步驟,它可以使您的開發工作流程更加簡單,並且可以優化應用程式的大小和性能。在本文中,我將解釋Webpack增強Vue應用程式的四種方法,包括:

Single file components 單文件組件Optimising the Vue buildBrowser cache managementCode splitting關於 vue-cli

如果您使用模板從vue-cli構建應用程式,那麼將提供預製的Webpack配置。它們已經過優化,沒有任何改進建議!但是,由於它們開箱即用的效果非常好,您可能對它們的實際功能並不太了解,對嗎?考慮一下本文,對vue-cli模板中使用的Webpack配置進行概述,因為它們包含了我在這裡討論的相同優化。

1. Single file components

Vue的特有功能之一是將HTML用於組件模板。但是,這些帶有一個固有的問題:要麼您的HTML標記需要使用笨拙的JavaScript字符串,要麼您的模板和組件定義必須位於單獨的文件中,從而使其難以使用。

Vue有一個優雅的解決方案,稱為「單個文件組件(SFC)」,該文件將模板,組件定義和CSS都包含在一個簡單的.vue文件中:

<template><divid="my-component">...</div></template><script> export default {...}</script><style> #my-component {...}</style>vue-loader Webpack插件使SFC成為可能。該加載器拆分SFC語言塊並將每個管道通過管道傳輸到適當的加載器,例如腳本塊轉到babel-loader,而模板塊轉到Vue自己的vue-template-loader,後者將模板轉換為JavaScript渲染函數。vue-loader的最終輸出是一個JavaScript模塊,準備將其包含在Webpack捆綁包中。vue-loader的典型配置如下:

module:{ rules:[{ test:/\.vue$/, loader:'vue-loader', options:{ loaders:{// Override the default loaders}}},]}2. Optimising the Vue build

如果僅在Vue應用程式*中使用渲染功能,而沒有HTML模板,則不需要Vue的模板編譯器。您可以通過從Webpack構建中省略編譯器來減小捆綁包的大小。請記住,單個文件組件模板已在開發中預編譯以呈現功能!Vue.js庫只有運行時版本,其中包含Vue.js的所有功能,但模板編譯器稱為vue.runtime.js。它比完整版本小20KB,因此如果可以的話值得使用。

默認情況下,僅使用運行時構建,因此,每次使用 import vue from 'vue' 時,都將使用它。在您的項目中,這就是您所得到的。但是,您可以使用alias 別名配置選項更改為其他版本:

resolve:{alias:{'vue$':'vue/dist/vue.esm.js' // Use the full build}},Stripping out warnings and error messages in production

減小Vue.js構建大小的另一種方法是刪除生產中的任何錯誤消息和警告。這些使用不必要的代碼使輸出包大小膨脹,並且還導致您最好避免運行時開銷

如果您檢查Vue原始碼,則會看到警告塊取決於環境變量process.env.NODE_ENV的值,例如:

if (process.env.NODE_ENV !== 'production') { warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);}如果將process.env.NODE_ENV設置為生產,那麼在構建過程中,minifier可以自動將此類警告塊從代碼中剝離。

您可以使用DefinePlugin來設置process.env.NODE_ENV的值,並使用UglifyJsPlugin來減少代碼並去除未使用的塊:

if(process.env.NODE_ENV ==='production'){module.exports.plugins =(module.exports.plugins ||[]).concat([new webpack.DefinePlugin({'process.env':{ NODE_ENV:'"production"'}}),new webpack.optimize.UglifyJsPlugin()])}3. Browser cache management

用戶的瀏覽器將緩存您網站的文件,以便僅在該瀏覽器尚無本地副本或本地副本已過期時才下載。

如果您所有的代碼都在一個文件中,那麼進行微小的更改就意味著需要重新下載整個文件。

理想情況下,您希望用戶下載得儘可能少,因此將應用程式很少更改的代碼與頻繁更改的代碼分開是明智的。

Vendor file

Common Chunks插件可以將您的 vendor 代碼(例如,不太可能經常更改的Vue.js庫之類的依賴項)與您的應用程式代碼(每次部署可能更改的代碼)分離。您可以配置插件以檢查依賴項是否來自node_modules文件夾,如果是,則將其輸出到單獨的文件vendor.js中:

new webpack.optimize.CommonsChunkPlugin({name: 'vendor', minChunks: function (module){ return module.context && module.context.indexOf('node_modules') !== -1;}})如果這樣做,您現在在構建輸出中將有兩個單獨的文件,這些文件將由瀏覽器獨立緩存:

<scriptsrc="vendor.js"charset="utf-8"></script><scriptsrc="app.js"charset="utf-8"></script>Fingerprinting

當構建文件更改時,我們如何破壞瀏覽器的緩存?默認情況下,僅當緩存的文件到期時,或者當用戶手動清除緩存時,瀏覽器才會再次從伺服器請求文件。如果伺服器指示文件已更改,則將重新下載該文件(否則伺服器返回HTTP 304 Not Modified)。為了節省不必要的伺服器請求,我們可以在每次文件內容更改時更改其名稱,以強制瀏覽器重新下載該文件。一個簡單的系統可以通過在文件名後附加一個哈希來為文件名添加「指紋」:

image.png

Common Chunks插件會發出「 chunkhash」,如果文件內容已更改,則將對其進行更新。Webpack可以在輸出文件名時將此哈希附加到文件名中:

output:{filename:'[name].[chunkhash].js'},執行此操作時,您將看到輸出的文件將具有類似app.3b80b7c17398c31e4705.js的名稱。

Auto inject build files

當然,如果添加哈希,則必須更新索引文件中對該文件的引用,否則瀏覽器將不知道該哈希:

<scriptsrc="app.3b80b7c17398c31e4705.js"></script>手動完成這項工作非常繁瑣,因此請使用HTML Webpack插件為您完成。該插件可以在捆綁過程中自動將對構建文件的引用注入到HTML文件中。首先刪除對構建文件的引用:

<!DOCTYPE html><html><head><metacharset="utf-8"><title>test-6</title></head><body><divid="app"></div><!-- built files should go here, but will be auto injected --></body></html>並將HTML Webpack插件添加到您的Webpack配置中:

new HtmlWebpackPlugin({filename:'index.html'template:'index.html',inject: true,chunksSortMode:'dependency'}),現在,帶有哈希的構建文件將自動添加到索引文件中。另外,您的index.html文件現在將包含在捆綁輸出中,因此您可能需要告訴Web伺服器其位置已更改

4. Code splitting

默認情況下,Webpack會將所有應用程式代碼輸出到一個大捆綁包中。但是,如果您的應用有多個頁面,則拆分代碼會更有效,因此每個單獨的頁面代碼都位於單獨的文件中,並且僅在需要時才加載Webpack具有一項稱為「代碼拆分」的功能。在Vue.js中實現此功能還需要異步組件,並且通過Vue Router變得更加容易。

Async components

異步組件沒有將定義對象作為第二個參數,而是具有一個Promise函數來解析該定義對象,例如:

Vue.component('async-component',function(resolve, reject){setTimeout(()=>{resolve({// Component definition including props, methods etc.});},1000)})Vue僅在組件實際需要渲染時才調用該函數。它還會緩存結果以供將來重新渲染。如果我們設計應用程式,使每個「頁面」都是一個組件,並且將定義存儲在伺服器上,那麼我們就完成了代碼拆分的一半。

require

要從伺服器加載異步組件的代碼,請使用Webpack require語法這將指示Webpack在構建時將async-component捆綁在一個單獨的bundle中,更好的是,Webpack將使用AJAX處理此bundle的加載,因此您的代碼可以像這樣簡單:

Vue.component('async-component',function(resolve){require(['./AsyncComponent.vue'], resolve)});Lazy loading

在Vue.js應用程式中,vue-router通常是您用於將SPA組織到多個頁面中的模塊。延遲加載是使用Vue和Webpack實現代碼拆分的一種形式化方法。

constHomePage=resolve=>require(['./HomePage.vue'], resolve);const rounter =newVueRouter({ routes:[{ path:'/', name:'HomePage', component: HomePage}]})翻譯到此為止了,如果可以歡迎點讚關注我的公主號

相關焦點

  • webpack的異步加載原理及分包策略
    import() 按需加載webpack4 官方文檔提供了模塊按需切割加載,配合 es6 的按需加載 import() 方法,可以做到減少首頁包體積,加快首頁的請求速度,只有其他模塊,只有當需要的時候才會加載對應 js。import()的語法十分簡單。
  • Vue全家桶使用免費內網穿透工具,無需伺服器讓外網直接訪問
    Vue全家桶使用免費穿透工具, 無需伺服器讓外網直接訪問網雲穿-最簡單易用的內網穿透軟體,最簡潔教程一鍵穿透網站、資料庫、遠程桌面網雲穿是一款可以在包括但不限於Windows、Mac、Linux、群輝、樹莓派、威聯通上使用的內網穿透,它可以很便捷的幫助你將本地內網的應用發布出去
  • Vue.js 0.11.5 發布,JavaScript 庫
    Vue.js 0.11.5 發布,此版本主要是功能改進和 bug 修復:改進bug 修復Fixed an issue
  • ref vue 獲取文本專題及常見問題 - CSDN
    ref的官網介紹https://cn.vuejs.org/v2/api/#ref需求在普通的js操作中,一般都是直接操作dom元素,但是對於Vue.js框架來說,一般是不允許直接操作dom元素的。那麼其實Vue.js框架提供了ref獲取dom元素,以及組件引用。
  • vue3.0手機聊天室|Vue3+Vant3仿微信界面
    項目簡介Vue3Chat是基於vue3.x+vuex4+vue-router4全家桶技術和vant3.x構建開發的一款mobile仿微信界面聊天實例。實現了發送圖文消息、圖片|視頻預覽、位置查看、紅包|朋友圈等功能。
  • 如何使用智能SQL查詢提升應用程式性能?
    資料庫是由應用程式中運行的所有進程使用的共享資源。即便只有一處設計不當的訪問也可能拖累整個系統的性能。本文討論了一些巧妙的SQL查詢方法,已完全改變了我們系統的一些部分,從而提升了應用程式性能,最終改善客戶體驗。
  • 貓翻譯?Meowtalk應用程式聲稱能翻譯喵喵喵
    然後,用戶可以幫助標記翻譯,這有助於創建供AI軟體學習的資料庫。然而,每隻貓咪的叫聲都是獨一無二的,為主人量身定做的,而不是有一個共享的貓咪聲音資料庫,有些貓咪的叫聲比其他貓咪的叫聲更響亮。因此,應用程式的翻譯不同於個人資料。用戶標註的聲音越多,人工智慧軟體就越能理解每隻個體貓咪的聲音。
  • 用Node.js進行後端開發的特點與優勢
    從根本上說,Node.js是一種框架,是一種在瀏覽器後臺(或外部)運行JavaScript(JS)代碼的運行時(runtime)環境。而作為一種程式語言,由JavaScript編寫的統一代碼庫,不但加快了開發進程,而且實現了過往我們無法完成的Web開發任務。 其實,Node.js後端開發並非什麼新鮮事物,它既適用於企業級的應用程式,又適用於B2C類型的應用。
  • 9000字實操指南:換個姿勢深入微信小程序
    app.js 是全局的一些方法,比如獲取用戶信息,全局數據的配置地方。js 會部分轉成原生的 java 和 oc 代碼執行,那麼頁面呢?用的是作業系統原生的組件嗎?隨著 vue 等前端框架的普及,越來越多的 SPA 架構網頁應用出現,微信小程序應該就是基於此種技術,使用 SPA 架構的應用只需要在剛開始的時候 loading 加載,切換到應用內的其他頁面不需要再加載新的頁面,所以非常流暢。那是不是說明我們可以不做小程序而用 vue 來寫就可以了?
  • QRCanvas-動態生成二維碼的開源優秀js庫
    QRCanvas 功能特性API 非常簡單,簡單到只需要一個文本參數就能生成二維碼雖然調用簡單,但也提供了強大的定製化功能零依賴,只需要瀏覽器支canvas,兼容性極佳支持 vue / react 等框架以及 cdn 引入的方式在前端使用,也支持 node.js 後端調用
  • 如何使用Ruby開發Android應用程式
    繼續閱讀以了解如何使用RubyMotion創建用Ruby編寫的行動應用程式。行動應用程式的開發方式在過去十年中發生了巨大變化。行動應用程式是使用Android和iOS等本機技術構建的,然後是Titanium和PhoneGap等移動框架,允許JavaScript開發人員構建具有持續框架限制的混合行動應用程式。
  • Vue的生命周期有多長?
    Vue目前作為前端三大框架之一,在行業內使用的越來越廣泛,但你有系統地學習過,並且掌握了其要領麼? 最近大家都有注意到吧——網際網路各個公司都開始擴招程式設計師了,也表示前端的競爭愈來愈激烈。
  • JS-ipfs為瀏覽器實現提供無限可能
    1、運行在Node.js和瀏覽器中 js-ipfs在Node.js,Electron和任何現代瀏覽器上開箱即用它是為IPFS所開發的網絡層功能,現在您可以通過IPFS在應用程式中直接使用。
  • 前端周報:Vue 新語法糖引爭議;VSCode 現內存洩漏 BUG,官方置若罔聞引不滿;百度應用收集用戶敏感數據被谷歌短暫下架
    微軟希望 Windows 系統跑 Android 應用的願景最早可以追溯到 2014 年,當時微軟啟動了 Android 應用移植項目"Project Astoria"和 iOS 應用移植項目"Project Islandwood",旨在為開發者提供將 Android 和 iOS 應用移植到 Windows 平臺 (Windows Phone) 的簡便方法。
  • 谷歌翻譯工具大升級,Hostelworld等旅企率先應用
    六個月前,Google開始為各個國家的語言文字提供升級版在線翻譯服務,此次升級在譯文的流暢性、準確度以及翻譯速度等方面較上個版本都有很大的提升。Google翻譯事業部團隊稱,今年Google在線翻譯服務的提升程度比過去十年加在一起還好大。
  • LOL屏幕保護應用程式下載地址 LOL屏保使用方法教程
    《英雄聯盟》的屏幕應用程式終於和大家見面了。我們通過屏保應用將海量原畫資源推送給廣大玩家,在這裡,只需要點擊幾下滑鼠,就可以輕鬆定製專屬於您的屏幕保護列表!最豐富最全面的英雄聯盟遊戲原畫動畫資源,馬上下載,即刻擁有。
  • js代碼優化之編程函數
    在編程的世界中,有這樣的一個原則,簡稱二八定律二八定律:影響程序的80%性能的往往是20%的代碼在js的編寫過程中,函數設計就相當於那20%,時刻影響著你的代碼,可以說是至關重要。那麼對於函數的設計原則,你又了解多少?1.