webpack的基本使用技巧和項目優(yōu)化

4736463-b5e524d0d3521b7a.jpg

webpack處理html

html-webpack-plugin這個plugin曝光率很高,他主要有兩個作用

  • 為html文件中引入的外部資源如script、link動態(tài)添加每次compile后的hash,防止引用緩存的外部文件問題
  • 幫助你自動生成 HTML 文件到build文件夾一铅,比如單頁面可以生成一個html文件入口,配置N個html-webpack-plugin可以生成N個頁面入口。
    簡單的來說颖杏,運行npm start之后你會神奇的看到在你的 build 文件夾會生成一個 index.html 文件和一個 bundle.js 文件,而且 index.html 文件中自動引用 webpack 生成的 bundle.js 文件坛芽。所有的這些都是 html-webpack-plugin 的功勞留储。

Webpack 插件使用三步曲:安裝>引入>配置
npm 安裝

npm install --save-dev html-webpack-plugin

yarn 安裝

yarn add html-webpack-plugin --dev

引入:

const HtmlWebpackPlugin = require('html-webpack-plugin');

配置:

new HtmlWebpackPlugin({
          title: 'test page', //html標(biāo)題
            filename: 'index.html', //打包后的html文件名翼抠,默認(rèn)index.html
            template: './index.html', // html的源文件
            inject: true, //默認(rèn)true,意為script標(biāo)簽位于html文件的 body 底部
            cache: true, //默認(rèn)true获讳,表示內(nèi)容變化的時候生成一個新的文件
            chunks: ['index'], //表示編譯時用到的入口文件
            date: new Date(),
            // excludeChunks: ['index']//表示編譯時排除的入口文件
        }),

如果需要復(fù)制多個頁面到成產(chǎn)環(huán)境的話阴颖,多引入幾次。
詳細配置和使用方法見:webpack4 之html-webpack-plugin

webpack處理css

1最基本的CSS處理

Webpack最基本的css處理:css-loader + style-loader丐膝。其中css-loader用于處理css文件中的@import和url(...)量愧,而style-loader用于將css-loader的輸出生成js中的函數(shù)調(diào)用將css動態(tài)添加到html文件中。
安裝css-loader和style-loader:

npm install --save-dev css-loader style-loader

然后配置webpack.config.js帅矗,使webpack可以將css文件當(dāng)做module對待(即可以進行import操作)以及使用css-loader和style-loader對css文件進行處理偎肃。

module: {
    rules: [
      {
        test: /\.css$/,
        use: [ 'style-loader', 'css-loader' ]
      }
    ]
  }

css-loader 和style-loader兩者使用的時候是一起使用的缺一不可并且有先后順序的 要先使用 css-loader 轉(zhuǎn)碼,然后再使用 style-loader插入到文件中去安裝使用浑此。

2.單頁面應(yīng)用累颂,把JS里面的CSS單獨打包

style-loader將css以style標(biāo)簽的形式動態(tài)添加到html文件中,有時(特別是在生產(chǎn)環(huán)境下)我們希望將所有的css抽離為獨立的css文件凛俱,此時可以借助

  • mini-css-extract-plugin
    將CSS提取為獨立的文件的插件紊馏,對每個包含css的js文件都會創(chuàng)建一個CSS文件,然后再link進頁面蒲犬。支持按需加載css和sourceMap

(1).安裝mini-css-extract-plugin:

npm install --save-dev mini-css-extract-plugin

(2).webpack.config.js 配置

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const devMode = process.env.NODE_ENV !== 'production';
module: {
    rules: [
        {
            test: /\.css$/,
            use : [
                MiniCssExtractPlugin.loader,
                { loader: "css-loader" }
            ]
        },
        {
            test: /\.less$/,
            use : [
                MiniCssExtractPlugin.loader,
                { loader: "css-loader" },
                { loader: "less-loader" }
            ]
        }
    ]
},
plugins: [
    new MiniCssExtractPlugin({
      // 這里的配置和webpackOptions.output中的配置相似
      // 即可以通過在名字前加路徑朱监,來決定打包后的文件存在的路徑
      filename: devMode ? 'css/[name].css' : 'css/[name].[hash].css',
      chunkFilename: devMode ? 'css/[id].css' : 'css/[id].[hash].css',
    })
  ]
image.png
3. webpack如何打包多個CSS文件到一個css文件中

如何用webpack將css合并打包成一個單獨的css,或者將css中同樣的模塊獨立出來呢暖哨?extract-text-webpack-plugin可以將所有 required 的 *.css 模塊抽取到一個單獨的 CSS 文件赌朋。 所以你的樣式將不會內(nèi)聯(lián)到 JS bundle,而是在一個單獨的 CSS 文件篇裁。如果你的樣式文件很大沛慢,這樣會提速,因為 CSS bundle 和 JS bundle 是平行加載的达布。
(1).這個插件的安裝方法:

npm install extract-text-webpack-plugin --save-dev

(2).webpack.config.js 配置

const ExtractTextWebpackPlugin = require("extract-text-webpack-plugin");
module: {
   rules: [
        {
            test: /\.css$/,
            use : ExtractTextWebpackPlugin.extract({
                use: [
                    { loader: "css-loader" }
                ]
            })
        },
        {
            test: /\.less$/,
            use : ExtractTextWebpackPlugin.extract({
                use: [
                    { loader: "css-loader" },
                    { loader: "less-loader" }
                ]
            })
        }
    ]
},
plugins: [
   new ExtractTextWebpackPlugin({
        filename: "css/common.css"
    }),
 ]

詳細配置可參考:extract-text-webpack-plugin

webpack處理圖片

1.最基本的打包圖片

圖片打包關(guān)鍵要用到file-loader或url-loader
file-loader和url-loader模塊是webpack打包中用到的一個loader团甲。
它實現(xiàn)的功能很簡單:

-將要加載的文件復(fù)制到指定目錄
-將請求文件的url從相對于原始文件修改為相對于入口html頁面

(1).安裝相應(yīng)的loader

//安裝file-loader
npm install --save-dev file-loader
//或者安裝url-loader
npm install --save-dev file-loader

其中url-loader與file-loader功能基本一致,只不過url-loader能將小于某個大小的圖片進行base64格式的轉(zhuǎn)化處理黍聂。
(2).在webpack.config.js中的rules數(shù)組中添加相關(guān)配置

//使用file-loader的相關(guān)配置
 {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.(png|jpg|jpeg|jsp|gif)/,
                use: [{
                    loader: 'file-loader',
                    options: {
                        name: '[name]_[hash].[ext]', //保持打包后的圖片名字和原來一樣
                        outputPath: 'images/'

                    }
                }]
            }

file-loader可以解析項目中的url引入(不僅限于css)躺苦,根據(jù)我們的配置,將圖片拷貝到相應(yīng)的路徑产还,再根據(jù)我們的配置匹厘,修改打包后文件引用路徑,使之指向正確的文件脐区。

file-loader的詳細配置請參考file-loader

除了使用file-loader對圖片進行打包處理外愈诚,我們同樣也可以使用url-loader代替,使用url-loader我們還可以對小于某個大小的圖片進行base64格式的轉(zhuǎn)化處理。

{
                test: /\.(png|jpg|jpeg|jsp|gif)/,
                use: [{
                    loader: 'url-loader',
                    options: {
                        limit: 40960,
                        name: '[name].[ext]', //保持打包后的圖片名字和原來一樣
                        outputPath: 'images/'
                    }
                }]
            }

這里limit屬性的作用就是將小于40960B(40K)大小的圖片轉(zhuǎn)成base64格式炕柔,而大于這個大小的圖片將會以file-loader的方式進行打包處理酌泰,例如圖片小于40k的時候:


1564048064(1).jpg

如果圖片較多,會發(fā)很多http請求匕累,會降低頁面性能陵刹。這個問題可以通過url-loader解決。url-loader會將引入的圖片編碼欢嘿,生成dataURl衰琐。相當(dāng)于把圖片數(shù)據(jù)翻譯成一串字符。再把這串字符打包到文件中际插,最終只需要引入這個文件就能訪問圖片了碘耳。當(dāng)然,如果圖片較大框弛,編碼會消耗性能辛辨。因此url-loader提供了一個limit參數(shù),小于limit字節(jié)的文件會被轉(zhuǎn)為DataURl瑟枫,大于limit的還會使用file-loader進行copy斗搞。

url-loader和file-loader是什么關(guān)系呢?簡答地說慷妙,url-loader封裝了file-loader僻焚。url-loader不依賴于file-loader,即使用url-loader時膝擂,只需要安裝url-loader即可虑啤,不需要安裝file-loader,因為url-loader內(nèi)置了file-loader架馋。通過上面的介紹狞山,我們可以看到,url-loader工作分兩種情況:1.文件大小小于limit參數(shù)叉寂,url-loader將會把文件轉(zhuǎn)為DataURL萍启;2.文件大小大于limit,url-loader會調(diào)用file-loader進行處理屏鳍,參數(shù)也會直接傳給file-loader勘纯。因此我們只需要安裝url-loader即可。

參考文章:webpack學(xué)習(xí)筆記--file-loader 和 url-loader
webpack 中進行圖片處理 file-loader img-loader url-loader
Webpack輕松入門—圖片打包

furl-loader的詳細配置請參考url-loader

2.webpack處理雪碧圖

之前使用雪碧圖需要用到ps去拼接然后手動寫樣式钓瞭。
例如頁面中經(jīng)常會需要一些圖標(biāo)驳遵。例如:


image.png

使用 webpack-spritesmith
插件之后,簡化了上述麻煩的步驟。我們只需要提供指定目錄下的一堆小圖片.它就能幫我們做如下的事情.

-把零散的小圖標(biāo)生成一張大圖.(多個http請求變成一個)
-測量大圖的中每一個小圖標(biāo)的大小以及位置,幫我們生成對應(yīng)的 .css 文件.(不用我們自己測量尺寸和位置以及編寫.css文件)

webpack-spritesmith的使用方法如下:

(1)安裝 webpack-spritesmith插件

npm install --save-dev webpack-spritesmith

(2).在 webpack.config.js 中導(dǎo)入此插件,并設(shè)置一些此插件的相關(guān)配置.

const WebpackSpritesmithPlugin = require('webpack-spritesmith');
// 雪碧圖插件
        new WebpackSpritesmithPlugin({
            // 目標(biāo)小圖標(biāo)
            src: {
                // 小圖標(biāo)路徑
                cwd: path.join(__dirname, 'src/images/sprite'),
                // 匹配小圖標(biāo)文件后綴名
                glob: '*.png'
            },
            target: {
                // 生成雪碧圖(大圖)文件存放路徑
                image: path.join(__dirname, 'dist/images/sprites.png'),
                // 對應(yīng)的樣式文件存放路徑
                css: path.join(__dirname, 'dist/css/sprites.css')
            },
            // 打包的樣式文件中,調(diào)用雪碧圖的路徑
            apiOptions: {
                cssImageRef: '../images/sprites.png'
            },
            // 雪碧圖生成算法
            spritesmithOptions: {
                algorithm: 'binary-tree', // binary-tree,top-down從左到右和從上到下生成方向.
                padding: 2 // 每個小圖標(biāo)之間的間隙
            }
        })

打包之后生成的頁面結(jié)構(gòu)如下:


image.png

幾張圖標(biāo)被拼成了一張完整的圖:


image.png

webpack-spritesmith的詳細使用方法可如下文章:
手把手教你webpack3(15)插件之雪碧圖插件(WEBPACK-SPRITESMITH配置簡述)

webpack 學(xué)習(xí)筆記之十, webpack-spritesmith 雪碧圖

webpack優(yōu)化實踐

1.webpack實現(xiàn)vue路由按需加載

webpack ensure相信大家都聽過山涡。有人稱它為異步加載超埋,也有人說做代碼切割搏讶,那這
個家伙到底是用來干嘛的佳鳖?其實說白了霍殴,它就是把js模塊給獨立導(dǎo)出一個.js文件的,然后使用這個模塊的時候系吩,webpack會構(gòu)造script dom元素来庭,由瀏覽器發(fā)起異步請求這個js文件。
語法如下:

require.ensure(dependencies: String[], callback: function(require), chunkName: String)

依賴 dependencies:這是一個字符串?dāng)?shù)組穿挨,通過這個參數(shù)月弛,在所有的回調(diào)函數(shù)的代碼被執(zhí)行前,我們可以將所有需要用到的模塊進行聲明科盛。

回調(diào) callback:當(dāng)所有的依賴都加載完成后帽衙,webpack會執(zhí)行這個回調(diào)函數(shù)。require 對象的一個實現(xiàn)會作為一個參數(shù)傳遞給這個回調(diào)函數(shù)贞绵。因此厉萝,我們可以進一步 require() 依賴和其它模塊提供下一步的執(zhí)行。

chunk名稱 chunkName:chunkName 是提供給這個特定的 require.ensure() 的 chunk 的名稱榨崩。通俗的說就是按需加載引入的那個js的文件名谴垫。需要文件名的時候需要對wenpack的output的chunkFilename和publicPath兩個屬性進行配置。

(1)將組件(頁面)引入
傳統(tǒng)的與引入方式為:

import List from '@/components/List'

這里需要修改為:

const List = r => require.ensure([], () => r(require('@/components/List')), 'List')

路由還按以前的方式寫:

export default new Router({
  routes: [{
    path: '/',
    name: 'index',
    component: Index
  },
  {
    path: '/list',
    name: 'List',
    component: List
  }
  ]
})

詳細的使用請參考文章:
三種方式分割VueJS及Webpack代碼
vue按需加載組件-webpack require.ensure

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末母蛛,一起剝皮案震驚了整個濱河市翩剪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彩郊,老刑警劉巖前弯,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秫逝,居然都是意外死亡恕出,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門筷登,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃根,“玉大人,你說我怎么就攤上這事前方”纷恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵惠险,是天一觀的道長苗傅。 經(jīng)常有香客問我,道長班巩,這世上最難降的妖魔是什么渣慕? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任嘶炭,我火速辦了婚禮,結(jié)果婚禮上逊桦,老公的妹妹穿的比我還像新娘眨猎。我一直安慰自己,他們只是感情好强经,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布睡陪。 她就那樣靜靜地躺著,像睡著了一般匿情。 火紅的嫁衣襯著肌膚如雪兰迫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天炬称,我揣著相機與錄音汁果,去河邊找鬼。 笑死玲躯,一個胖子當(dāng)著我的面吹牛据德,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播府蔗,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晋控,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姓赤?” 一聲冷哼從身側(cè)響起赡译,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎不铆,沒想到半個月后蝌焚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡誓斥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年只洒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劳坑。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毕谴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出距芬,到底是詐尸還是另有隱情涝开,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布框仔,位于F島的核電站舀武,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏离斩。R本人自食惡果不足惜银舱,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一瘪匿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寻馏,春花似錦棋弥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聂薪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝗羊,已是汗流浹背藏澳。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耀找,地道東北人翔悠。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像野芒,于是被迫代替她去往敵國和親蓄愁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)流程 參考文檔:入門Webpack狞悲,看這篇就夠了Webpack for React 一. 簡單使用webpac...
    Jason_Zeng閱讀 3,138評論 2 16
  • 目錄第1章 webpack簡介 11.1 webpack是什么撮抓? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,735評論 0 1
  • webpack使用學(xué)習(xí) 本分享學(xué)習(xí)借鑒webpack中文官網(wǎng),官網(wǎng)鏈接(中文文檔):https://www.web...
    腿毛怪丶叔叔閱讀 880評論 0 5
  • 在現(xiàn)在的前端開發(fā)中摇锋,前后端分離丹拯、模塊化開發(fā)、版本控制荸恕、文件合并與壓縮乖酬、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,440評論 1 32
  • 社會越先進生宛,科技越發(fā)達县昂,生活變得更便利了,但育兒這事兒似乎變得更難了茅糜,作為80后七芭、90后這代獨生子女,面對嬰兒的養(yǎng)...
    童園稚趣閱讀 794評論 0 0