<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何通過性能優(yōu)化,將包的體積壓縮了 62.7%(附代碼)

          共 5611字,需瀏覽 12分鐘

           ·

          2022-12-17 21:35

          來源:大前端技術之路
          本文約3300字,建議閱讀9分鐘
          本文手把手教你如何壓縮包體積。

          作者:小北與喬
          https://juejin.cn/post/7136453274948861983

          前同事找到我,向我請教了一個性能優(yōu)化的問題,我簡單的跟他回答了一下例如組件懶加載、路由懶加載、開啟gzip、公共的第三方包上cdn、還有基礎的雅虎53條軍規(guī)一條條排查等等。

          我說完這些,他好像不是很滿意,想讓我多說一點。

          于是,我想起了在上一家公司的基于vue-cli@2的項目正好做了一次優(yōu)化。

          之前那個項目包找不到了,我臨時用vue-cli@2腳手架搭了一個項目,基于mint-ui寫了10+的頁面,以此作為例子,從打包階段和上線優(yōu)化階段這兩個部分做一次像素級的拆解和演示。

          系好安全帶,開始發(fā)車了。

          以下是本文基本目錄:

          - 打包階段 - 第一步:安裝speed-measure-webpack-plugin - 第二步:安裝cache-loader - 第三步:安裝happypack - 第四步:安裝webpack-parallel-uglify-plugin - 打包總結(jié)- 上線優(yōu)化階段 - 第一步:基礎優(yōu)化 - 第二步:路由懶加載和按需引入 - 第三步:優(yōu)化代碼和合并相同的包 - 第四步:在服務器上的優(yōu)化 - 上線優(yōu)化總結(jié)- 最后優(yōu)化總結(jié)

          打包階段


          這是一個基于[email protected]的項目,所以在安裝各種功能包的時候要注意其版本,所以下面的安裝包我都貼心的把對應的版本加上了,大家放心使用。

          第一步:安裝speed-measure-webpack-plugin


           安裝包版本:"speed-measure-webpack-plugin""^1.5.0"

          該安裝包的作用:在打包的過程中,能夠精確的幫你分析出每一個步驟耗費的時間,然后我們可以針對時間比較長的部分專門做優(yōu)化。

          以下是配置:

          const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");const smp = new SpeedMeasurePlugin();const webpackConfig = smp.wrap(merge(baseWebpackConfig, { ... }))

          執(zhí)行npm run build之后,我們可以看到以下結(jié)果。


          第二步:安裝cache-loader


           安裝包版本:"cache-loader""^4.1.0"

          對sass-loader、postcss-loader、vue-loader做打包緩存,縮短打包的時間。
          以下是對vue-loader和url-loader做緩存的代碼:

          const cacheLoader = { loader: 'cache-loader'}rules: [ { test: /\.vue$/, use: [ cacheLoader, { loader: 'vue-loader', options: vueLoaderConfig } ] }, ...... { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, use: [ cacheLoader, { loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } } ] }

          以下是對cssLoader、postcssLoader做緩存的代碼:

          const loaders = options.usePostCSS ? [cacheLoader, cssLoader, postcssLoader] : [cacheLoader, cssLoader]

          執(zhí)行npm run build之后,我們可以看到以下結(jié)果:


          對比之后的成果:plugin打包時間縮短了0.8秒鐘,loader時間縮短了2.94秒鐘,打包一共縮短了2.7秒鐘。由于這個項目包比較小,縮短的時間不是特別明顯。


          第三步:安裝happypack(當前項目太小,沒有起到效果,當時后端管理項目有優(yōu)化效果)


           安裝包版本:"happypack""^5.0.1"

          可以在打包的時候開啟多線程打包。使用鏈接如下:www.npmjs.com/package/happypack

          因為上面主要是sass-loader包最占用時間,并且已經(jīng)開啟了緩存,時間上優(yōu)化到很小的一個水平了。當然,我重新開啟了happypack進行多線程打包,可能由于項目太小,發(fā)現(xiàn)時間不僅沒有變短,還多了0.2秒。劃不來了,就不畫蛇添足了,對這個功能好奇的朋友可以嘗試解鎖一下。

          稍大一些的項目可以開啟這個多線程打包模式,根據(jù)具體的項目而定。


          第四步:安裝webpack-parallel-uglify-plugin


           安裝包版本:"webpack-parallel-uglify-plugin""1.1.0"

          用上圖中可以看到UglifyJsPlugin這個包的打包時間太長,我想到可以使用webpack-parallel-uglify-plugin這個包,開啟多核同步壓縮增加壓縮的效率。
          說干就干,開始配置。

          const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');new ParallelUglifyPlugin({ uglifyJS: { output: { beautify: false, // 是否保留空格和制表符,設置為不保留 comments: false, // 是否保留代碼中的注釋,設置為不保留 }, compress: { drop_console: true, // 是否刪除代碼中的console語句,設置為刪除 collapse_vars: false, // 是否內(nèi)嵌雖然已經(jīng)定義了,但是只用到一次的變量,設置為不使用 reduce_vars: false, // 是否提取出現(xiàn)了多次但是沒有定義成變量去引用的靜態(tài)值,設置為不轉(zhuǎn)換 }, warnings: false // 是否在刪除沒有用到的代碼時輸出警告信息,設置為不警告 }, }),
          將UglifyJsPlugin之前配置的地方用ParallelUglifyPlugin的配置覆蓋。再執(zhí)行npm run build,對比前后的打包速度。


          打包速度減少了0.9秒,plugin的壓縮速度好像沒有變化(可能是我的電腦性能不太好,去年那個管理端的項目優(yōu)化是能看到幾秒的優(yōu)化效果的)

          打包總結(jié)


          從這個小項目出發(fā)來看,整個打包過程從9.95秒減少到6.52秒,打包效率提高了35%,去年我做的后臺項目的打包效率提升大概是43%左右,總體來說差距不是很大。

          上線優(yōu)化階段


          首先安裝一個包分析工具,用來查看生成的包的大小。

          安裝webpack-bundle-analyzer


          • 打開分析有2種方式:
            • 方式1:在plugins中做默認配置new BundleAnalyzerPlugin(),然后執(zhí)行npm run dev的時候,會自動彈出一個頁面,然后再頁面中查看每個包的大小
            • 方式2:在plugins中做進行配置,會生成一個stats.json文件,執(zhí)行webpack --profile --json > stats.json命令生成分析文件,執(zhí)行webpack-bundle-analyzer --port 8888 ./dist/stats.json展示各個包的體積頁面。

          方式1在做開發(fā)的時候會覺得很奇怪,每次啟動開發(fā)的時候都會自動打開分析文件,一臉的黑人問號,所以選擇方式2更加人性化,在想要分析的時候直接分析并生成頁面即可。

          進行以下配置:

          // webpack.config.jsconst BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginplugins: [ new BundleAnalyzerPlugin({ analyzerMode: 'disabled', // 不啟動展示打包報告的http服務器 generateStatsFile: true, // 是否生成stats.json文件 })]
          // package.json"generateAnalyzFile": "webpack --config build/webpack.dev.conf.js --profile --json > stats.json", // 生成分析文件"analyz": "webpack-bundle-analyzer --port 8888 ./stats.json" // 啟動展示打包報告的http服務器

          查看每個包的占用情況:


          下面開始做優(yōu)化。

          第一步:基礎優(yōu)化


          根據(jù)雅虎35條軍規(guī)的規(guī)則,先看自己的項目有沒有要優(yōu)化的。鏈接地址在這里:www.jianshu.com/p/4cbcd202a591%E3%80%82

          在這里列舉常用的一些:

            1. 盡量減少HTTP請求數(shù)
            2. 減少DNS查找
            3. 避免重定向
            4. 讓Ajax可緩存
            ......
            35. 添上Expires或者Cache-Control HTTP頭


          第二步:路由懶加載和按需引入


          1、路由懶加載

          { path: '/', name: 'TopicList', component: import('@/components/TopicList')}

          2、組件的按需引入

          因為使用到的公用組件比較少,采用按需引入的方式,而不是將整個包放到cdn中:

          import { Header, Button} from 'mint-ui'Vue.use(Header)Vue.use(Button)

          查看優(yōu)化效果:


          優(yōu)化效果:減少了0.17MB,效果不是很明顯

          第三步:優(yōu)化代碼和合并相同的包


          此時的包展示情況是這樣的:


          1. 對這些包進行分析并優(yōu)化

          首先看到這里的0.js,1.js和2.js中的moment.js都有用到,能不能只對他們做一個合并。而且moment.js占用的包太大了,能不能只對其中使用到的部分進行打包。

          首先是對moment.js只引用中文包的優(yōu)化,配置如下:

          //解決moment打包的時候把所有的語言都打包進去的問題new webpack.ContextReplacementPlugin(/moment[\\\/]locale$/, /^\.\/(zh-cn)$/)

          同時有一些組件引用了這個組件,但是沒有使用,這種情況也會打包進去,所以無用的代碼也要刪除:

          // 這部分引入了,但是沒使用,要刪除import moment from 'moment'

          刪除無用的代碼之后成了這樣。


          只有1.js和3.js對整個包有做引用(這是異步加載的組件)。

          此時整個項目包的大小在1.34Mb。

          2.然后是對moment.js包配置,讓其只打包一次。

          將moment.js項目單獨提取出來,通過全局引入的方式,就不會在每個項目中都重復引入了??梢赃M行如下配置:

          // main.jsimport moment from 'moment'Vue.prototype.$moment = moment
          // TopicList.vueconst date1 = this.$moment(date).fromNow(true)

          此時優(yōu)化后的結(jié)果如下:


          我想了一下,整個moment.js在組件間的引入方式是異步引入的,首屏加載的時候不會引入其他文件的moment.js。這個步驟可以根據(jù)大家的實際加載速度來處理。

          后續(xù)如果加入到app.js中的公共包太多了,可以將公共部分的包提取出來,將其傳入到cdn加速服務中,減小app.js的包的大小。

          此時包的大小在1.17MB。

          第四步:在服務器上的優(yōu)化


          1. 圖片和其他文件進行無損壓縮,并上傳到cdn上

          圖片通過tinyjpg.com該網(wǎng)站進行無損壓縮之后,上傳到騰訊云對象存儲中。css和js等代碼文件進行壓縮,然后再上傳熬cdn上。

          2. nginx配置開通gzip,從線上拉取的代碼能壓縮2/3


          上線之后,最終的包大小在123.3KB。


          上線優(yōu)化總結(jié)

          從分析工具上來看:最初包的體積是3.14MB,減少到1.17MB,一共優(yōu)化了1.97MB的體積,優(yōu)化效率在62.7%

          通過上面的4步操作之后,整個包最終體積是123.KB,打開速度很快,挺好的。


          最后優(yōu)化總結(jié)


          經(jīng)過上面的操作,我們可以看到。

          • 在打包階段,打包時間整個打包過程從9.95秒,減少到6.52秒,打包優(yōu)化效率提高了35% 。
          • 在上線前的優(yōu)化階段,從最初的體積是3.14MB,減少到1.17MB,優(yōu)化效率在62.7% ,挺不錯的結(jié)果。
          編輯:黃繼彥



          瀏覽 81
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91青娱乐极品盛宴 | 人人免费人人摸 | 激情色五月天 | 亚洲AV首页 | 亚洲激情图片 |