成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺探webpack優(yōu)化

Achilles / 2624人閱讀

摘要:是對(duì)的轉(zhuǎn)譯結(jié)果進(jìn)行緩存,之后的進(jìn)行構(gòu)建時(shí),都會(huì)去嘗試讀取緩存來避免高耗能的重新轉(zhuǎn)譯過程,可以指定一個(gè)緩存目錄或者指定為,為時(shí)將使用默認(rèn)的緩存目錄。這篇文章如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤剑瑲g迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏

由于前端的快速發(fā)展,相關(guān)工具的發(fā)展速度也是相當(dāng)迅猛,各大框架例如vue,react都有自己優(yōu)秀的腳手架工具來幫助我們快速啟動(dòng)一個(gè)新項(xiàng)目,也正式因?yàn)檫@個(gè)原因,我們對(duì)于腳手架中最關(guān)鍵的一環(huán)webpack相關(guān)的優(yōu)化知之甚少,腳手架基本上已經(jīng)為我們做好了相關(guān)的開發(fā)準(zhǔn)備,但是當(dāng)我們想要做一些定制化的優(yōu)化操作時(shí),對(duì)webpack的優(yōu)化也需要有一定的了解,否則無從下手,接下來就讓我們進(jìn)入webpack的優(yōu)化世界

構(gòu)建速度提升 loader提升

loader是webpack中最重要的特性,由于webpack自身只支持JavaScript,因此需要一系列的loader來處理那些非JavaScript模塊,因此在我們用webpack建項(xiàng)目的時(shí)候一定會(huì)使用一系列的loader,例如:vue-loader、sass-loader、babel-loader等等,就以babel-loader為例,來看具體配置:

module: {
    rules: [{
      test: /.js$/,
      exclude: /node_modules/,
      loader: "babel-loader?cacheDirectory=true",
      options: {
        presets: ["@babel/preset-env"],
        plugins: ["@babel/transform-runtime"]
      }
    }]
  }

對(duì)于loader來說最常用的就是exclude屬性,用來避免不必要的轉(zhuǎn)譯,上面通過exclude來避免對(duì)node_modules中js中進(jìn)行轉(zhuǎn)譯來提升構(gòu)建速度,但是這樣帶來的提升效果有限。

cacheDirectory是對(duì)babel-loader的轉(zhuǎn)譯結(jié)果進(jìn)行緩存,之后的webpack進(jìn)行構(gòu)建時(shí),都會(huì)去嘗試讀取緩存來避免高耗能的babel重新轉(zhuǎn)譯過程,cacheDirectory可以指定一個(gè)緩存目錄或者指定為true,為true時(shí)將使用默認(rèn)的緩存目錄node_modules/.cache/babel-loader。

babel對(duì)一些公共方法使用了非常小的輔助代碼,默認(rèn)會(huì)注入到每一個(gè)需要的文件,這樣就造成重復(fù)引入,這時(shí)候就需要像上面那樣引入transform-runtime來告訴babel引入runtime來代替注入

第三方庫(kù)優(yōu)化 externals

externals提高構(gòu)建速度的方法就是在構(gòu)建時(shí)不會(huì)將指定的依賴包打包到bundle中,而是在運(yùn)行時(shí)再?gòu)耐獠揩@取依賴,具體是怎么用的呢?來看個(gè)例子:

externals : {
  vue : "Vue",
  vueRouter : "VueRouter",
  vueResource : "VueResource",
  vuex : "Vuex"
},

上面的例子的將vue全家桶都配置在externals中,然后將壓縮包合成一個(gè)js文件放在cdn上面,這樣就不會(huì)在構(gòu)建時(shí)將文件打包到bundle中,提升打包速度,同時(shí)cdn又可以做緩存,提高訪問速度,美滋滋

DllPlugin

DllPlugin是用來干什么的呢?DllPlugin會(huì)將第三方包到一個(gè)多帶帶文件,并且生成一個(gè)映射的json文件,打包的生成的文件就是一個(gè)依賴庫(kù),這個(gè)依賴不會(huì)隨著你的業(yè)務(wù)代碼改變而被重新打包,只有當(dāng)它自身依賴的包發(fā)生變化時(shí)才會(huì)需要重新打包依賴庫(kù),接下來來看具體配置吧:

module.exports = {
  entry: {
    vendor: ["vue", "vue-router", "vue-resource", "vuex"]
  },
  output: {
    path: path.join(__dirname, "dist"),
    filename: "[name].js",
    library: "[name]_hash",
  },
  plugins: [
    new webpack.DllPlugin({
      name: "[name]_[hash]",
      path: path.join(__dirname, "dist", "[name]-manifest.json"),
      context: __dirname
    })
  ]
}

首先我們需要一個(gè)如上面例子那樣的dll配置文件,然后編譯這個(gè)配置文件,生成一個(gè)vendor.js和一個(gè)映射文件vendor-manifest.json,然后再在我們的webpack配置文件中對(duì)進(jìn)行配置:

plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require("./dist/vendor-manifest.json")
    })
  ]

這樣就完成配置了,是不是很簡(jiǎn)單呢?趕緊動(dòng)手試試吧

happypack

happypack這是個(gè)什么呢?我們都知道webpack是個(gè)單線程處理任務(wù)的,當(dāng)又多個(gè)任務(wù)需要處理的時(shí)候,需要排隊(duì),那happypack就是用多線程來處理任務(wù),通過并發(fā)處理來提高任務(wù)處理速度,那么這個(gè)需要怎么配置呢?來看具體例子:

const happypack = require("happypack")
// 創(chuàng)建并發(fā)池
const threadPool = happypack.ThreadPool({size: os.cpus().length})
module: {
    rules: [{
      test: /.js$/,
      exclude: /node_modules/,
      loader: "happypack/loader?id=happyBabel" // id對(duì)應(yīng)happypack插件id
    }]
  },
plugins: [
    new happypack({
      id: "happyBabel",
      threadPool: threadPool,
      loaders: ["babel-loader?cacheDirectory"]
    })
  ],
減小構(gòu)建體積 webpack-bundle-analyzer

這個(gè)相信大家都很熟悉,就是一個(gè)可視化工具,用來查看各個(gè)包的大小以及相互之間的依賴關(guān)系,配置方法也很簡(jiǎn)單,就和插件的配置一樣,來看具體例子:

const bundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin
plugins: [
    new bundleAnalyzerPlugin()
  ],
tree shaking

tree shaking指的是什么呢?通常指的是JavaScript上下文中未引用的代碼,怎么理解呢?比如你引用了lodash包,里面有許多和JavaScript相關(guān)的便利方法,但你實(shí)際只用了其中的一兩個(gè),此時(shí)打包時(shí)如果把所有的方法都打進(jìn)去了,是不是很浪費(fèi)呢?tree shaking的概念就是去除多余代碼。來看一個(gè)簡(jiǎn)單的例子:

import {plus} from "./count"

console.log(plus(1, 2))
function plus(x, y) {
  return x + y
}
function minus(x, y) {
  return x - y
}
export {
  plus,
  minus
}
const path = require("path")

module.exports = {
  entry: {
    main: "./src/index.js",
  },
  output: {
    path: path.join(__dirname, "dist"),
    filename: "[name].js",
  },
  mode: "development"
}

如上例所示,在入口文件中我們引入count.js中plus方法,我們期望的當(dāng)然是只會(huì)引入plus方法,而不是都引入,但往往不隨人愿,來看結(jié)果:

你會(huì)發(fā)現(xiàn)編譯后的代碼中,整個(gè)count.js都被編譯進(jìn)去了,這時(shí)候你就需要tree shaking了,接下來看做tree shaking的具體方法

UglifyJsPlugin

這個(gè)插件大家一定都用過,使用UglifyJsPlugin就可以在構(gòu)建的過程中對(duì)冗余的代碼進(jìn)行刪除,在webpack4中只需要將上面mode的值改為production,就會(huì)啟用UglifyJsPlugin,是不是很簡(jiǎn)單,或許你想知道webpack4中怎么自己配置UglifyJsPlugin,那就來看具體配置吧:

const UglifyJsPlugin = require("uglifyjs-webpack-plugin")
optimization: {
    minimizer: [
      new UglifyJsPlugin({
        parallel: true,
        cache: true,
        uglifyOptions: {
          compress: {
            drop_console: true,
            reduce_vars: true
          },
          output: {
            comments: false,
            beautify: false
          }
        }
      })
    ]
  }

是的在webpack4中的UglifyJsPlugin是配置在optimization中的minimizer中的,配置是不很簡(jiǎn)單呢?趕緊動(dòng)手嘗試吧

按需加載(import)

這里的import是指webpack中的動(dòng)態(tài)加載,它的語法和ES6中的動(dòng)態(tài)加載語法一摸一樣,這是官方推薦的按需加載的方式,還是上面tree shaking的例子,我們只想引入plus方法,我們來看具體怎么使用:

import("./count.js").then((count) => {
  console.log(count.plus(1, 2))
})

我們只需要將入口文件改成上面的形式,其他的都不要變就可以實(shí)現(xiàn)按需引入,是不是很簡(jiǎn)單呢?在vue中路由的按需加載也可以這么用,來看一個(gè)簡(jiǎn)單的例子:

function view (name) {
  return new Promise((resolve, reject) => {
    import("../views/" + name + ".vue")
      .then((res) => {
        resolve(res)
      }).catch(e => {
        reject("網(wǎng)絡(luò)異常,請(qǐng)稍后再試")
      })
  }).catch(err => {
    throw new Error("err,組件加載失敗")
  })
}

傳入一個(gè)名字,動(dòng)態(tài)引入對(duì)應(yīng)目錄的下的視圖文件,這只是一個(gè)簡(jiǎn)單的例子,具體的使用形式還是依據(jù)具體的場(chǎng)景

總結(jié)

這篇文章簡(jiǎn)單的從構(gòu)建速度和代碼體積兩個(gè)方面簡(jiǎn)單的介紹了webpack優(yōu)化相關(guān)的方法,希望大家都能自己動(dòng)手去寫一寫,畢竟只有實(shí)踐出真知,更何況是編程。
這篇文章如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤?,歡迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99648.html

相關(guān)文章

  • 淺探前端圖片優(yōu)化

    摘要:性能優(yōu)化是前端開發(fā)必不可少的一環(huán),而圖片優(yōu)化又是性能優(yōu)化中必不可少的一環(huán),但不知道有多少開發(fā)者在網(wǎng)頁(yè)的開發(fā)過程中會(huì)注意圖片的使用,圖片使用不當(dāng)可能會(huì)導(dǎo)致網(wǎng)頁(yè)加載卡頓網(wǎng)頁(yè)加載速度慢等問題,這篇文章將會(huì)將我以往對(duì)圖片的處理做個(gè)總結(jié)。 性能優(yōu)化是前端開發(fā)必不可少的一環(huán),而圖片優(yōu)化又是性能優(yōu)化中必不可少的一環(huán),但不知道有多少開發(fā)者在網(wǎng)頁(yè)的開發(fā)過程中會(huì)注意圖片的使用,圖片使用不當(dāng)可能會(huì)導(dǎo)致網(wǎng)頁(yè)加...

    CocoaChina 評(píng)論0 收藏0
  • 淺探前端圖片優(yōu)化

    摘要:性能優(yōu)化是前端開發(fā)必不可少的一環(huán),而圖片優(yōu)化又是性能優(yōu)化中必不可少的一環(huán),但不知道有多少開發(fā)者在網(wǎng)頁(yè)的開發(fā)過程中會(huì)注意圖片的使用,圖片使用不當(dāng)可能會(huì)導(dǎo)致網(wǎng)頁(yè)加載卡頓網(wǎng)頁(yè)加載速度慢等問題,這篇文章將會(huì)將我以往對(duì)圖片的處理做個(gè)總結(jié)。 性能優(yōu)化是前端開發(fā)必不可少的一環(huán),而圖片優(yōu)化又是性能優(yōu)化中必不可少的一環(huán),但不知道有多少開發(fā)者在網(wǎng)頁(yè)的開發(fā)過程中會(huì)注意圖片的使用,圖片使用不當(dāng)可能會(huì)導(dǎo)致網(wǎng)頁(yè)加...

    X1nFLY 評(píng)論0 收藏0
  • 淺探js深拷貝和淺拷貝

    摘要:接下來就讓我們更細(xì)致的探究中的深淺拷貝??偨Y(jié)以上對(duì)深拷貝和淺拷貝做了簡(jiǎn)單的介紹,在深拷貝的實(shí)現(xiàn)上也只介紹了最簡(jiǎn)單的實(shí)現(xiàn)形式,并未考慮復(fù)雜情況以及相應(yīng)優(yōu)化,想要對(duì)深拷貝有更深入的了解,需要大家花時(shí)間去深入研究,或者可以關(guān)注我后續(xù)文章的動(dòng)態(tài)。 對(duì)象和數(shù)組的拷貝對(duì)我來說一直都是一個(gè)比較模糊的概念,一直有點(diǎn)一知半解,但是在實(shí)際工作中又偶爾會(huì)涉及到,有時(shí)候還會(huì)一不小心掉坑里,不知道大家有沒有同樣...

    habren 評(píng)論0 收藏0
  • 淺探css3漸變

    摘要:基本用法想要知道線性漸變有什么用,當(dāng)然要先學(xué)習(xí)它的屬性和用法。下面我們先一起學(xué)習(xí)一下線性漸變的屬性。函數(shù)的第一個(gè)參數(shù)是角度或者方向,第二個(gè)參數(shù)是截止顏色的值,要想產(chǎn)生漸變的效果,當(dāng)然至少要兩個(gè)或者兩個(gè)以上的顏色值。 css3的漸變屬性已經(jīng)在各種網(wǎng)頁(yè)設(shè)計(jì)中被廣泛使用,在沒有css3的漸變屬性之前,要實(shí)現(xiàn)一些多種顏色切換的效果圖,你可能別無他法,只能用一個(gè)圖片來顯示,雖然你知道使用圖片需要...

    lieeps 評(píng)論0 收藏0
  • 淺談webpack4.0 性能優(yōu)化

    摘要:中在性能優(yōu)化所做的努力,也大抵圍繞著這兩個(gè)大方向展開。因此,將依賴模塊從業(yè)務(wù)代碼中分離是性能優(yōu)化重要的一環(huán)。大型庫(kù)是否可以通過定制功能的方式減少體積。這又違背了性能優(yōu)化的基礎(chǔ)。接下來可以抓住一些細(xì)節(jié)做更細(xì)的優(yōu)化。中,為默認(rèn)啟動(dòng)這一優(yōu)化。 前言:在現(xiàn)實(shí)項(xiàng)目中,我們可能很少需要從頭開始去配置一個(gè)webpack 項(xiàng)目,特別是webpack4.0發(fā)布以后,零配置啟動(dòng)一個(gè)項(xiàng)目成為一種標(biāo)配。正因?yàn)?..

    leanxi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<