天天看點

webpack5.x基本使用

webpack5.x基本使用

"webpack": "^5.46.0",

"webpack-cli": "^4.7.2",

下載下傳webpack的插件

  • npm i -D webpack webpack-cli

指令行

  • npx webpack
  • npx webpack --mode development(不寫配置情況下)
  • npx webpack 需要打包的檔案 -o 打包的檔案位置與名稱 --mode development(不寫配置情況下)

打包html

  • html-webpack-plugin
// 打包壓縮html(打包多個就執行個體化new多個)
    new htmlWebpackPlugin({
        template:'./src/index.html', //打包的檔案
        filename:'demo.html',     //打包後的名稱
        chunks:[],               //指定使用的js檔案
        minify:{                  //壓縮
            // 移除空格
            collapseWhitespace:true,
            // 移除注釋
            removeComments:true,
        }
    }),
           

打包css

  • npm i -D css-loader style-loader
/* 
        一個用    loader:css-loader
        一個以上  use:[]
        從右往左
    */
    {
        test: /\.css$/,
        use: [
            'style-loader',
            'css-loader']
    }
           

打包less或者sass

  • less npm i -D less-loader
{
    test: /\.less$/,
    use: [
        'style-loader',
        'css-loader',
        'less-loader'
    ]
}
           
  • sass npm i -D node-sass sass-loader
{
    test: /\.sass$/,
    use: [
        'style-loader',
        'css-loader',
        'sass-loader'
    ]
}
           

提取css為單獨檔案

  • npm i -D mini-css-extract-plugin
  • plugin

    new miniCssExtractPlugin({filename:'demo.css'})

  • loader

    {

    test: /.css$/,

    use: [

    miniCssExtractPlugin.loader,

    'css-loader']

    },

css3相容處理(變異成各個浏覽器支援的---字首--)

  • npm i -D postcss-loader postcss-preset-env
  1. package.json配置相容浏覽器
"browserslist": [
    ">0.2%",
    "last 2 version",
    "not dead"
  ]
           
  1. 建立檔案postcss.config.js
module.exports={
    plugins:[
     require('postcss-preset-env')()   
    ]
}
           
  1. 引入loader
{
    test: /\.css$/,
    use: [
        miniCssExtractPlugin.loader,
        'css-loader',
        'postcss-loader'
    ]
},
           

壓縮css

  • npm i -D optimize-css-assets-webpack-plugin

    new optimizeCssAssetsWebpackPlugin()

webpack打包圖檔資源

  • npm i -D url-loader file-loader
  1. 背景圖打包
{
    test: /\.(png|jpg|jpeg)$/,
    loader: 'url-loader',
    options: {
        publicPath:'./images/',
        outputPath: 'imgs/',
        name:'[name][hasg].[ext]',//命名hash+名稱
        limit:1024*8,//限制8k一下轉base64
    }
}
           
  1. html圖 html-loader
  • npm i -D html-loader
{
        test: /\.(html)$/,
        loader: 'html-loader',
    }
           
  1. 其他檔案打包
{
    // exclude 排查資源
    exclude:/\.(js|json|html|css|less|scss|png|jpg)$/,
    loader:'file-loader',
    options:{
        outputPath: 'font/', //打包位置
        publicPath:'./font', //尋找位置
        name:'[name][hasg].[ext]',//命名hash+名稱
    }
}
           

eslint代碼規範(airbnb)

  • npm i -D eslint-loader eslint eslint-config-airbnb-base eslint-plugin-import
  1. package.json
"eslintConfig":{
      "extends":"airbnb-base"
  }
           
  1. webpack.config.js
{
    test: /\.js$/,
    //隻檢查自己寫的代碼,不檢查第三方的
    exclude:/node_modules/,
    loader:'eslint-loader'
},
           

開發伺服器 devServer

  • npm i -D webpack-dev-server
  • 指令 npx webpack serve
// 在webpack5 需要加上這個選項才會自動重新整理頁面
target:"web"
           

配置devServer

devServer:{
        port:3001,
        compress:true,//自動更新
        open:true//自動打開浏覽器
    }
           

環境優化

開發環境

- 打包建構速度
- 優化代碼調試
           

生産優化(樹搖)

- 代碼運作性能
           

HMR子產品熱替換

devServer:{
    port:3001,
    compress:true,//自動更新
    open:true,//自動打開浏覽器
    hot:true//HMR子產品熱替換
}
           

樹搖去掉沒用到的js代碼

  • tree-shaking webpack自帶
  1. es6 導出
  2. 必須是production

css去掉無用的代嗎

  • npm i -D purgecss-webpack-plugin
new PurgecssWebpackPlugin({
    paths:glob.sync(pattern:`${PATH.src}/**/*`,options:{nodir:true})
})
           
// 采用commonjs
const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
const miniCssExtractPlugin = require('mini-css-extract-plugin')
const optimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
module.exports = {
    mode: 'production',                 //生産:development,開發:production
    /* 
    1、entry:
        1、單入口,字元串表示-----打包一個chunk,生成一個build
            entry:'./src/index.js',
        2、多入口,數組------打包成一個chunk,生成一個build
            entry:['./src/index.js','./src/cc.js'],
        3、對象的寫法  -----有幾個檔案生成幾個chunk,生成幾個build
            entry:{
                one:'./src/one.js',
                two:'./src/two.js'
            }
    */
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        // **對象多入口寫法entry: filename:'[name].js',
        path: path.resolve(__dirname, 'dist'),
    },
    // loader  處理非js資源   如html,css,img
    module: {
        rules: [
            /* 
                一個用    loader:css-loader
                一個以上  use:[]
                從右往左
                 {
                    test: /\.css$/,
                    use: [
                        'style-loader',
                        'css-loader']
                },
            */

            {
                test: /\.css$/,
                use: [
                    miniCssExtractPlugin.loader,
                    'css-loader',
                    'postcss-loader'
                ]
            },
            {
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {
                test: /\.sass$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg|jpeg)$/,
                loader: 'url-loader',
                options: {
                    publicPath:'./images/',
                    outputPath: 'imgs/',
                    name:'[name][hasg].[ext]',//命名hash+名稱
                    limit:1024*8,//限制8k一下轉base64
                }
            },
            {
                test: /\.(html)$/,
                loader: 'html-loader',
            },
            {
                // exclude 排查資源
                exclude:/\.(js|json|html|css|less|scss|png|jpg)$/,
                loader:'file-loader',
                options:{
                    outputPath: 'font/', //大包位置
                    publicPath:'./font', //尋找位置
                    name:'[name][hasg].[ext]',//命名hash+名稱
                   
                }
            },
            // eslint 隻檢查js
            {
                test: /\.js$/,
               //隻檢查自己寫的代碼,不檢查第三方的
               exclude:/node_modules/,
               loader:'eslint-loader',
               options:{
                   fix:true,//自動修複
               }
            },
        ]
    },
    // plugin插件,執行範圍更廣的任務  打包到開發壓縮
    plugins: [
        // 打包壓縮html(打包多個就執行個體化new多個)
        new htmlWebpackPlugin({
            template: './src/index.html', //打包的檔案
            filename: 'demo.html',     //打包後的名稱
            chunks: [],               //指定使用的js檔案
            minify: {                  //壓縮
                // 移除空格
                collapseWhitespace: true,
                // 移除注釋
                removeComments: true,
            }
        }),
        new miniCssExtractPlugin({ filename: 'demo.css' }),
        new optimizeCssAssetsWebpackPlugin()
    ],
    // 在webpack5 需要加上這個選項才會自動重新整理頁面
    target:"web",

    devServer:{
        port:3001,
        compress:true,//自動更新
        open:true,//自動打開浏覽器
        hot:true//HMR子產品熱替換
    }
}
           
module.exports={
    plugins:[
     require('postcss-preset-env')()   
    ]
}
           
{
  "name": "webpack5s",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"webpack serve --mode development --port 3000",
    "build":"webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "css-loader": "^6.2.0",
    "eslint": "^7.31.0",
    "eslint-config-airbnb-base": "^14.2.1",
    "eslint-loader": "^4.0.2",
    "eslint-plugin-import": "^2.23.4",
    "file-loader": "^6.2.0",
    "html-loader": "^2.1.2",
    "html-webpack-plugin": "^5.3.2",
    "less": "^4.1.1",
    "less-loader": "^10.0.1",
    "mini-css-extract-plugin": "^2.1.0",
    "optimize-css-assets-webpack-plugin": "^6.0.1",
    "post-loader": "^2.0.0",
    "postcss-loader": "^6.1.1",
    "postcss-preset-env": "^6.7.0",
    "style-loader": "^3.2.1",
    "url-loader": "^4.1.1",
    "webpack": "^5.46.0",
    "webpack-cli": "^4.7.2",
    "webpack-dev-server": "^3.11.2"
  },
  "browserslist": [
    ">0.2%",
    "last 2 version",
    "not dead"
  ],
  "eslintConfig": {
    "extends": "airbnb-base"
  }
}