js---webpack

127 阅读2分钟

/**
 * 准备工作 
 *  全局安装 npm i webpack@4.46.0  webpack-cli -g
 *  开发依赖 npm i webpack@4.46.0  webpack-cli -D
 */

/**
 * css  css-loader@3.4.0   style-loader@1.1.1
 * 1. MiniCssExtractPlugin将css从js中剥离出成单独的css文件,由之前的style变成link引入样式(mini-css-extract-plugin@1.0.0)
 * 2. css兼容性处理(postcss-loader@3.0.0  postcss-preset-env@6.7.0读取package.json中 browserslist 配置)
 * 3. 压缩css(optimize-css-assets-webpack-plugin@5.0.3)
 */

/**
 * less
 * less@2.7.3  less-loader@5.0.0   css-loader@3.4.0   style-loader@1.1.1
 */

/**
 * js
 * 1.语法检查( eslint@6.8.0  eslint-loader@3.0.3  eslint-config-airbnb-base@14.2.1  eslint-plugin-import@2.24.0)(eslintConfig:{extend:airbnb-base})
 * 2.js兼容性处理(babel-loader@8.0.6  @babel/core@7.15.0  @babel/preset-env@7.0.0  core-js@2.6.12)
 * 3.压缩 mode: 'production', 会自动压缩js
 */

/**
 * html html-webpack-plugin@3.2.0
 * 压缩
 * collapseWhitespace:true,
 * removeComments:true   
 */

/**
 * 处理css中图片
 * url-loader@4.1.1   file-loader@5.0.2
 */

 /**
  * html中的图片img
  * html-loader@0.5.5
  */

/**
 * 处理 非图片 非html  非js  非css文件 如字体文件等
 * file-loader@5.0.2
 */

//设置nodejs环境变量
process.env.NODE_ENV = "development"
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/build.js',
    path: resolve(__dirname, "build")
  },
  module: {
    rules: [
      {
        test: /\.css/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              //设置css里面访问图片资源的前缀
              publicPath: '../'
            }

          },
          // 'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              ident: 'postcss',
              plugins: () => [
                require('postcss-preset-env')()
              ]
            }
          }
        ]
      },
      {
        test: /\.less/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              //设置css里面访问图片资源的前缀
              publicPath: '../'
            }

          },
          // 'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              ident: 'postcss',
              plugins: () => [
                require('postcss-preset-env')()
              ]
            }
          },
          'less-loader'
        ]
      },
      {
        test: /\.(jpeg|png|gif|jpg)$/,
        loader: 'url-loader',
        options: {
              // 小于1M才base64
              limit: 1 * 1024 * 1024,
              esModule: false,
              name: '[hash:6].[ext]',
              outputPath: 'imgs'
            }   
      },
      // 处理html中的img图片
      {
        test: /\.html$/,
        loader: 'html-loader'
      }
      ,
      //打包 排除js/png/css/less等其他资源
      {
        exclude: /\.(css|less|html|js|png|jpg|jpeg)$/,
        loader: 'file-loader',
        options: {
          name: '[hash:8].[ext]',
          outputPath: 'media'
        }
      },
      // 开启eslint校验
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        enforce: "pre",
        options: {
          // 自动修复
           fix:true
        }
      }
      ,
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
           presets:[
            //  '@babel/preset-env'
             ['@babel/preset-env',{
               useBuiltIns:'usage',
              //  corejs:{
              //    version:2
              //  },
               targets:{
                 chrome:'99'
               }
             }]
           ]
        }
      },
    ]
  },
  plugins: [
    new HtmlWebpackPlugin(
      { template: './src/index.html',
      minify:{
        //去掉空格和去掉注释
        collapseWhitespace:true,
        removeComments:true
      }
     }
    ),
    //剥离出成单独的css文件
    new MiniCssExtractPlugin(
      { filename: "css/[name].css" }
    ),
    //压缩css文件aaaaaaa
    new OptimizeCssAssetsWebpackPlugin()
  ],
  mode: 'development',
  // mode: 'production',
  //开发服务器:监视源文件变化自动编译  自动刷新浏览器  自动打开浏览器  内存中打包
  //启动devServer指令:webpack-dev-server    需要的包:npm i webpack-dev-server -g 
  devServer: {
    contentBase: resolve(__dirname, 'build'),
    compress: true,
    port: 3000,
    open: true
  }
}