Vue項目優(yōu)化

刪除生產(chǎn)環(huán)境下的console.log
npm install babel-plugin-transform-remove-console --save-dev

babel.config.js

// 生產(chǎn)環(huán)境下的插件
const prodPlugins = []
if (process.env.NODE_ENV === 'production') {
  prodPlugins.push('transform-remove-console')
}
module.exports = {
  presets: ['@vue/cli-plugin-babel/preset'],
  plugins: [...prodPlugins]
}

通過if條件判斷,只有在production階段插件才會生效

生成打包報告

通過命令行方式

// --report 選項可以生成 report.html 
vue-cli-service build --report

通過可視化UI面板

運行vue ui->任務(wù)->build完成->分析

配置不同打包入口

默認(rèn)情況下,Vue項目的開發(fā)模式和發(fā)布模式共用同一個打包入口文件,即為src/main.js戏自。為了將項目的開發(fā)過程和發(fā)布過程分離,可以指定兩種打包入口

開發(fā)模式為src/main-dev.js

發(fā)布模式為src/main-prod.js

兩中修改webpack配置的方式configureWebpackchainWebpack,兩者功能相同,只是使用方式不同豌注,

  • chainWebpack通過鏈?zhǔn)骄幊?/code>形式來修改webpack配置
  • configWebpack通過操作對象的形式來修改webpack配置

vue.config.js

module.exports = {
  chainWebpack: config => {
    // 發(fā)布模式
    config.when(process.env.NODE_ENV === 'production', config => {
      // .entry('app') 獲取默認(rèn)入口,.clear()清除默認(rèn)入口灯萍,.add()添加新入口
      config
        .entry('app')
        .clear()
        .add('./src/main-prod.js')

    })

    // 開發(fā)模式
    config.when(process.env.NODE_ENV === 'development', config => {
      config
        .entry('app')
        .clear()
        .add('./src/main-dev.js')
    })
  }
}
通過externals加載外部資源

默認(rèn)情況下轧铁,import導(dǎo)入的第三方依賴會被打包進(jìn)同一個文件,造成文件體積過大進(jìn)而影響加載速度旦棉。通過配置 externals 結(jié)點將需要全局導(dǎo)入的第三方依賴排除在打包文件外齿风,可以有效減少打包體積

config.set('externals', {
  vue: 'Vue',
  'vue-router': 'VueRouter',
  axios: 'axios',
  lodash: '_',
  echarts: 'echarts',
  nprogress: 'NProgress',
  'vue-quill-editor': 'VueQuillEditor'
})

聲明方式為依賴包名: 注冊名稱。其中注冊名稱必須和引入CDN資源之后的掛載在window上的對象名字一致绑洛,可以使用console.log(window)打印這個對象的名稱救斑。如果注冊名稱所指定的對象在window上找不到,將導(dǎo)致白屏真屯。此外脸候,如果引入的CDN資源在window上的掛載的對象名類似xx-xx-xx(不符合js對象命名規(guī)范),這種資源不能通過CDN導(dǎo)入绑蔫,只能用Import方式纪他。

vue.config.js

module.exports = {
  chainWebpack: config => {
      // externals 結(jié)點的作用是將某些包排除在打包文件之外,在真正使用時從window全局獲取晾匠。前面是包的名字茶袒,后面是從 window 中查找該對象時的別名
      config.set('externals', {
        vue: 'Vue',
        'vue-router': 'VueRouter',
        axios: 'axios',
        lodash: '_',
        echarts: 'echarts',
        nprogress: 'Nprogress',
        'vue-quill-editor': 'VueQuillEditor',
        vuex: 'Vuex'
      })
      config.plugin('html').tap(args => {
        args[0].isProd = true
        return args
      })
    })

    // 開發(fā)模式
    config.when(process.env.NODE_ENV === 'development', config => {
      config.plugin('html').tap(args => {
        args[0].isProd = false
        return args
      })
    })
  }
}

config.plugin('html')使用html插件向模板中傳遞參數(shù)

css

<!-- css -->
<% if(htmlWebpackPlugin.options.isProd){ %>
<link rel="stylesheet"  />
<link rel="stylesheet"  />
<link rel="stylesheet"  />
<link rel="stylesheet"  />
<link rel="stylesheet"  />
<% } %>

js

<!-- js  -->
<% if(htmlWebpackPlugin.options.isProd){ %>
<script src="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.2.0/dist/vue-router.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuex@3.4.0/dist/vuex.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/quill@1.3.7/dist/quill.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.6/dist/vue-quill-editor.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.20.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts@4.9.0/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.min.js"></script>
<% } %>

如果isProd為true,CDN資源才會被導(dǎo)入

路由懶加載

只有在訪問到該路由時對應(yīng)的資源文件才會被加載凉馆,建議不要將每個路由單獨打包薪寓,而是通過webpackChunkName為多個路由指定同一個打包文件,這樣可以減少請求的次數(shù)

router/index.js

const routes = [
  {
    path: '/home',
    name: 'Home',
    component: () => import(/* webpackChunkName: 'Login-Home-Dashboard' */ '@/components/Home'),
    redirect: '/dashboard',
    children: [
      {
        path: '/dashboard',
        name: 'Dashboard',
        component: () => import(/* webpackChunkName: 'Login-Home-Dashboard' */ '@/components/Dashboard')
      },
    ]
  }
]

完整配置

vue.config.js

module.exports = {
  chainWebpack: config => {
    // 發(fā)布模式
    config.when(process.env.NODE_ENV === 'production', config => {
      // .entry('app') 獲取默認(rèn)入口澜共,.clear()清除默認(rèn)入口向叉,.add()添加新入口
      config
        .entry('app')
        .clear()
        .add('./src/main-prod.js')

      // externals 結(jié)點的作用是將某些包排除在打包文件之外,在真正使用時從window全局獲取嗦董。前面是包的名字母谎,后面是從 window 中查找該對象時的別名
      config.set('externals', {
        vue: 'Vue',
        'vue-router': 'VueRouter',
        axios: 'axios',
        lodash: '_',
        echarts: 'echarts',
        nprogress: 'Nprogress',
        'vue-quill-editor': 'VueQuillEditor',
        vuex: 'Vuex'
      })

      config.plugin('html').tap(args => {
        args[0].isProd = true
        return args
      })
    })

    // 開發(fā)模式
    config.when(process.env.NODE_ENV === 'development', config => {
      config
        .entry('app')
        .clear()
        .add('./src/main-dev.js')

      config.plugin('html').tap(args => {
        args[0].isProd = false
        return args
      })
    })
  }
}

main-prod.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import '@/assets/scss/style.scss'
// import './plugins/element.js'
import axios from 'axios'
import NProgress from 'nprogress'
// import 'nprogress/nprogress.css'

// 富文本樣式
// import 'quill/dist/quill.core.css'
// import 'quill/dist/quill.snow.css'
// import 'quill/dist/quill.bubble.css'
import VueQuillEditor from 'vue-quill-editor'
// 導(dǎo)入表格樹
import TreeTable from 'vue-table-with-tree-grid'

axios.defaults.baseURL = 'https://www.liulongbin.top:8888/api/private/v1/'
axios.interceptors.request.use(config => {
  NProgress.start()
  config.headers.Authorization = window.sessionStorage.getItem('token')
  return config
})
axios.interceptors.response.use(config => {
  NProgress.done()
  return config
})
Vue.prototype.$http = axios

Vue.config.productionTip = false
Vue.use(VueQuillEditor)

// 全局注冊表格樹
Vue.component('tree-table', TreeTable)

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

引入CDN后,將導(dǎo)入樣式的語句注釋或者刪除京革,只保留導(dǎo)入JS的語句奇唤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匹摇,隨后出現(xiàn)的幾起案子咬扇,更是在濱河造成了極大的恐慌,老刑警劉巖廊勃,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懈贺,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機梭灿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門画侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堡妒,你說我怎么就攤上這事配乱。” “怎么了涕蚤?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵宪卿,是天一觀的道長的诵。 經(jīng)常有香客問我万栅,道長,這世上最難降的妖魔是什么西疤? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任烦粒,我火速辦了婚禮,結(jié)果婚禮上代赁,老公的妹妹穿的比我還像新娘扰她。我一直安慰自己,他們只是感情好芭碍,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布徒役。 她就那樣靜靜地躺著,像睡著了一般窖壕。 火紅的嫁衣襯著肌膚如雪忧勿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天瞻讽,我揣著相機與錄音鸳吸,去河邊找鬼。 笑死速勇,一個胖子當(dāng)著我的面吹牛晌砾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烦磁,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼养匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了都伪?” 一聲冷哼從身側(cè)響起乖寒,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院溺,沒想到半個月后楣嘁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年逐虚,在試婚紗的時候發(fā)現(xiàn)自己被綠了聋溜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡叭爱,死狀恐怖撮躁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情买雾,我是刑警寧澤把曼,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站漓穿,受9級特大地震影響嗤军,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晃危,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一叙赚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧僚饭,春花似錦震叮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偿乖,卻和暖如春击罪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汹想。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工外邓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人古掏。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓损话,卻偏偏與公主長得像,于是被迫代替她去往敵國和親槽唾。 傳聞我的和親對象是個殘疾皇子丧枪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355