webpack之基礎(chǔ)打包優(yōu)化的實(shí)現(xiàn)
前言
webpack
至今已經(jīng)發(fā)展了5個(gè)版本,如果你還不會(huì)webpack
,那么趕緊學(xué)習(xí)起來吧。webpack
是web前端開發(fā)人員必學(xué)的一個(gè)知識(shí)點(diǎn)。本篇文章帶大家一起看看webpack
基礎(chǔ)的打包優(yōu)化。話不多說,上酸菜~~~~
優(yōu)化loader
在腳手架項(xiàng)目中,想必各位開發(fā)人員都會(huì)用到預(yù)處理的css
。比如sass、stylus、less
這些預(yù)處理語(yǔ)言。我們知道使用這些預(yù)處理css
必須要在webpack
中配置相應(yīng)的loader
。
當(dāng)我們配置過多的loader
時(shí),各loader
之間必定會(huì)轉(zhuǎn)換出大量的代碼,這些代碼會(huì)導(dǎo)致項(xiàng)目在啟動(dòng)和打包時(shí)變得非常慢,這個(gè)時(shí)候就需要我們?nèi)ミM(jìn)行loader
的優(yōu)化了。在loader
的相關(guān)的配置中,我們可以排除掉第三方包中的文件,減少loader
代碼轉(zhuǎn)換的范圍。
module.exports = { module: { rules: [ test: /\.css$/, loader: ['style-loader', 'css-loader'], include: [resolve('src')],// 只在src文件夾下查找 // 不去查找的文件夾路徑,node_modules下的代碼是編譯過得,沒必要再去處理一遍 exclude: /node_modules/ ] } }
壓縮代碼
在webpack
中,我們可以使用UglifyjsWebpackPlugin
這個(gè)插件來壓縮 js 和css的代碼,從而減小項(xiàng)目打包的體積,提升打包速率。
注意:在開發(fā)環(huán)境我們不需要使用這個(gè)插件~
//安裝插件 npm install uglifyjs-webpack-plugin --save-dev //在 vue.config.js中 /** 引入uglifyjs-webpack-plugin */ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); /** 全局變量,當(dāng)前環(huán)境 */ const env = process.env.NODE_ENV; module.exports = { ... configureWebpack: config => { if (env === "production") { config.optimization.minimizer.push( new UglifyJsPlugin({ //測(cè)試匹配壓縮的文件 test: /.js(?.*)?$/i, //要被壓縮的文件 include: //includes/, //是否開啟文件緩存 cache: true, //是否開啟多進(jìn)程并行壓縮 paralleL: true, // 使用uglifyOptions移除掉生產(chǎn)環(huán)境中的console uglifyOptions: { warnings: false, compress: {drop_console: true, drop_debugger: true, pure_funcs: ['console.log']} } })) }}}
uglifyjs-webpack-plugin
這個(gè)插件還有很多的配置項(xiàng) 具體可以參考uglifyjs-webpack-plugin
注意開啟parallel
多進(jìn)程壓縮對(duì)項(xiàng)目打包速度的提升很有幫助
gzip壓縮
除了壓縮 js
和css
,我們還可以壓縮webpack
打包之后的文件。
開啟gzip
壓縮后webpack
生成的js
文件的體積將縮小原來的30%以上。
要開啟gzip
壓縮 我們也需要用到一個(gè)插件compression-webpack-plugin
并且我們還需要保證服務(wù)端和客戶端都支持gzip
。
//安裝插件 npm install compression-webpack-plugin --save-dev //在 vue.config.js中 /** 引入compression-webpack-plugin */ const CompressionWebpackPlugin = require('compression-webpack-plugin'); const productionGzipExtensions = /.(js|css|json|txt|html|icon|svg)(?.*)$/i module.exports = { ... configureWebpack: config => { if (env === "production") { config.plugins.push({ new CompressionWebpackPlugin({ filename: '[path].gz[query]', algorithm: 'gzip', test: productionGzipExtensions, threshold: 10240, minRatio: 0.8 }) }) }}}
compression-webpack-plugin
這個(gè)插件同樣也有很多的配置項(xiàng),具體參考compression-webpack-plugin
抽離公共依賴包
對(duì)于一些體積較大,不長(zhǎng)更新的包,我們并不需要下載到項(xiàng)目中使用。我們可以選擇使用cdn的方式去進(jìn)行引入,當(dāng)然最好還是將這些庫(kù)放在自己的服務(wù)器下~ webpack
允許我們?cè)谕獠恳胍恍┵Y源。
在webpack
的配置中有這樣一個(gè)配置項(xiàng) externals
:
防止將某些
import
的包(package)打包到bundle
中,而是在運(yùn)行時(shí)(runtime)再去從外部獲取這些擴(kuò)展依賴(external dependencies) 。
從外部加載擴(kuò)展的依賴而不是在項(xiàng)目中獲取。 顯然,這肯定能減少項(xiàng)目大小,縮小打包體積。
抽離公共依賴包我們也需要安裝一個(gè)插件html-webpack-plugin
。使用這個(gè)插件主要是將外部引入的cdn放到index.html
中加載。
如果你的webpack的版本大于4.0那么你無需安裝,webpack4.0
已經(jīng)自帶了該插件。本項(xiàng)目中的webpack
的版本是4.2.15的因此無需安裝
下面和我一起看看該如何進(jìn)行配置:
// 在 vue.config.js中 const baseUrl = 'https://minturechan.oss-cn-shenzheng.aliyuncs.com/npm' const cdn = { js: [`${baseUrl}vue@2.6.11/dist/vue.min.js`, `${baseUrl}vue-router@3.2.0/dist/vue-router.min.js`, `${baseUrl}vuex@3.4.0/dist/vuex.min.js`, `${baseUrl}view-design@4.0.0/dist/iview.min.js`, `${baseUrl}jquery@3.4.1/dist/jquery.min.js` ], css: [`${baseUrl}view-design@4.0.0/dist/styles/iview.css`] } module.exports ={ chainWebpack: config => { //config.plugin('html')這個(gè)表示獲取 html-webpack-plugin這個(gè)插件~ config.plugin('html').tap(args => { if (env === "production") { args[0].cdn = cdn } return args }) } }
在vue.config.js
中配置完成后 我們還需要在public
文件夾下的index.html
中引入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <link rel="icon" href="<%= BASE_URL %>zyd.ico" rel="external nofollow" > <title>test</title> <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %> <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="preload" as="style" /> <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="stylesheet" /> <% } %> <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js){ %> <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script> <% } %> </head> <body> <div id="app"> <!-- built files will be auto injected --> </div> </body> </html>
在index.html
中加上如下代碼即可引入外部cdn資源~~
最后
webpack
還有非常多可以優(yōu)化的地方,本文只是簡(jiǎn)單的說明了一些webpack
基礎(chǔ)的打包優(yōu)化配置。
到此這篇關(guān)于webpack之基礎(chǔ)打包優(yōu)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)webpack 打包優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue打包通過image-webpack-loader插件對(duì)圖片壓縮優(yōu)化操作
- webpack打包優(yōu)化的幾個(gè)方法總結(jié)
- Vue項(xiàng)目總結(jié)之webpack常規(guī)打包優(yōu)化方案
- 淺談 Webpack 如何處理圖片(開發(fā)、打包、優(yōu)化)
- webpack dll打包重復(fù)問題優(yōu)化的解決
- 淺談Webpack打包優(yōu)化技巧
- webpack4.0打包優(yōu)化策略整理小結(jié)
- vue webpack打包優(yōu)化操作技巧
- 淺談React + Webpack 構(gòu)建打包優(yōu)化
相關(guān)文章
Javascript模擬scroll滾動(dòng)效果腳本
項(xiàng)目需要寫了一段模擬Scroll滾動(dòng)代碼,分享的同時(shí),我有些疑問,希望大家能幫忙解決,代碼如下2008-09-09js簡(jiǎn)單實(shí)現(xiàn)圖片延遲加載的方法
這篇文章主要介紹了js簡(jiǎn)單實(shí)現(xiàn)圖片延遲加載的方法,涉及javascript針對(duì)頁(yè)面元素的遍歷與動(dòng)態(tài)設(shè)置技巧,需要的朋友可以參考下2016-07-07javascript實(shí)現(xiàn)用戶點(diǎn)擊數(shù)量統(tǒng)計(jì)
本文主要javascript實(shí)現(xiàn)用戶點(diǎn)擊數(shù)量統(tǒng)計(jì)的方法進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,需要的朋友一起來看下吧2016-12-12toString.call()通用的判斷數(shù)據(jù)類型方法示例
這篇文章主要給大家介紹了關(guān)于toString.call()通用的判斷數(shù)據(jù)類型方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08javascript中的prototype屬性使用說明(函數(shù)功能擴(kuò)展)
一說到prototype很多人可能第一個(gè)想到的是著名的prototype.js框架,當(dāng)然我們今天說的不是它,而是Javascript中的prototype屬性,一般都被翻譯為“原型”。2010-08-08比較常見的javascript中定義函數(shù)的區(qū)別
js定義函數(shù)有好多種,但是他們之間的區(qū)別,大家都了解嗎,接下來,小編通過本文給大家介紹比較常見的js中定義函數(shù)的區(qū)別,對(duì)本文感興趣的朋友一起看看吧2015-11-11javascript同步Import,同步調(diào)用外部js的方法
javascript同步Import,同步調(diào)用外部js的實(shí)現(xiàn)代碼,測(cè)試確實(shí)可用2008-07-07