欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

性能優(yōu)化篇之Webpack構(gòu)建速度優(yōu)化的建議

 更新時(shí)間:2019年04月03日 10:08:33   作者:keywords  
這篇文章主要介紹了性能優(yōu)化篇之Webpack構(gòu)建速度優(yōu)化的建議,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

如何輸出Webpack構(gòu)建分析

輸出Webpack構(gòu)建信息的.json文件:webpack --profile --json > stats.json

  1. --profile:記錄構(gòu)建中的耗時(shí)信息
  2. --json:以json格式輸出構(gòu)建結(jié)果,最后只輸出一個(gè)json文件(包含所有的構(gòu)建信息)

web可視化查看構(gòu)建分析:得到了webpack構(gòu)建信息文件stats.json,如何進(jìn)行很好的可視化查看?

  1. 方案一:通過可視化分析工具Webpack Analyse,是個(gè)在線Web應(yīng)用,上傳stats.json文件就可以;不過好像需要翻墻;
  2. 方案二:安裝webpack-bundle-analyzer工具npm i -g webpack-bundle-analyzer,生成stats.json后直接在其文件夾目錄執(zhí)行webpack-bundle-analyzer后,瀏覽器會(huì)打開對(duì)應(yīng)網(wǎng)頁并展示構(gòu)建分析webpack-bundle-analyzer stats.json -p 8888文檔地址webpack-bundle-analyzer
  3. webpack-dashboard是一款統(tǒng)計(jì)和優(yōu)化webpack日志的工具,可以以表格形勢(shì)展示日志信息。其中包括構(gòu)建過程和狀態(tài)、日志以及涉及的模塊列表
  4. jarvis是一款基于webapck-dashboard的webpack性能分析插件,性能分析的結(jié)果在瀏覽器顯示,比webpack-bundler-anazlyer更美觀清晰GitHub文檔地址

npm i -D webpack-jarvis

webpack.config.js配置:

const Jarvis = require("webpack-jarvis");

plugins: [
 new Jarvis({
  watchOnly: false,
  port: 3001 // optional: set a port
 })
];

port:監(jiān)聽的端口,默認(rèn)1337,監(jiān)聽面板將監(jiān)聽這個(gè)端口,通常像http://localhost:port/

host:域名,默認(rèn)localhost,不限制域名。

watchOnly:僅僅監(jiān)聽編譯階段。默認(rèn)為true,如果高為false,jarvis不僅僅運(yùn)行在編譯階段,在編譯完成后還保持運(yùn)行狀態(tài)。

界面:看到構(gòu)建時(shí)間為:Time: 11593ms(作為優(yōu)化時(shí)間對(duì)比)

webpack配置優(yōu)化

webpack在啟動(dòng)時(shí)會(huì)從配置的Entry出發(fā),解析出文件中的導(dǎo)入語句,再遞歸解析。

對(duì)于導(dǎo)入語句Webpack會(huì)做出以下操作:

  1. 根據(jù)導(dǎo)入語句尋找對(duì)應(yīng)的要導(dǎo)入的文件;
  2. 在根據(jù)要導(dǎo)入的文件后綴,使用配置中的Loader去處理文件(如使用ES6需要使用babel-loader處理)

針對(duì)這兩點(diǎn)可以優(yōu)化查找途徑

1、優(yōu)化Loader配置

Loader處理文件的轉(zhuǎn)換操作是很耗時(shí)的,所以需要讓盡可能少的文件被Loader處理

{
  test: /\.js$/,
  use: [
    'babel-loader?cacheDirectory',//開啟轉(zhuǎn)換結(jié)果緩存
  ],
  include: path.resolve(__dirname, 'src'),//只對(duì)src目錄中文件采用babel-loader
  exclude: path.resolve(__dirname,' ./node_modules'),//排除node_modules目錄下的文件
},

2、優(yōu)化resolve.modules配置

resolve.modules用于配置webpack去哪些目錄下尋找第三方模塊,默認(rèn)是['node_modules'],但是,它會(huì)先去當(dāng)前目錄的./node_modules查找,沒有的話再去../node_modules最后到根目錄;

所以當(dāng)安裝的第三方模塊都放在項(xiàng)目根目錄時(shí),就沒有必要安默認(rèn)的一層一層的查找,直接指明存放的絕對(duì)位置

resolve: {
    modules: [path.resolve(__dirname, 'node_modules')],
  }

3、優(yōu)化resolve.extensions配置

在導(dǎo)入沒帶文件后綴的路徑時(shí),webpack會(huì)自動(dòng)帶上后綴去嘗試詢問文件是否存在,而resolve.extensions用于配置嘗試后綴列表;默認(rèn)為extensions:['js','json'];

及當(dāng)遇到require('./data')時(shí)webpack會(huì)先嘗試尋找data.js,沒有再去找data.json;如果列表越長,或者正確的后綴越往后,嘗試的次數(shù)就會(huì)越多;

所以在配置時(shí)為提升構(gòu)建優(yōu)化需遵守:

  1. 頻率出現(xiàn)高的文件后綴優(yōu)先放在前面;
  2. 列表盡可能的??;
  3. 書寫導(dǎo)入語句時(shí),盡量寫上后綴名

因?yàn)轫?xiàng)目中用的jsx較多,所以配置extensions: [".jsx",".js"],

基本配置后查看構(gòu)建速度:Time: 10654ms;配置前為Time: 11593ms

使用DllPlugin優(yōu)化

在使用webpack進(jìn)行打包時(shí)候,對(duì)于依賴的第三方庫,如react,react-dom等這些不會(huì)修改的依賴,可以讓它和業(yè)務(wù)代碼分開打包;

只要不升級(jí)依賴庫版本,之后webpack就只需要打包項(xiàng)目業(yè)務(wù)代碼,遇到需要導(dǎo)入的模塊在某個(gè)動(dòng)態(tài)鏈接庫中時(shí),就直接去其中獲取;而不用再去編譯第三方庫,這樣第三方庫就只需要打包一次。

接入需要完成的事:

  1. 將依賴的第三方模塊抽離,打包到一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫中
  2. 當(dāng)需要導(dǎo)入的模塊存在動(dòng)態(tài)鏈接庫中時(shí),讓其直接從鏈接庫中獲取
  3. 項(xiàng)目依賴的所有動(dòng)態(tài)鏈接庫都需要被加載

接入工具(webpack已內(nèi)置)

DllPlugin插件:用于打包出一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫文件;

DllReferencePlugin:用于在主要的配置文件中引入DllPlugin插件打包好的動(dòng)態(tài)鏈接庫文件

配置webpack_dll.config.js構(gòu)建動(dòng)態(tài)鏈接庫

const path = require('path');
const DllPlugin = require('webpack/lib/DllPlugin');

module.exports = {
  mode: 'production',
  entry: {
    // 將React相關(guān)模塊放入一個(gè)動(dòng)態(tài)鏈接庫
    react: ['react','react-dom','react-router-dom','react-loadable'],
    librarys: ['wangeditor'],
    utils: ['axios','js-cookie']
  },
  output: {
    filename: '[name]-dll.js',
    path: path.resolve(__dirname, 'dll'),
    // 存放動(dòng)態(tài)鏈接庫的全局變量名,加上_dll_防止全局變量沖突
    library: '_dll_[name]'
  },
  // 動(dòng)態(tài)鏈接庫的全局變量名稱,需要可output.library中保持一致,也是輸出的manifest.json文件中name的字段值
  // 如react.manifest.json字段中存在"name":"_dll_react"
  plugins: [
    new DllPlugin({
      name: '_dll_[name]',
      path: path.join(__dirname, 'dll', '[name].manifest.json')
    })
  ]
}

webpack.pro.config.js中使用

const DllReferencePlugin = require('webpack/lib/DllReferencePlugin');
...
plugins: [
  // 告訴webpack使用了哪些動(dòng)態(tài)鏈接庫
    new DllReferencePlugin({
      manifest: require('./dll/react.manifest.json')
    }),
    new DllReferencePlugin({
      manifest: require('./dll/librarys.manifest.json')
    }),
    new DllReferencePlugin({
      manifest: require('./dll/utils.manifest.json')
    }),
]

注意:在webpack_dll.config.js文件中,DllPlugin中的name參數(shù)必須和output.library中的一致;因?yàn)?code>DllPlugin的name參數(shù)影響輸出的manifest.json的name;而webpack.pro.config.js中的DllReferencePlugin會(huì)讀取manifest.json的name,將值作為從全局變量中獲取動(dòng)態(tài)鏈接庫內(nèi)容時(shí)的全局變量名

執(zhí)行構(gòu)建

webpack --progress --colors --config ./webpack.dll.config.js

webpack --progress --colors --config ./webpack.prod.js

html中引入dll.js文件

構(gòu)建時(shí)間對(duì)比:["11593ms","10654ms","8334ms"]

HappyPack并行構(gòu)建優(yōu)化

核心原理:將webpack中最耗時(shí)的loader文件轉(zhuǎn)換操作任務(wù),分解到多個(gè)進(jìn)程中并行處理,從而減少構(gòu)建時(shí)間。

HappyPack

接入HappyPack

安裝:npm i -D happypack

重新配置rules部分,將loader交給happypack來分配:

const HappyPack = require('happypack');
const happyThreadPool = HappyPack.ThreadPool({size: 5}); //構(gòu)建共享進(jìn)程池,包含5個(gè)進(jìn)程
...
plugins: [
  // happypack并行處理
  new HappyPack({
    // 用唯一ID來代表當(dāng)前HappyPack是用來處理一類特定文件的,與rules中的use對(duì)應(yīng)
    id: 'babel',
    loaders: ['babel-loader?cacheDirectory'],//默認(rèn)設(shè)置loader處理
    threadPool: happyThreadPool,//使用共享池處理
  }),
  new HappyPack({
    // 用唯一ID來代表當(dāng)前HappyPack是用來處理一類特定文件的,與rules中的use對(duì)應(yīng)
    id: 'css',
    loaders: [
      'css-loader',
      'postcss-loader',
      'sass-loader'],
      threadPool: happyThreadPool
  })
],
module: {
  rules: [
  {
    test: /\.(js|jsx)$/,
    use: ['happypack/loader?id=babel'],
    exclude: path.resolve(__dirname,' ./node_modules'),
  },
  {
    test: /\.(scss|css)$/,
    //使用的mini-css-extract-plugin提取css此處,如果放在上面會(huì)出錯(cuò)
    use: [MiniCssExtractPlugin.loader,'happypack/loader?id=css'],
    include:[
      path.resolve(__dirname,'src'),
      path.join(__dirname, './node_modules/antd')
    ]
  },
}

參數(shù):

threads:代表開啟幾個(gè)子進(jìn)程去處理這一類文件,默認(rèn)是3個(gè);

verbose:是否運(yùn)行HappyPack輸出日志,默認(rèn)true;

threadPool:代表共享進(jìn)程池,即多個(gè)HappyPack示例使用一個(gè)共享進(jìn)程池中的子進(jìn)程去處理任務(wù),以防資源占有過多

代碼壓縮用ParallelUglifyPlugin代替自帶的 UglifyJsPlugin插件

自帶的JS壓縮插件是單線程執(zhí)行的,而webpack-parallel-uglify-plugin可以并行的執(zhí)行

配置參數(shù):

  • uglifyJS: {}:用于壓縮 ES5 代碼時(shí)的配置,Object 類型
  • test: /.js$/g:使用正則去匹配哪些文件需要被 ParallelUglifyPlugin 壓縮,默認(rèn)是 /.js$/
  • include: []:使用正則去包含被壓縮的文件,默認(rèn)為 [].
  • exclude: []: 使用正則去包含不被壓縮的文件,默認(rèn)為 []
  • cacheDir: '':緩存壓縮后的結(jié)果,下次遇到一樣的輸入時(shí)直接從緩存中獲取壓縮后的結(jié)果并返回,默認(rèn)不會(huì)緩存,開啟緩存設(shè)置一個(gè)目錄路徑
  • workerCount: '':開啟幾個(gè)子進(jìn)程去并發(fā)的執(zhí)行壓縮。默認(rèn)是當(dāng)前運(yùn)行電腦的 CPU 核數(shù)減去1
  • sourceMap: false:是否為壓縮后的代碼生成對(duì)應(yīng)的Source Map, 默認(rèn)不生成
...
minimizer: [
  // webpack:production模式默認(rèn)有配有js壓縮,但是如果這里設(shè)置了css壓縮,js壓縮也要重新設(shè)置,因?yàn)槭褂胢inimizer會(huì)自動(dòng)取消webpack的默認(rèn)配置
  new optimizeCssPlugin({
    assetNameRegExp: /\.css$/g,
    cssProcessor: require('cssnano'),
    cssProcessorOptions: { discardComments: { removeAll: true } },
    canPrint: true
  }),
  new ParallelUglifyPlugin({
    cacheDir: '.cache/',
    uglifyJS:{
      output: {
      // 是否輸出可讀性較強(qiáng)的代碼,即會(huì)保留空格和制表符,默認(rèn)為輸出,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
        beautify: false,
    //是否保留代碼中的注釋,默認(rèn)為保留,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
        comments: false
      },
      compress: {
      //是否在UglifyJS刪除沒有用到的代碼時(shí)輸出警告信息,默認(rèn)為輸出
        warnings: false,
      //是否刪除代碼中所有的console語句,默認(rèn)為不刪除,開啟后,會(huì)刪除所有的console語句
        drop_console: true,
      //是否內(nèi)嵌雖然已經(jīng)定義了,但是只用到一次的變量,比如將 var x = 1; y = x, 轉(zhuǎn)換成 y = 1, 默認(rèn)為否
        collapse_vars: true,
      }
    }
}),
]

構(gòu)建結(jié)果對(duì)比:["11593ms","10654ms","8334ms","7734ms"]

整體構(gòu)建速度從12000ms降到現(xiàn)在的8000ms

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS獲取浮動(dòng)(float)元素的style.left值為空的快速解決辦法

    JS獲取浮動(dòng)(float)元素的style.left值為空的快速解決辦法

    這篇文章主要介紹了JS獲取浮動(dòng)(float)元素的style.left值為空的快速解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • js+html5實(shí)現(xiàn)canvas繪制橢圓形圖案的方法

    js+html5實(shí)現(xiàn)canvas繪制橢圓形圖案的方法

    這篇文章主要介紹了js+html5實(shí)現(xiàn)canvas繪制橢圓形圖案的方法,涉及html5圖形繪制的基礎(chǔ)技巧,感興趣的朋友可以參考一下
    2016-05-05
  • axios基本入門用法教程

    axios基本入門用法教程

    之前當(dāng)vue更新到2.0之后,作者就宣告不再對(duì)vue-resource更新,而是推薦的axios,前一段時(shí)間用了一下,現(xiàn)在說一下它的基本用法。文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • js 幻燈片的實(shí)現(xiàn)

    js 幻燈片的實(shí)現(xiàn)

    今天在群里看到有人要幻燈片的代碼,于是我自己也想了想,做個(gè)總結(jié)。常見的幻燈片切換無非就是輪播和漸變,不管哪種都是用定時(shí)器來逐步改變圖片或者圖片組的某種屬性來實(shí)現(xiàn)的
    2011-12-12
  • javascript模擬枚舉的簡(jiǎn)單實(shí)例

    javascript模擬枚舉的簡(jiǎn)單實(shí)例

    本篇文章主要是對(duì)javascript模擬枚舉的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-03-03
  • easyUI實(shí)現(xiàn)(alert)提示框自動(dòng)關(guān)閉的實(shí)例代碼

    easyUI實(shí)現(xiàn)(alert)提示框自動(dòng)關(guān)閉的實(shí)例代碼

    下面小編就為大家?guī)硪黄猠asyUI實(shí)現(xiàn)(alert)提示框自動(dòng)關(guān)閉的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • JavaScript閉包原理與使用介紹

    JavaScript閉包原理與使用介紹

    閉包是js的一個(gè)難點(diǎn)也是它的一個(gè)特色,是我們必須掌握的js高級(jí)特性,下面這篇文章主要給大家介紹了關(guān)于JavaScript閉包函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 完美實(shí)現(xiàn)js焦點(diǎn)輪播效果(一)

    完美實(shí)現(xiàn)js焦點(diǎn)輪播效果(一)

    這篇文章主要為大家詳細(xì)介紹了完美實(shí)現(xiàn)js焦點(diǎn)輪播效果的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Js控制彈窗實(shí)現(xiàn)在任意分辨率下居中顯示

    Js控制彈窗實(shí)現(xiàn)在任意分辨率下居中顯示

    彈窗居中比較煩人的是怎么才能在任意分辨率下實(shí)現(xiàn)居中顯示,為了解決此問題,本文測(cè)試了一下案例在此與大家分享,有類似需求的朋友可以學(xué)習(xí)下
    2013-08-08
  • javascript代碼優(yōu)化的8點(diǎn)總結(jié)

    javascript代碼優(yōu)化的8點(diǎn)總結(jié)

    本篇文章給大家分享了關(guān)于javascript代碼優(yōu)化的8點(diǎn)總結(jié),希望我們整理的內(nèi)容能夠幫助到大家。
    2018-01-01

最新評(píng)論