• webpack02----提取css文件成单独文件、css兼容性处理、压缩css、js语法检查、js兼容性处理、js压缩、html压缩、webpack生成环境基本配置


    提取css文件成单独文件:

    1、下载插件:npm install mini-css-extract-plugin -D 

    2、使用插件:webpack.config.js

      ①module中使用loader时用 MiniCssExtractPlugin.loader 替代 style-loader

      ②plugins中实例化时重命名:new MiniCssExtractPlugin({ filename: 'css/built.css' })

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: [
              // 'style-loader', // 创建style标签,将样式放入
              MiniCssExtractPlugin.loader, // 这个loader取代style-loader。作用:提取js中的css成单独文件
              'css-loader' // 将css文件整合到js文件中
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({ template: './src/index.html' }),
        new MiniCssExtractPlugin({ filename: 'css/built.css' })
      ],
      mode: 'development',
      devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        port: 3000,
        open: true
      }
    }

    3、mini-css-extract-plugin插件会将css文件打包成一个css文件:

    css兼容性处理:

    1、下载插件:npm i postcss-loader@3.0.0 postcss-preset-env -D

    2、package.json中添加:

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

    3、webpack.config.js:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    // process.env.NODE_ENV = 'development' // 设置nodejs环境变量
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: [
              MiniCssExtractPlugin.loader,
              'css-loader',
              {
                loader: 'postcss-loader', // 如果只是使用该loader,不对该loader进行配置可以简写为 'postcss-loader'
                options: {
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-preset-env')() // postcss的插件帮postcss-loader找到package.json中browserlist里面的配置,通过配置加载指定的css兼容样式
                  ]
                }
              }
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({ template: './src/index.html' }),
        new MiniCssExtractPlugin({ filename: 'css/built.css' })
      ],
      mode: 'development',
      devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        port: 3000,
        open: true
      }
    }

    压缩css:

    1、下载插件:npm i optimize-css-assets-webpack-plugin -D

    2、webpack.config.js:

    const { resolve } = 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 = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: [
              MiniCssExtractPlugin.loader,
              'css-loader',
              {
                loader: 'postcss-loader',
                options: {
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-preset-env')()
                  ]
                }
              }
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({ template: './src/index.html' }),
        new MiniCssExtractPlugin({ filename: 'css/built.css' }),
        new OptimizeCssAssetsWebpackPlugin() // 压缩css
      ],
      mode: 'development',
      devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        port: 3000,
        open: true
      }
    }

    js语法检查:

    1、下载插件:npm i eslint-config-airbnb-base  eslint-plugin-import eslint eslint-loader -D

    2、package.json中添加:

      "eslintConfig": {
        "extends": "airbnb-base",
        "env": {
          "browser": true
        }
      }

    3、webpack.config.js:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.js$/,
            exclude: /node_modules/, // 只检查自己写的代码,不检查第三方库
            loader: 'eslint-loader', // 需要下载eslint-loader eslint 前者基于后者   使用airbnb规则,需要下载eslint-config-airbnb-base  eslint-plugin-import eslint
            options: {
              fix: true // 自动修复eslint的错误
            }
          }
        ]
      },
      plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
      mode: 'development'
    }

    js兼容性处理:

    1、下载插件:npm i babel-loader @babel/core @babel/preset-env @babel/polyfill core-js -D

    2、src/js/index.js:

    import '@babel/polyfill' // 2、全部js兼容处理:当只需解决部分兼容性问题时,它会将所有的兼容性代码全部引入,造成体积太大
    /* add函数只需要用到js基本兼容处理 */
    const add = (a, b) => {
      return a + b
    }
    
    console.log(add(3, 4))
    
    /* promise函数需要用到js全部兼容处理或按需加载处理 */
    const promise = new Promise((resolve) => {
      setTimeout(() => {
        console.log('定时器执行完毕')
        resolve()
      }, 1000)
    })
    
    console.log(promise)

    3、webpack.config.js:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            options: {
              // 指示babel做怎样的兼容性处理
              presets: [
                [
                  '@babel/preset-env', // 1、基本js兼容性处理:只能转换基本语法,箭头函数,const等;不能转换promise等语法
                  // 3、按需加载:core-js
                  {
                    useBuiltIns: 'usage', // 按需加载
                    corejs: { version: 3 }, // 指定core-js版本
                    // 指定兼容性做到哪个版本浏览器
                    targets: {
                      chrome: '60',
                      firefox: '60',
                      ie: '9',
                      safari: '10',
                      edge: '17'
                    }
                  }
                ]
              ]
            }
          }
        ]
      },
      plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
      mode: 'development'
    }

    注意:

      1、一般的箭头函数和const语法等,由 @babel/preser-env 处理

      2、promise需要用 @babel/polyfill 或者 core-js 处理

      3、@babel/polyfill 的问题是不是所有清空都需要用到全部的兼容性代码,容易造成体积过大,core-js 按需加载在解决promise等高级语法的同时体积小

      4、@babel/polyfill 的使用是在src/js/index.js中:import ‘@babel/polyfill’,当使用core-js时需要将这句话注释掉

    js压缩:

        mode: 'production' // 生成环境下自动压缩js代码,启用UglifyJsPlugin插件

    html压缩:

        new HtmlWebpackPlugin({
          template: './src/index.html',
          minify: {
            collapseWhitespace: true, // 折叠空白
            removeComments: true // 移除注释
          }
        })

    webpack生成环境基本配置:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 提取css成单独文件
    const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin') // 压缩css
    
    process.env.NODE_ENV = 'production' // browserslist默认使用生产环境配置,这里可以手动修改为开发环境配置
    
    // 复用loader
    const commonCssLoader = [
      MiniCssExtractPlugin.loader,
      'css-loader',
      {
        loader: 'postcss-loader', // 需要在package.json中定义browserslist
        options: {
          ident: 'postcss',
          plugins: () => [require('postcss-preset-env')()]
        }
      }
    ]
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: [...commonCssLoader]
          },
          {
            test: /.less$/,
            use: [...commonCssLoader, 'less-loader'] // 执行过程:less-loader将less文件编译成css文件,postcss-loader对css做兼容性处理,css-loader将css加载到js中,MiniCssExtractPlugin.loader提取css为单独文件
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            enforce: 'pre', // 一般情况下,一个文件只能被一个loader处理,当一个文件需要被多个loader处理,需要指定loader的先后顺序:先执行eslint再执行babel    原因:eslint语法检查错误后面的事再去做就没有意义;babel是将es6转为es5,如果先执行eslint,转化后的var会被eslint报错
            loader: 'eslint-loader', // 在package.json中定义eslintConfig
            options: { fix: true } // 自动修复eslint的错误
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            options: {
              presets: [
                [
                  '@babel/preset-env',
                  {
                    useBuiltIns: 'usage', // 按需加载
                    corejs: { version: 3 },
                    targets: {
                      chrome: '60',
                      firefox: '60',
                      ie: '9',
                      safari: '10',
                      edge: '17'
                    }
                  }
                ]
              ]
            }
          },
          {
            test: /.(jpg|png|gif)$/,
            loader: 'url-loader',
            options: {
              limit: 6 * 1024,
              esModule: false,
              outputPath: 'images',
              name: '[hash:10].[ext]'
            }
          },
          {
            test: /.html$/,
            loader: 'html-loader' // 处理html中的img,需要关闭ES6的模块化 esModule: false
          },
          {
            exclude: /.(js|css|less|html|jpg|png|jif)$/,
            loader: 'file-loader',
            options: { outputPath: 'media' }
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({
          template: './src/index.html',
          minify: {
            collapseWhitespace: true,
            removeComments: true
          }
        }),
        new MiniCssExtractPlugin({ filename: 'css/built.css' }), // 提取css成单独文件
        new OptimizeCssAssetsWebpackPlugin() // 压缩css
      ],
      mode: 'production', // 生成模式下js自动压缩devServer:
      devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        // port: 3000,
        open: true
      }
    }

      package.json:

    {
      "name": "webpack01",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "@babel/core": "^7.12.3",
        "@babel/polyfill": "^7.12.1",
        "@babel/preset-env": "^7.12.1",
        "babel-loader": "^8.2.1",
        "core-js": "^3.7.0",
        "css-loader": "^3.4.2",
        "eslint": "^7.13.0",
        "eslint-config-airbnb-base": "^14.2.1",
        "eslint-loader": "^4.0.2",
        "eslint-plugin-import": "^2.22.1",
        "file-loader": "^6.2.0",
        "html-loader": "^1.3.2",
        "html-webpack-plugin": "^4.5.0",
        "less": "^3.12.2",
        "less-loader": "^7.0.2",
        "mini-css-extract-plugin": "^1.3.0",
        "optimize-css-assets-webpack-plugin": "^5.0.4",
        "postcss-loader": "^3.0.0",
        "postcss-preset-env": "^6.7.0",
        "style-loader": "^2.0.0",
        "url-loader": "^4.1.1",
        "webpack": "^4.41.6",
        "webpack-cli": "^3.3.11",
        "webpack-dev-server": "^3.11.0"
      },
      "dependencies": {},
      "browserslist": {
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ],
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ]
      },
      "eslintConfig": {
        "extends": "airbnb-base",
        "env": {
          "browser": true
        }
      }
    }

    x

  • 相关阅读:
    POJ训练计划1035_Spell checker(串处理/暴力)
    软考-数据库与标准化和知识产权
    分析Cocos2d-x横版ACT手游源码 1、公共
    增强版的RecycleViewAdapter,能够直接使用
    高考志愿,你们想好怎么填了吗?
    win32收不到F10按键消息解决的方法
    Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
    九度OJ #1437 To Fill or Not to Fil
    SQL数据分组后取最大值或者取前几个值(依照某一列排序)
    3.5星|《硅谷产品》:Facebook网红社区产品经理经验谈
  • 原文地址:https://www.cnblogs.com/wuqilang/p/13949676.html
Copyright © 2020-2023  润新知