webpack5配置demo

1好乐、搭建項目
1)迎捺、md webpack5-demo:打開VSCode新建終端绽淘,創(chuàng)建webpack5-demo文件名
2)npm init -y:安裝npm項目初始化
3)npm i webpack webpack-cli -D:安裝webpack和webpack-cli (-D表示安裝開放環(huán)境依賴)
4)入口文件編寫奔脐,創(chuàng)建src

2、webpack.config.js基本配置

const path = require("path")

module.exports={
    //打包入口
    entry:"./src/main.js",
    //打包出口
    output:{
        // 輸出文件名
        filename:"index.js",
        // __dirname nodejs的變量星澳,代表當前文件的目錄絕對路徑
        path:path.resolve(__dirname, "dist")
    }
}

1)新建main.js在main.js里編寫
···
console.log("測試webpack")
···
2)VSCode終端輸入 npx webpack運行
生成如下dist



恭喜webpack運行成功

loader配置
style-loader,css-loader安裝css打包配置
執(zhí)行旱易,npm i style-loader css-loader -D
webpack.config.js編寫

const path = require("path")

module.exports={
    //打包入口
    entry:"./src/main.js",
    //打包出口
    output:{
        // 輸出文件名
        filename:"index.js",
        // __dirname nodejs的變量禁偎,代表當前文件的目錄絕對路徑
        path:path.resolve(__dirname, "dist")
    },
    // loader的配置
    module:{
        rules:[
            {
            test: /\.css$/,
            use: [
                'style-loader',
                'css-loader'
                ]
            }
        ]
    },
    // plugins的配置
    plugins: [
    // 詳細plugins的配置
    ],
    // 模式
    mode: 'development', // 開發(fā)模式
    // mode: 'production'
}

新建common.css文件編輯css腿堤,在main.js引入
import "./css/common.css"


在dist文件中新建index.html,引入index.js


<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width">
  <meta name="template" content="Dusty Cartridge 0.1" />
  <title>css</title>
  <script src="./index.js"></script>
</head>
<body>  
</body>
</html>

運行:npx webpack,
瀏覽器中運行index.html



css打包成功

less如暖,less-loade笆檀,安裝less打包配置
執(zhí)行,npm i less less-loader -D
module配置

{
    test:/\.less$/,
       use:[
                  'style-loader',
                  'css-loader',
                  // 將less文件編譯成css文件
                  // 需要下載 less-loader和less
                  'less-loader'
                ]
 }

創(chuàng)建在css中l(wèi)ess.less盒至,在main.js中引入import "./css/less.less"
運行:npx webpack
運行dist文件中的html



less打包配置成功

sass酗洒,sass-loade,安裝sass打包配置
執(zhí)行枷遂,npm i sass sass-loader -D
步驟與上面一樣不在贅述
module配置

{
          test:/\.s[ac]ss$/i,
          use:[
          'style-loader',
          'css-loader', 
          'sass-loader'
         ]
 }

stylus樱衷,stylus-loade,安裝sass打包配置
執(zhí)行酒唉,npm i stylus stylus-loader -D
module配置

            {
                test:/\.styl(us)?$/,//兩種結(jié)尾方式styl或者styus
                use:[
                    'style-loader',
                    'css-loader', 
                    'stylus-loader'
                ]
            }

html打包配置
執(zhí)行矩桂,npm i html-webpack-plugin -D
在src中新建html

<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width">
  <meta name="template" content="Dusty Cartridge 0.1" />
  <title>html</title>
</head>
<body>  
</body>
</html>

刪除dist
在webpack.config.js中配置
引入html-webpack-plugin



配置const HtmlWebpackPlugin= require("html-webpack-plugin")

plugins: [
    // 詳細plugins的配置
    // html-webpack-plugin
    // 功能:默認會創(chuàng)建一個空的HTML,自動引入打包輸出的所有資源(JS/CSS)
    // 需求:需要有結(jié)構(gòu)的HTML文件
    new HtmlWebpackPlugin({
        // 復制 './src/index.html' 文件痪伦,并自動引入打包輸出的所有資源(JS/CSS)
        template:'./src/index.html'
    })
    ]

運行:npx webpack

css提取mini-css-extract-plugin
執(zhí)行侄榴,npm i mini-css-extract-plugin -D
webpack.config.js引入
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
plugins中配置

new MiniCssExtractPlugin({
      // 對輸出的css文件進行重命名
      filename: "css/style.css",
    }),

module中配置

{
        // 匹配哪些文件
        test: /\.css$/,
        // 使用哪些loader進行處理
        use: [ 
          //"style-loader",
          MiniCssExtractPlugin.loader, 
          "css-loader",
        ],
      },

運行:npx webpack

圖片打包url-loader file-loader
執(zhí)行,npm i url-loader file-loader -D
module配置

{
        // 默認處理不了html中img圖片
        // 處理圖片資源
        test: /\.(jpg|png|gif)$/,
        // 使用一個loader
        // 下載 url-loader file-loader
        loader: "url-loader",
        options: {
          // 圖片大小小于8kb网沾,就會被base64處理
          // 優(yōu)點: 減少請求數(shù)量(減輕服務器壓力)
          // 缺點:圖片體積會更大(文件請求速度更慢)
          limit: 2 * 1024,
          // 解析時會出問題:[object Module]
          // 解決:關閉url-loader的es6模塊化癞蚕,使用commonjs解析
          esModule: false,
          // 給圖片進行重命名
          // [hash:10]取圖片的hash的前10位
          // [ext]取文件原來擴展名
          name: "[hash:10].[ext]",
          outputPath: "imgs",//路徑根據(jù)項目名稱自定義
        },
        type: 'javascript/auto'
      },

html圖片配置
執(zhí)行,npm i html-loader -D

{
        test: /\.html$/,
        // 處理html文件的img圖片(負責引入img辉哥,從而能被url-loader進行處理)
        loader: 'html-loader'
      }

運行:npx webpack
其他資源處理

{
        // 處理其他資源
        exclude: /\.(node_modules|html|js|css|less|sass|scss|stylus|styl|jpg|png|gif)/,       
        loader: 'file-loader',  
        options: { 
          esModule: false,
          outputPath: 'file', 
        },
        type:"javascript/auto",  
      },

devServer配置
npm i webpack-dev-server -D

devServer: {
    // 項目構(gòu)建后路徑
    static: {
      directory: path.join(__dirname, "public"),
    },
    // 啟動gzip壓縮
    compress: true,
    // 端口號
    port: 9000,
    //啟動瀏覽器open
    open: true,
  },

package.json配置

"scripts": { 
    "dev": "webpack serve --config ./webpack.config.js" 
  },

運行命令:npm run dev
css兼容性處理
執(zhí)行安裝桦山,npm i postcss-loader postcss-preset-env -D
module

{ 
        test: /\.css$/, 
        use: [ 
          "css-loader", 
          {
            loader: "postcss-loader", 
            options: {
              postcssOptions: {
                // postcss的插件
                plugins:[require("postcss-preset-env")],
              },
            },
          },
        ],
      }

package.json配置
development//表示開發(fā)環(huán)境
production//表示生產(chǎn)環(huán)境

"browserslist": {
    "development": [
      "last 3 chrome version",
      "last 3 firefox version",
      "last 3 safari version"
    ],
    "production": [
      ">0.02%",
      "not dead",
      "not op_mini all"
    ]
  }

在css中編輯

h{
  display: flex; 
  transform:rotate(10deg)
}

編譯后

h{
display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: flex;
-webkit-transform:rotate(10deg);
-moz-transform:rotate(10deg);
 transform:rotate(10deg)
}

css壓縮
安裝:npm i css-minimizer-webpack-plugin -D
webpack.config頭部引入
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
plugins: 中添加
new CssMinimizerPlugin()
html壓縮

plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      // 壓縮html代碼
      minify: {
        // 移除空格
        collapseWhitespace: true,
        // 移除注釋
        removeComments: true
      }
    })
  ],

更多配置看官方文檔:https://github.com/jantimon/html-webpack-plugin#options

js壓縮
只需要講mode模式調(diào)整成production模式
如:mode: "production"

js語法檢查
執(zhí)行:npm i eslint eslint-webpack-plugin -D
https://webpack.docschina.org/plugins/eslint-webpack-plugin/#fix
webpack.config引入
const ESLintPlugin = require("eslint-webpack-plugin");
plugins中配置

new ESLintPlugin({
      extensions: ["js"],
      //context: resolve("src"),
      exclude: "/node_modules",
       // 自動修復eslint的錯誤
      fix: true
    })

其檢查規(guī)范配置借鑒大眾認可的,airbnb插件
運行:npm i eslint-config-airbnb-base eslint-plugin-import -D
airbnb-base:https://www.npmjs.com/package/eslint-config-airbnb-base
然后再package.json中配置:

"eslintConfig":{
    "extends":"airbnb-base"证薇,
    "env": {
          "browser": true // 支持瀏覽器端全局變量
    }
}

js兼容性處理
下載:npm i babel-loader @babel/core @babel/preset-env -D
https://webpack.docschina.org/loaders/babel-loader/
1
全部js兼容性處理:npm i @babel/polyfill -D
module中配置:

      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: { 
          presets: ['@babel/preset-env' ]
        }
      }

兼容的js?

import '@babel/polyfill'; //js文件中引入
const add = (x, y) => {
  return x + y;
};
console.log(add(8, 8));

2
按需加載:npm i core-js -D
module中配置:

{
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: { 
          presets: [
            [
              '@babel/preset-env',
              {
                // 按需加載
                useBuiltIns: 'usage',
                // 指定core-js版本
                corejs: {
                  version: 3
                },
                // 指定兼容性做到哪個版本瀏覽器
                targets: {
                  chrome: '60',
                  firefox: '60',
                  ie: '9',
                  safari: '10',
                  edge: '17'
                }
              }
            ]
          ]
        }
      }

devtool source map構(gòu)建代碼出錯提示
https://webpack.docschina.org/configuration/devtool/#devtool

module.exports = {
//source-map,eval-source-map提示具體部位錯誤
devtool: 'eval-source-map',
}

tree shaking:去除無用代碼
https://webpack.docschina.org/guides/tree-shaking/

  1. 必須使用ES6模塊化 2) 開啟production環(huán)境
    作用: 減少代碼體積
    "sideEffects": false 所有代碼都沒有副作用都可以進行tree shaking
    問題:可能會把css / @babel/polyfill (副作用)文件干掉
    "sideEffects": [".css", ".less"]
    \color{red}{注意:}如有測試console.log沒有被調(diào)用到的方法等度苔,會被去除
    在package.json中配置
"sideEffects": [
    "*.css"
  ]

clean-webpack-plugin
npm i clean-webpack-plugin -D
https://www.npmjs.com/package/clean-webpack-plugin
它的作用就是每次打包的時候,都會把 dist 目錄清空浑度,防止文件變動后寇窑,還有殘留一些老的文件,以及避免一些緩存問題
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

plugins: [
    new CleanWebpackPlugin()
]

生成文件目錄清空2
output設置箩张,同理清空

output: {
    clean: true, // 在生成文件之前清空 output 目錄
  },

webpack-merge合并兩個配置文件
npm i webpack-merge -D
1)創(chuàng)建webpack.base.config
2)在webpack.dist.prod.config文件中引入下面代碼
const {merge} = require("webpack-merge");
const webpackBaseConfig = require("./webpack.base.config.js");
合并
const prodConfig={...}
module.exports = merge(webpackBaseConfig,prodConfig);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甩骏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子先慷,更是在濱河造成了極大的恐慌饮笛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件论熙,死亡現(xiàn)場離奇詭異福青,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門无午,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒役,“玉大人,你說我怎么就攤上這事宪迟『ㄖ裕” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵次泽,是天一觀的道長穿仪。 經(jīng)常有香客問我,道長意荤,這世上最難降的妖魔是什么啊片? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮袭异,結(jié)果婚禮上钠龙,老公的妹妹穿的比我還像新娘。我一直安慰自己御铃,他們只是感情好碴里,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著上真,像睡著了一般咬腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睡互,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天根竿,我揣著相機與錄音,去河邊找鬼就珠。 笑死寇壳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的妻怎。 我是一名探鬼主播壳炎,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逼侦!你這毒婦竟也來了匿辩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤榛丢,失蹤者是張志新(化名)和其女友劉穎铲球,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晰赞,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡稼病,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年选侨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯饵。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侵俗,死狀恐怖锨用,靈堂內(nèi)的尸體忽然破棺而出丰刊,到底是詐尸還是另有隱情,我是刑警寧澤增拥,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布啄巧,位于F島的核電站,受9級特大地震影響掌栅,放射性物質(zhì)發(fā)生泄漏秩仆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一猾封、第九天 我趴在偏房一處隱蔽的房頂上張望澄耍。 院中可真熱鬧,春花似錦晌缘、人聲如沸齐莲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽选酗。三九已至,卻和暖如春岳枷,著一層夾襖步出監(jiān)牢的瞬間芒填,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工空繁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殿衰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓盛泡,卻偏偏與公主長得像闷祥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饭于,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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