最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue webpack打包優(yōu)化操作技巧

 更新時(shí)間:2018年02月22日 08:33:15   作者:J海迪  
webpack是react項(xiàng)目標(biāo)配的打包工具,和NPM搭配起來使用管理模塊實(shí)在非常方便。這篇文章主要介紹了webpack打包優(yōu)化(VUE Project),需要的朋友可以參考下

臨近春節(jié),公司很多同事都提前回家過年,剩余人員根據(jù)禪道去修改bug,當(dāng)bug修正完畢以后,我們需要重新打包給運(yùn)維,上測試服給測試同事提測,但是由于項(xiàng)目本體比較龐大,所以打包時(shí)間太過漫長(二十五分鐘以上:sob:),所以有了打包優(yōu)化的想法(其實(shí)想法早就有了,但是因?yàn)槠綍r(shí)工作計(jì)劃比較充實(shí),所以一直沒有去完成這個(gè)工作),這次正好有時(shí)間,所以去重新考慮了這個(gè)問題!

webpack是react項(xiàng)目標(biāo)配的打包工具,和NPM搭配起來使用管理模塊實(shí)在非常方便。

  webapck 把所有的靜態(tài)資源都看做是一個(gè) module,通過 webpack,將這些 module 組成到一個(gè) bundle 中去,從而實(shí)現(xiàn)在頁面上引入一個(gè) bundle.js,來實(shí)現(xiàn)所有靜態(tài)資源的加載。

話不多說,直接開始正文吧

先給大家看一下項(xiàng)目的目錄結(jié)構(gòu):

 

就是正常的項(xiàng)目結(jié)構(gòu),簡單說一下吧:

  • build文件夾包含的是一些打包配置的一下東西
  • config文件夾是項(xiàng)目的基礎(chǔ)配置
  • dist是打包之后的文件
  • node_modules是項(xiàng)目的依賴包
  • src文件夾里面是項(xiàng)目的源碼
  • static文件夾里面放的是一些項(xiàng)目使用的靜態(tài)資源
  • index.html是項(xiàng)目的首頁
  • package.json文件是項(xiàng)目的配置json
  • yarn.lock是使用yarn鎖定項(xiàng)目用的依賴

優(yōu)化思路

項(xiàng)目打包時(shí)間長,原因無外乎就是項(xiàng)目整體比較龐大、依賴復(fù)雜、組件之前拆分不夠合理。

對于這三個(gè)問題呢,我們可以針對下面這幾個(gè)方面去做一下處理:

  • 對項(xiàng)目進(jìn)行路由屏蔽,只打包自己需要打包的部分(我司就是好幾個(gè)項(xiàng)目合并在了一起,至于原因則是 需求類似,所以放在一起比較省事 -_-||| 開發(fā)過程中是省了不少事,但是現(xiàn)在一樣要還的?。。。。?br />
  • 依賴關(guān)系復(fù)雜,這里說的是項(xiàng)目中的依賴模塊比較多,像我們現(xiàn)在這個(gè)項(xiàng)目,光算依賴包的話就有40+,另外一個(gè)重要原因就是組件之間存在相同引用的依賴。解決思路是把項(xiàng)目中重用的依賴抽離出來進(jìn)行單獨(dú)打包。
  • 組件在寫的過程中,需要考慮好這個(gè)組件的使用方向,以及實(shí)現(xiàn)功能,不能混為一談。

實(shí)際操作

有了整體的思路,那么開搞就可以啦 去webpack文檔去看了一下有一個(gè)DllPlugin,這個(gè)插件就是幫助我們解決問題的關(guān)鍵,下面是我webpack.dll.config的代碼:

var path = require("path");
var webpack = require("webpack");
function resolve (dir) {
 return path.join(__dirname, '..', dir)
}
module.exports = {
 // 你想要打包的模塊的數(shù)組
 entry: {
 vendor: ['vue', 'lodash', 'vuex', 'axios', 'vue-router', 'iview', 'element-ui',
  'echarts','xlsx','jquery','vue-fullcalendar','vue-cookie','handsontable']
 },
 output: {
 path: path.join(__dirname, '../dist/vendor-dll-js'), // 打包后文件輸出的位置
 filename: '[name].dll.js',
 library: '[name]_library'
 // vendor.dll.js中暴露出的全局變量名。
 // 主要是給DllPlugin中的name使用,
 // 故這里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致。
 },
 resolve: {
 extensions: ['.js', '.vue', '.json'],
 alias: {
  'vue$': 'vue/dist/vue.esm.js',
  '@': resolve('src'),
 }
 },
 plugins: [
 new webpack.DllPlugin({
  path: path.join(__dirname, '.', '[name]-manifest.json'),
  name: '[name]_library',
  context: __dirname
 }),
 // 壓縮打包的文件,與該文章主線無關(guān)
 new webpack.optimize.UglifyJsPlugin({
  compress: {
  warnings: false
  }
 })
 ]
};

我們需要將項(xiàng)目中具有重用性的包抽離出來,放在vendor數(shù)組里面,然后在下面output里面定義一下打包輸出的文件路徑,然后在resolve里面配置解析參數(shù),最后定義使用的DllPlugin插件,UglifyJsPlugin是壓縮js的插件

Dllplugin里的path,會(huì)輸出一個(gè)vendor-manifest.json,這是用來做關(guān)聯(lián)id的,打包的時(shí)候不會(huì)打包進(jìn)去,所以不用放到static里 然后運(yùn)行一下 webpack -p --progress --config build/webpack.dll.conf.js

成功以后,static下會(huì)有dll.vendor.js,根目錄下會(huì)有vendor.manifest.json 各自打開看一下,就會(huì)看到依賴庫的源碼和匹配id

ok,到這里,抽離依賴庫的事情就完成了,那么接下來問題就是怎么引用呢,怎么在dev和build跑呢?

這里補(bǔ)了一點(diǎn)dll和commonsChunk概念上的區(qū)別,commonsChunk之所以慢和大,是因?yàn)槊看蝦un的時(shí)候,都會(huì)去做一次打包,而實(shí)際上我們不會(huì)一直去更新我們引用的依賴庫,所以dll的做法就等于是,事先先打包好依賴庫,然后只對每次都修改的js做打包。

繼續(xù)上面的步驟,我們需要根據(jù)生成的json文件去修改webpack.base.config文件:

const manifest = require('../vendor-manifest.json')
......
plugins: [
 new webpack.DllReferencePlugin({
  manifest
 })
 ]

然后打開index.html,在底部加上 <script src="./static/dll.vendor.js"></script> ;

執(zhí)行一下 npm run build ,一起正常的話,表示你的操作是正確的。

升級處理

至此優(yōu)化的問題基本已經(jīng)解決了,但是在處理過程中需要進(jìn)行復(fù)制粘貼,還要對index.html文件進(jìn)行操作,如果是對于項(xiàng)目不熟悉的人來進(jìn)行開發(fā)項(xiàng)目的話,就會(huì)出現(xiàn)一些小的問題,所以我決定繼續(xù)往下研究一下:

思路還是上面的思路,我們下面需要進(jìn)行的操作呢就是對與之前的處理進(jìn)行優(yōu)化,通過配置文件,和命令去實(shí)現(xiàn)我們想要的效果

首先我們將上面 webpack.dll.config 文件里面的entry配置項(xiàng)拿出來,在config文件夾下新建一個(gè)dll.js

module.exports = {
 entry: {
 // 這里的依賴順序必須是:對象從上往下依賴,數(shù)組從右到左依賴(如果互不依賴的可以忽略順序)
 ui: ['iview', 'element-ui'],
 tool: ['lodash', 'jquery', 'axios', 'vue-fullcalendar'],
 vue: ['vue', 'vuex', 'vue-router', 'vue-cookie'],
 xlsx: ['xlsx'],
 echarts: ['echarts'],
 other: ['handsontable'],
 },
 outFile: '../static/dll'
};

這里面其實(shí)就是我們一開始寫的entry的配置項(xiàng),根據(jù)這個(gè)js去打包的文件有一個(gè)順序,就是我總結(jié)的這個(gè):

這里的依賴順序必須是:對象從上往下依賴,數(shù)組從右到左依賴(如果互不依賴的可以忽略順序)

如果不按照這個(gè)順序去寫的話,會(huì)出現(xiàn)依賴錯(cuò)誤的問題?。?!

然后在output里面再進(jìn)行一下配置:

output: {
 path: path.join(__dirname, dllConfig.outFile), // 打包后文件輸出的位置
 filename: '[name].dll.[chunkhash].js',
 library: '[name]_library'
 // 主要是給DllPlugin中的name使用,
 // 故這里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致。
 },

這樣在執(zhí)行 webpack -p --progress --config build/webpack.dll.conf.js 指令的時(shí)候會(huì)生成如下:

 

是不是看到文件后面的hash就一臉懵逼,這怎么辦,我們沒有辦法去進(jìn)行復(fù)制粘貼了?。。ㄎ覀兊哪康牟痪褪遣贿M(jìn)行復(fù)制粘貼嗎 正經(jīng)臉-_-)

要實(shí)現(xiàn)命令操作之后不進(jìn)行復(fù)制粘貼操作就需要使用webpack的HtmlWebpackPlugin插件

在plugins里面配置一下HtmlWebpackPlugin

new HtmlWebpackPlugin({
 filename: path.join(__dirname, '../', config.dev.index),
 template: 'index.ejs',
 inject: false
}),

然后在根目錄添加一個(gè)index.ejs模版(ejsGitHub地址 ), index.ejs中代碼如下:

<body>
 <div id="app"></div>
 <!-- dll files will be auto injected -->
 <% for (var chunk in htmlWebpackPlugin.files.chunks) { %><script type="text/javascript" src="/<%= htmlWebpackPlugin.files.chunks[chunk].entry %>"></script>
 <% } %>
 <!-- built files will be auto injected -->
</body>

最后需要在config文件夾下的index.js進(jìn)行一下修改: 在dev中添加: index: 'index.html',

項(xiàng)目在執(zhí)行dev指令或者build指令之前需要先執(zhí)行: webpack -p --progress --config build/webpack.dll.conf.js 在dll指令結(jié)束后 執(zhí)行其他操作就可以完美的玩耍了:blush:

總結(jié)

至此代碼打包優(yōu)化的整個(gè)過程就基本結(jié)束了,測試一下,15分鐘左右就可以完成打包,比之前打包快了將近10分鐘,可以說是非常成功的一次嘗試??!

相關(guān)文章

  • uniapp自定義導(dǎo)航欄新手保姆級教程

    uniapp自定義導(dǎo)航欄新手保姆級教程

    uniapp的頂部導(dǎo)航欄有時(shí)候不符合設(shè)計(jì)需求,我們可以自定義頂部導(dǎo)航欄,下面這篇文章主要給大家介紹了關(guān)于uniapp自定義導(dǎo)航欄的保姆級教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 關(guān)于vue項(xiàng)目中搜索節(jié)流的實(shí)現(xiàn)代碼

    關(guān)于vue項(xiàng)目中搜索節(jié)流的實(shí)現(xiàn)代碼

    這篇文章主要介紹了關(guān)于vue項(xiàng)目中搜索節(jié)流的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vue導(dǎo)出excel表格并支持樣式及行高修改

    vue導(dǎo)出excel表格并支持樣式及行高修改

    這篇文章主要為大家介紹了vue導(dǎo)出excel表格并支持樣式及行高修改,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • el-select與el-tree結(jié)合使用實(shí)現(xiàn)樹形結(jié)構(gòu)多選框

    el-select與el-tree結(jié)合使用實(shí)現(xiàn)樹形結(jié)構(gòu)多選框

    我們在實(shí)際開發(fā)中需要用到下拉樹,elementUI是沒有這個(gè)組件的,我們就要自己去寫了,下面這篇文章主要給大家介紹了關(guān)于el-select與el-tree結(jié)合使用實(shí)現(xiàn)樹形結(jié)構(gòu)多選框的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • vue2之vue.config.js最全配置教程

    vue2之vue.config.js最全配置教程

    本文主要介紹了vue2之vue.config.js最全配置教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Vue中的自定義渲染器和異步渲染

    詳解Vue中的自定義渲染器和異步渲染

    這篇文章主要為大家詳細(xì)介紹了Vue中的自定義渲染器和異步渲染的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Vue導(dǎo)出excel的兩個(gè)常用方式介紹與對比

    Vue導(dǎo)出excel的兩個(gè)常用方式介紹與對比

    這篇文章主要為大家詳細(xì)介紹了Vue導(dǎo)出excel的兩個(gè)常用方式,分別為前端vue+XLSX導(dǎo)出excel和vue+后端POI?導(dǎo)出excel,感興趣的小伙伴可以了解下
    2025-01-01
  • vue中簡單彈框dialog的實(shí)現(xiàn)方法

    vue中簡單彈框dialog的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇vue中簡單彈框dialog的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • vue-cli3自動(dòng)消除console.log()的調(diào)試信息方式

    vue-cli3自動(dòng)消除console.log()的調(diào)試信息方式

    這篇文章主要介紹了vue-cli3自動(dòng)消除console.log()的調(diào)試信息方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • vue3中h函數(shù)的常用使用方式匯總

    vue3中h函數(shù)的常用使用方式匯總

    其實(shí)h()函數(shù)和createVNode()函數(shù)都是創(chuàng)建dom節(jié)點(diǎn),他們的作用是一樣的,下面這篇文章主要給大家介紹了關(guān)于vue3中h函數(shù)的常用使用方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評論

新郑市| 藁城市| 大余县| 谷城县| 阿荣旗| 屏山县| 乌兰察布市| 蒙阴县| 康保县| 连江县| 汪清县| 华蓥市| 玉龙| 澄江县| 丽水市| 绿春县| 博野县| 长春市| 德安县| 镇坪县| 沈阳市| 溧水县| 保靖县| 平罗县| 凌源市| 固镇县| 内江市| 梓潼县| 安岳县| 昌都县| 洛扎县| 独山县| 稻城县| 衡山县| 济南市| 南丹县| 南宁市| 沁阳市| 龙岩市| 麻城市| 青田县|