Webpack4配置之基礎(chǔ)篇

  1. 什么是webpack
    WebPack可以看做是模塊打包機(jī):它做的事情是,分析你的項(xiàng)目結(jié)構(gòu)猪杭,找到JavaScript模塊以及其它的一些瀏覽器不能直接運(yùn)行的拓展語言(Scss启摄,TypeScript等),并將其打包為合適的格式以供瀏覽器使用辩尊。
  2. webpack核心概念
Entry:入口烟馅,Webpack 執(zhí)行構(gòu)建的第一步將從 Entry 開始说庭,可抽象成輸入。
Module:模塊郑趁,在 Webpack 里一切皆模塊刊驴,一個(gè)模塊對(duì)應(yīng)著一個(gè)文件。Webpack 會(huì)從配置的 Entry 開始遞歸找出所有依賴的模塊寡润。
Chunk:代碼塊捆憎,一個(gè) Chunk 由多個(gè)模塊組合而成,用于代碼合并與分割梭纹。 Loader:模塊轉(zhuǎn)換器躲惰,用于把模塊原內(nèi)容按照需求轉(zhuǎn)換成新內(nèi)容。
Plugin:擴(kuò)展插件变抽,在 Webpack 構(gòu)建流程中的特定時(shí)機(jī)注入擴(kuò)展邏輯來改變構(gòu)建結(jié)果或做你想要的事情础拨。
Output:輸出結(jié)果,在 Webpack 經(jīng)過一系列處理并得出最終想要的代碼后輸出結(jié)果绍载。 
  1. webpack執(zhí)行流程
    webpack啟動(dòng)后會(huì)在entry里配置的module開始遞歸解析entry所依賴的所有module诡宗,沒找到一個(gè)module, 就會(huì)根據(jù)配置的loader去找相應(yīng)的轉(zhuǎn)換規(guī)則,對(duì)module進(jìn)行轉(zhuǎn)換后在解析當(dāng)前module所依賴的module击儡,這些模塊會(huì)以entry為分組僚焦,一個(gè)entry和所有相依賴的module也就是一個(gè)chunk,最后webpack會(huì)把所有chunk轉(zhuǎn)換成文件輸出曙痘,在整個(gè)流程中webpack會(huì)在恰當(dāng)?shù)臅r(shí)機(jī)執(zhí)行plugin的邏輯

  2. 開始從零配置webpack

  3. 初始化配置

    mkdir webpack-start
    cd webpack-start
    npm init
    
  4. 配置webpack

    yarn add webpack webpack-cli -D //webpack4把webpack拆分了
    mkdir src   cd src并且創(chuàng)建index.html, index.js
    mkdir dist
    touch webpack.config.js
    

webpack.config.js

module.exports = {
        entry: './src/index.js', //入口文件芳悲,src下的index.js
        output: {
            path: path.join(__dirname, 'dist'), // 出口目錄,dist文件
            filename: '[name].[hash].js' //這里name就是打包出來的文件名边坤,因?yàn)槭菃稳肟诿福褪莔ain,多入口下回分解
        },
        module: {},
        plugin: {},
        devServer: {}
  }
  1. 配置開發(fā)服務(wù)器

    yarn add webpack-dev-server -D
    

修改webpack.config.js

  devServer: {
         contentBase: path.join(__dirname, "dist"), //靜態(tài)文件根目錄
         port: 9090, // 端口
         host: 'localhost',
         overlay: true,
         compress: true // 服務(wù)器返回瀏覽器的時(shí)候是否啟動(dòng)gzip壓縮
  }

修改package.json

 "script": {
     "build": "webpack --mode development", //這里為了不壓縮代碼茧痒,用開發(fā)環(huán)境
     "dev": "webpack-dev-server --open --mode development"
 }
  1. 支持css文件
  yarn add style-loader css-loader -D
  // css-loader用來處理css中url的路徑
  // style-loader可以把css文件變成style標(biāo)簽插入head中
  // 多個(gè)loader是有順序要求的肮韧,從右往左寫,因?yàn)檗D(zhuǎn)換的時(shí)候是從右往左轉(zhuǎn)換的
  module: {
  rules: {
        test: /\.css$/,
        use: ['style-laoder', 'css-loader'],
        include: path.join(__dirname, 'src'), //限制范圍旺订,提高打包速度
        exclude: /node_modules/
   }
}
  1. 支持es6弄企,react.js等
 yarn add babel-loader babel-core babel-preset-env babel-preset-stage-0 babel-preset -react -D
  {
    test: /\.js$/,
    use: {
      loader: 'babel-loader',
      query: {
       presets: ['env', 'stage-0', 'react'] // env轉(zhuǎn)換es6 stage-0轉(zhuǎn)es7 react轉(zhuǎn)react
    }
  }
}

同時(shí)可以把babel配置寫到.babelrc中

  1. 從js中分離css
yarn add extract-text-webpack-plugin -D
{
      test: /\.css$/, // 轉(zhuǎn)換文件的匹配正則
      use: ExtractTextWebpackPlugin.extract({
      fallback: 'style-loader',
      //如果需要,可以在 sass-loader 之前將 resolve-url-loader 鏈接進(jìn)來
      use: ['css-loader']
    })
 },
  //加上plugin
  plugins: [
      new ExtractTextWebpackPlugin({
            filename: 'css/[name].[hash].css' //放到dist/css/下
      })
 ]
  1. 支持圖片
 yarn add file-loader url-loader -D

file-loader 解決css等文件中引入圖片路徑的問題
url-loader 當(dāng)圖片較小的時(shí)候會(huì)把圖片BASE64編碼区拳,大于limit參數(shù)的時(shí)候還是使用file-loader 進(jìn)行拷貝

 {
      // file-loader是解析圖片地址拘领,把圖片從源文件拷貝到目標(biāo)文件并且修改源文件名字
      // 可以處理任意二進(jìn)制,bootstrap里的字體
      // url-loader可以在文件比較小的時(shí)候樱调,直接變成base64字符串內(nèi)嵌到頁面中
      {
          test: /\.(png|jpg|jpeg|gif|svg)/,
          use: {
          loader: 'url-loader',
          options: {
              outputPath: 'images/', // 圖片輸出的路徑
              limit: 5 * 1024
          }
     }
  },
  // 同時(shí)要處理打包圖片路徑問題约素,
  output: {
      publicPath: '/'
  }
  1. 處理css3屬性前綴

    yarn add postcss-loader -D
    {
          test: /\.css$/, // 轉(zhuǎn)換文件的匹配正則
          // css-loader用來處理css中url的路徑
          // style-loader可以把css文件變成style標(biāo)簽插入head中
          // 多個(gè)loader是有順序要求的届良,從右往左寫,因?yàn)檗D(zhuǎn)換的時(shí)候是從右往左轉(zhuǎn)換的
          // 此插件先用css-loader處理一下css文件
          use: ExtractTextWebpackPlugin.extract({
                  fallback: 'style-loader',
                  //如果需要圣猎,可以在 sass-loader 之前將 resolve-url-loader 鏈接進(jìn)來
          use: ['css-loader', 'postcss-loader']
      })
    },
    

建立.postcssrc.js文件

module.exports = {
    "plugins": {
        // to edit target browsers: use "browserslist" field in package.json
        "autoprefixer": {
        "browsers": [
            "ie >= 9",
            "ff >= 30",
            "chrome >= 34",
            "safari >= 7",
            "opera >= 23"
        ]
        }
    }
}
  1. 調(diào)試打包的代碼 webapck通過配置可以自動(dòng)給我們source maps文件士葫,map文件是一種對(duì)應(yīng)編譯文件和源文件的方法
devtool: 'eval-source-map'
1. source-map 把映射文件生成到單獨(dú)的文件,最完整最慢
2. cheap-module-source-map 在一個(gè)單獨(dú)的文件中產(chǎn)生一個(gè)不帶列映射的Map
3. eval-source-map 使用eval打包源文件模塊,在同一個(gè)文件中生成完整sourcemap
4. cheap-module-eval-source-map sourcemap和打包后的JS同行顯示送悔,沒有映射列
  1. 壓縮js
webpack --mode production 會(huì)壓縮慢显,可以忽略下面
yarn add uglifyjs-webpack-plugin -D
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
new UglifyjsWebpackPlugin(),
  1. 壓縮css
webpack --mode production 會(huì)壓縮,可以忽略下面
{
    test: /\.css$/, // 轉(zhuǎn)換文件的匹配正則
    use: ExtractTextWebpackPlugin.extract({
    fallback: 'style-loader',
    use: [
        {
            loader: 'css-laoder',
            options: {minimize: true}
        },
        'postcss-loader'
    ]
    })
},
  1. 清空打包輸出目錄
yarn add clean-webpack-plugin -D
const CleanWebpackPlugin = require('clean-webpack-plugin')
new CleanWebpackPlugin([path.join(__dirname, 'dist')]),
  1. 區(qū)分環(huán)境變量 許多 library 將通過與 process.env.NODE_ENV 環(huán)境變量關(guān)聯(lián)欠啤,以決定 library 中應(yīng)該引用哪些內(nèi)容荚藻。我們可以使用 webpack 內(nèi)置的 DefinePlugin 為所有的依賴定義這個(gè)變量:
  "scripts": {
    "build": "cross-env NODE_ENV=production webpack --mode development", // 設(shè)置NODE_ENV為production
    "dev": "webpack-dev-server --open --mode development "
},
new webpack.DefinePlugin({
    NODE_ENV:JSON.stringify(process.env.NODE_ENV)
})
在全局都有NODE_ENV這個(gè)變量,當(dāng)yarn run build,時(shí),NODE_ENV = 'production'
  1. 暴露全局變量
new Webpack.ProvidePlugin({
    '$': 'jquery'
}),
  1. resolve解析
extension: 指定extension之后可以不用在require或是import的時(shí)候加文件擴(kuò)展名,會(huì)依次嘗試添加擴(kuò)展名進(jìn)行匹配
resolve: {
    //自動(dòng)補(bǔ)全后綴跪妥,注意第一個(gè)必須是空字符串,后綴一定以點(diǎn)開頭
    extension: ['', '.js', '.json', '.css']
}
alias: 配置別名可以加快webpack查找模塊的速度
resolve: {
    alias: {
        'bootstrap': 'bootstrap/dist/css/bootstrap.css'
    }
}
  1. 復(fù)制靜態(tài)資源
yarn add copy-webpack-plugin
const CopyWebpackPlugin = require('copy-webpack-plugin')
new CopyWebpackPlugin([
{
    from: path.resolve(__dirname, 'static'),
    to: path.resolve(__dirname, 'pages/static'),
    ignore: ['.*']
}
])

基礎(chǔ)就是這些吧鞋喇,代碼優(yōu)化,提高打包速度眉撵,多頁配置侦香,咱們下回分解,詳見webpack高級(jí)配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纽疟,一起剝皮案震驚了整個(gè)濱河市罐韩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌污朽,老刑警劉巖散吵,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蟆肆,居然都是意外死亡矾睦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門炎功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枚冗,“玉大人,你說我怎么就攤上這事蛇损×尬拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵淤齐,是天一觀的道長(zhǎng)股囊。 經(jīng)常有香客問我,道長(zhǎng)更啄,這世上最難降的妖魔是什么稚疹? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮锈死,結(jié)果婚禮上贫堰,老公的妹妹穿的比我還像新娘穆壕。我一直安慰自己待牵,他們只是感情好其屏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缨该,像睡著了一般偎行。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰拿,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天蛤袒,我揣著相機(jī)與錄音,去河邊找鬼膨更。 笑死妙真,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荚守。 我是一名探鬼主播珍德,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼矗漾!你這毒婦竟也來了锈候?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤敞贡,失蹤者是張志新(化名)和其女友劉穎泵琳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誊役,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡获列,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛔垢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击孩。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啦桌,靈堂內(nèi)的尸體忽然破棺而出溯壶,到底是詐尸還是另有隱情,我是刑警寧澤甫男,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布且改,位于F島的核電站,受9級(jí)特大地震影響板驳,放射性物質(zhì)發(fā)生泄漏又跛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一若治、第九天 我趴在偏房一處隱蔽的房頂上張望慨蓝。 院中可真熱鬧感混,春花似錦、人聲如沸礼烈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此熬。三九已至庭呜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犀忱,已是汗流浹背募谎。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阴汇,地道東北人数冬。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搀庶,于是被迫代替她去往敵國和親拐纱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • 目錄第1章 webpack簡(jiǎn)介 11.1 webpack是什么地来? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,731評(píng)論 0 1
  • 初始化項(xiàng)目 進(jìn)入一個(gè)文件夾作為項(xiàng)目的根目錄 npm init 新建src, dist目錄戳玫,package.json...
    love_program閱讀 1,235評(píng)論 0 4
  • 深入淺出Webpack學(xué)習(xí)筆記 基本概念 常用的構(gòu)建工具 所有的構(gòu)建工具所做的工做大致一樣,都是把源代碼翻譯轉(zhuǎn)換成...
    IsaacHHH閱讀 504評(píng)論 0 0
  • 中秋節(jié)過得還是比較有意義的未斑,老鄉(xiāng)見老鄉(xiāng)咕宿,兩眼淚汪汪,多年不見蜡秽,甚是想念府阀,我們便決定去大理,火車在凌晨五點(diǎn)左右...
    極左之地閱讀 323評(píng)論 0 0
  • “不行就是不行,沒有什么理由,我沒有同意就是不行!”媽媽在我的面前厲聲道芽突。我在媽媽強(qiáng)勢(shì)的威壓下強(qiáng)硬的反駁道:“為什...
    5e7d12e96bc4閱讀 283評(píng)論 4 4