vue項(xiàng)目?jī)?yōu)化

(1)排除 和 解決編譯打包中的 警告和 錯(cuò)誤

(2)在生產(chǎn)環(huán)境中 清除 console.log()

  • 使用 babel-plugin-transform-remove-console 插件 清除
  • 安裝開發(fā)依賴:


    2020-05-05_192002.png
  • 在 babel.config.js 文件中添加配置

// 這是項(xiàng)目發(fā)布階段需要用到的babel 插件
const prodPlugins = []
// 判斷編譯模式,如果時(shí)在production 也就是生產(chǎn)模式,就向prodPlugin這個(gè)數(shù)組中添加 transform-remove-console
// 如果不是 production 就添加的一個(gè)空數(shù)組糕珊, 然后將prodPlugins 在plugins中展開
if(ProcessingInstruction.env.NODE_ENV === 'production'){
  prodPlugins.push('transform-remove-console')
}


module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    [
      'component',
      {
        libraryName: 'element-ui',
        styleLibraryName: 'theme-chalk'
      }
    ],
    // 發(fā)布產(chǎn)品時(shí)的 插件數(shù)組
    ...prodPlugins
  ]
}

(3) 生成打包報(bào)告

  • 第一種方法:通過命令行參數(shù)的形式生成報(bào)告
    // 通過 vue-cli 的命令選項(xiàng)可以生成打包報(bào)告
    // --report 選項(xiàng)可以生成 report.html 以幫助分析包內(nèi)容
    vue-cli-service build --report

  • 第二種方式: 通過可視化的ui 面板直接查看報(bào)告(推薦)
    在可視化的ui 面板種,通過控制臺(tái)和分析面板假消,可以方便的看到項(xiàng)目中所存在的問題。


    2020-05-05_201954.png
2020-05-05_202410.png

(4)通過 vue.config.js 修改webpack 的默認(rèn)配置

通過vue-cli 3.0 工具生成的項(xiàng)目岭接,默認(rèn)隱藏了所有webpack 的配置項(xiàng)富拗,目的時(shí)為了屏蔽項(xiàng)目的配置過程臼予,讓程序員把重心放到具體功能和業(yè)務(wù)邏輯的實(shí)現(xiàn)上。

如果有要修改webpack 默認(rèn)配置的需求啃沪,可在項(xiàng)目根目錄種粘拾,按需創(chuàng)建 vue.config.js 這個(gè)配置文件,從而對(duì)項(xiàng)目的打包發(fā)布過程做自定義的配置(具體配置參考 https://cli.vuejs.org/zh/config/#vue-config-js

// 在項(xiàng)目根目錄創(chuàng)建 vue.config.js文件
// 在這個(gè)文件種创千,應(yīng)該導(dǎo)出一個(gè)包含了自定義配置選項(xiàng)的對(duì)象
modulu.exports = {
  // 選項(xiàng)...m
}

(5) 為開發(fā)模式與發(fā)布模式指定不同的打包入口

默認(rèn)情況下缰雇,Vue項(xiàng)目的開發(fā)模式和發(fā)布模式,共用同一個(gè)打包的入口文件(即src/main.js)追驴。為了將項(xiàng)目的開發(fā)過程與發(fā)布過程分離械哟,我們可以為兩種模式,各自指定打包的入口文件殿雪,即:

  • 開發(fā)模式入口文件為: src/main-dev.js
  • 發(fā)布模式入口文件為: src/main-prod.js
    修改打包入口文件有兩種方式暇咆,1.chainWebpack 通過鏈?zhǔn)骄幊痰男问剑瑏硇薷?webpack 配置丙曙;2. configureWebpack 通過操作對(duì)象的形式爸业,來修改默認(rèn)的webpack配置
    兩者具體使用差異,可以參考 https://cli.vuejs.org/zh/guide/webpack.html#webpack-%E7%9B%B8%E5%85%B3
// 在 vue.config.js 文件中通過 chainWebpack 修改打包入口配置
// 同時(shí)在 src 目錄下亏镰,將一個(gè)main.js文件扯旷,
// 復(fù)制成兩個(gè)main-prod.js  和main-dev.js 兩個(gè)入口文件
modulu.exports = {
  chainWebpack: config => {
    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-prod.js')
    })

    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-dev.js')
    })
  }
}

(6)通過 externals 加載外部CDN 資源

默認(rèn)情況下,通過import 語(yǔ)法導(dǎo)入的第三方易拉寶拆挥,最終會(huì)被打包合并到同一個(gè)文件中薄霜,從而導(dǎo)致打包成功后某抓,單文件體積過大的問題纸兔。

為了解決上述問題,可以通過webpack 的 externals 節(jié)點(diǎn)否副,來配置并加載外部的 CDN 資源汉矿。 凡是聲明在 externals 中的第三方依賴包都不會(huì)被打包。

  • 第一步:先將依賴包添加到 externals 節(jié)點(diǎn)下
    同樣在vue.config.js 中進(jìn)行配置
modulu.exports = {
  chainWebpack: config => {
    // 發(fā)布模式 
    // 只有在發(fā)布模式下备禀,才需要將第三方依賴包配置到 externals 節(jié)點(diǎn)下
    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-prod.js')
      config.set('externals', {
        vue: 'Vue',
        'vue-router': 'VueRouter',
        axios: 'axios',
        // 把使用到的第三方依賴包 添加進(jìn)來洲拇,然后進(jìn)行第二步
      })
    })

    // 開發(fā)模式
    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-dev.js')
    })
  }
}
  • 第二步:需要在public/index.html文件的頭部,添加使用到的第三方依賴包的css樣式表和js文件引用曲尸, 的CDN 資源的引用
// 在 public/index.html 中 引入 CDN鏈接的 js文件和css文件
// 引入之前赋续,需要在發(fā)布入口文件 main-prod.js 文件中刪除 import 導(dǎo)入的資源文件
<link rel="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css">

<script src="https://cdn.staticfile.org/vue/2.5.22/vue.min.js">
// 
  • 然后在將Element-UI 也通過CDN 導(dǎo)入
// 在 生產(chǎn)打包入口文件 main-prod.js中 刪除或注釋掉element-ui按需加載的代碼 import './plugins/element.js'
// 然后在public/index.html 文件中引入element-ui的js文件和css樣式表
<!-- 引入樣式 -->
<link rel="stylesheet" >
<!-- 引入組件庫(kù) -->
<script src="https://unpkg.com/element-ui@2.13.1/lib/index.js"></script>

注意:使用CDN導(dǎo)入資源文件時(shí),應(yīng)盡量固定版本導(dǎo)入另患,以免以后版本更新后出現(xiàn)不兼容

(7) 首頁(yè)內(nèi)容定制

  • 第一步在 vue.config.js文件中增加如下代碼
    2020-05-06_000328.png
 // 在 vue.config.js 文件中
modulu.exports = {
  chainWebpack: config => {
    // 發(fā)布模式 
    // 只有在發(fā)布模式下纽乱,才需要將第三方依賴包配置到 externals 節(jié)點(diǎn)下
    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-prod.js')
      config.set('externals', {
        vue: 'Vue',
        'vue-router': 'VueRouter',
        axios: 'axios',
        // 把使用到的第三方依賴包 添加進(jìn)來,然后進(jìn)行第二步
      })
      // 定義一個(gè)isProd 變量昆箕,當(dāng)它為 true 時(shí)鸦列,index.htm 中就會(huì)添加cdn 引用的資源文件
      config.plugin('html').tap(args => {
        args[0].isProd = true
        return args
      })
    })

    // 開發(fā)模式
    config.when(process.env.NODE_ENV === 'production', config => {
      config.entry('app').clear().add('./src/main-dev.js')
      
      config.plugin('html').tap(args => {
        args[0].isProd = false
        return args
      })
    })
  }
}
  • 第二步在 public/index.html 文件中使用三目運(yùn)算判斷是否需要 加載cdn 資源文件
// 自定制title 
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.isProd ? '' : 'dev - ' %>電商管理系統(tǒng)</title>

    <% if(htmlWebpackPlugin.options.isProd){ %>
    <!-- 引入樣式 -->
    <link rel="stylesheet" >
    <!-- 引入組件庫(kù) -->
    <script src="https://unpkg.com/element-ui@2.13.1/lib/index.js"></script>

    <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
    <script src="https://cdn.staticfile.org/vue-router/3.0.1/vue-router.min.js"></script>
    <% } %>

  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>

(8) 路由懶加載

當(dāng)打包構(gòu)建項(xiàng)目時(shí)租冠,JavaScript包會(huì)變得非常打,影響頁(yè)面加載薯嗤。如果我們能把不同路由對(duì)應(yīng)的組件分割成不同的代碼塊顽爹,然后當(dāng)路由被訪問的時(shí)候才加載對(duì)應(yīng)的組件,這樣就更高效了骆姐。
具體需要3步:

  • 安裝 @babel/plugin-syntax-dynamic-import 包镜粤。


    2020-05-06_011931.png
  • 在 babel.config.js 配置文件中聲明該插件。


    2020-05-06_012313.png
  • 在路由配置文件中將路由改為按需加載的形式玻褪,示例代碼如下:
    const Foo = () => import (/* webpackChunkName: "group-foo" */ './Foo.vue')
    ----------【webpackChunkName: "group-foo" 】給組件分組命名
    具體配置參考:https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

    2020-05-06_011201.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末繁仁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子归园,更是在濱河造成了極大的恐慌黄虱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庸诱,死亡現(xiàn)場(chǎng)離奇詭異捻浦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桥爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門朱灿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钠四,你說我怎么就攤上這事盗扒。” “怎么了缀去?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵侣灶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我缕碎,道長(zhǎng)褥影,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任咏雌,我火速辦了婚禮凡怎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赊抖。我一直安慰自己统倒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布氛雪。 她就那樣靜靜地躺著房匆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坛缕,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天墓猎,我揣著相機(jī)與錄音,去河邊找鬼赚楚。 笑死毙沾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宠页。 我是一名探鬼主播左胞,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼举户!你這毒婦竟也來了烤宙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤俭嘁,失蹤者是張志新(化名)和其女友劉穎躺枕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供填,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拐云,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了近她。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉瘩。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粘捎,靈堂內(nèi)的尸體忽然破棺而出薇缅,到底是詐尸還是另有隱情,我是刑警寧澤攒磨,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布泳桦,位于F島的核電站,受9級(jí)特大地震影響咧纠,放射性物質(zhì)發(fā)生泄漏蓬痒。R本人自食惡果不足惜泻骤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一漆羔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狱掂,春花似錦演痒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春讯嫂,著一層夾襖步出監(jiān)牢的瞬間蹦锋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工欧芽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉掂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓千扔,卻偏偏與公主長(zhǎng)得像憎妙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曲楚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354