webpack 5.0配置

345 阅读3分钟

webpack 5.0配置

1.webpack.common.js文件配置 公共配置 loader、plugin

前两天从webpack 2.0到webpack 5.0做了升级,简直要吐血,webpack 5.0配置简化了不少,loader文件规则配置参数位置有变化 image.png

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导入每次删除文件夹的插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

// 复用loader加载器
const commonCssLoader = [MiniCssExtractPlugin.loader];
module.exports = {
  // 入口文件 如果是./src/index.js 在webpack 4.0以后无需配置
  entry: './src/acc-ivr-sdk.js',
  // 出口文件 缺省为./dist/main.js 在webpack 4.0版本以后也无需配置
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: 'accIvrSdk.min.js',
    libraryTarget: 'umd',
    library: 'Menu',
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [...commonCssLoader, 'css-loader'],
      },
      {
        test: /\.less$/,
        include: [
          path.resolve(__dirname, '../src/routes'),
          path.resolve(__dirname, '../src/components'),
        ],
        // commonCssLoader与style-loader冲突,两者不能同时使用
        use: [
          ...commonCssLoader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
              modules: {
                // 与babel-plugin-react-css-modules generateScopedName路径保持一致
                localIdentName: '[path]___[name]__[local]___[hash:base64:5]',
              },
            },
          },
          'postcss-loader',
          'less-loader',
        ],
      },
      {
        test: /\.less$/,
        include: [path.resolve(__dirname, '../src/styles')],
        use: [...commonCssLoader, 'css-loader!less-loader?modules'],
      },
      {
        test: /\.scss$/,
        use: [
          ...commonCssLoader,
          'css-loader!sass-loader!@ali/next-theme-loader?theme=@alife/dpl-cdnext',
        ],
      },
      {
        // js|jsx代码兼容性处理
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        loader: 'babel-loader', // 7.4.0版本以后需要安装core-js依赖
        options: {
          plugins: ['lodash'], // lodash 按需加载
          presets: [
            [
              '@babel/preset-env', //基础预设
              {
                useBuiltIns: 'usage', // 按需加载
                corejs: {
                  version: 3,
                },
                targets: {
                  // 兼容到什么版本到浏览器
                  chrome: '60',
                  firefox: '50',
                  ie: '9',
                  safari: '10',
                  edge: '17',
                },
              },
            ],
          ],
        },
      },
      {
        test: /\.(png|gif|bmp|jpg|svg)$/,
        include: path.resolve(__dirname, '../src/styles/images/commons'),
        use: {
          loader: 'url-loader',
          options: {
            limit: 8 * 1024,
            // 图片取10位hash和文件扩展名
            name: '[hash:10].[ext]',
            // 关闭es6模块化
            esModule: false,
          },
        },
      },
    ],
  },
  plugins: [
    // css代码单独抽离
    new MiniCssExtractPlugin({
      filename: 'main.min.css',
    }),
    // css代码压缩
    new OptimizeCssAssetsWebpackPlugin(),
    // html文件压缩
    new HtmlWebpackPlugin({
      template: './src/index.html',
      minify: {
        // 移除空格
        collapseWhitespace: true,
        // 移除注释
        removeComments: true,
      },
    }),
    // 在每次生成dist文件前先删除,保证最新
    new CleanWebpackPlugin(),
    // lodash按需加载
    new LodashModuleReplacementPlugin(),
    // 按需加载monet语言环境
    new MomentLocalesPlugin({
      localesToKeep: ['es-us'],
    }),
  ],
  resolve: {
    extensions: ['.js', '.jsx', '.json'],
    alias: {
      // 取别名,相对路径
      Components: path.resolve(__dirname, '../src/components'),
      Models: path.resolve(__dirname, '../src/models'),
      Routes: path.resolve(__dirname, '../src/routes'),
      Utils: path.resolve(__dirname, '../src/utils'),
      Styles: path.resolve(__dirname, '../src/styles'),
      Config: path.resolve(__dirname, '../config'),
    },
  },
};

2.webpack.dev.js配置 本地环境

const webpackMerge = require('webpack-merge').merge;
const path = require('path');
const common = require('./webpack.common.js');

const devServerWebpack = webpackMerge(common, {
  /*
  webpack团队引入了一个叫做mode的配置属性来实现零配置(#oCJS)的模块打包。
  mode可以设置为如下值:development和production。开箱即用,默认为production。

  production选项提供了一系列默认配置,它可以:
  更小的输出尺寸
  运行时的快速加载代码
  省略只在开发时的代码
  不暴露源代码或者路径
  快捷使用输出assets

  development选项提供了一下默认配置,它可以:
  浏览器内调试更好的工具
  在一个快速的开发周期,更快的增量编译
  更好的运行时错误提示 
  */

  mode: 'development',
  watch: true,
  watchOptions: {
    ignored: /node_modules/,
  },
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: 'accIvrSdk.js',
    libraryTarget: 'umd',
    library: 'Menu',
  },
  devServer: {
    contentBase: path.join(__dirname, '../dist'),
    compress: true,
    port: 9000,
    hot: true,
    open: true,
  },
});
module.exports = devServerWebpack;

3.webpack.prod.js配置 线上环境

const webpackMerge = require('webpack-merge').merge;
const path = require('path');
const common = require('./webpack.common.js');

module.exports = webpackMerge(common, {
  mode: 'production',
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: 'accIvrSdk.min.js',
    libraryTarget: 'umd',
    library: 'Menu',
  },
});

4.babel.config.js bebel配置

配置在根目录下

/* .babelrc 和 babel.config.js啥区别呢 
.babelrc是作用于项目中的某个部分,而babel.config.js是作用于全局的 
https://www.babeljs.cn/docs/configuration */

const genericNames = require('generic-names'); // v3.0.0
const CSS_MODULE_LOCAL_IDENT_NAME =
  '[path]___[name]__[local]___[hash:base64:5]';

module.exports = {
  presets: [
    '@babel/preset-env', // 转化最新语法
    '@babel/preset-react',
  ],
  plugins: [
    [
      // 如果不使用该模块 使用less样式需要className={style.container} 使用该模块以后可以简化为styleName的写法  https://zhuanlan.zhihu.com/p/34748443
      'babel-plugin-react-css-modules',
      {
        exclude: 'node_modules',
        // 必须保持和 css-modules 的 localIdentName 一致的命名
        // https://github.com/gajus/babel-plugin-react-css-modules/issues/291
        // generic-names 用于解决 css-loader v4 hash 的兼容
        // less loader里面配置路径规则一致,没有用genericNames 导致main.min.css 文件和dom生成的css hash不一致问题
        generateScopedName: genericNames(CSS_MODULE_LOCAL_IDENT_NAME),
        filetypes: {
          '.less': {
            syntax: 'postcss-less',
          },
        },
      },
    ],
    '@babel/plugin-transform-runtime', // 运行时引入 generators/async、babel-runtime/core-js(ES6->includes....)不会污染全局环境。
    [
      '@babel/plugin-proposal-decorators',
      {
        legacy: true,
      },
    ],
    [
      '@babel/plugin-proposal-class-properties',
      {
        loose: true,
      },
    ],
    ['@babel/plugin-proposal-private-methods', { loose: true }],
  ],
};

5.package.json 配置

"scripts": {
    "build-sdk-def": "webpack server --config=./webpack/webpack.dev.js --progress",
    "build-sdk-min-def": "webpack --config=./webpack/webpack.prod.js --progress",
},
"devDependencies": {
    "@babel/core": "^7.14.6",
    "@babel/plugin-proposal-class-properties": "^7.14.5",
    "@babel/plugin-proposal-decorators": "^7.14.5",
    "@babel/plugin-transform-runtime": "^7.14.5",
    "@babel/preset-env": "^7.14.7",
    "@babel/preset-react": "^7.14.5",
    "autoprefixer": "^7.1.2",
    "babel-loader": "^8.2.2",
    "babel-plugin-lodash": "^3.3.4",
    "clean-webpack-plugin": "^4.0.0-alpha.0",
    "core-js": "^3.15.2",
    "cross-env": "^7.0.3",
    "css-loader": "^5.2.6",
    "extract-text-webpack-plugin": "^2.1.0",
    "generic-names": "^3.0.0",
    "html-webpack-plugin": "^5.3.2",
    "less": "^4.1.1",
    "less-loader": "^10.0.0",
    "lodash-webpack-plugin": "^0.11.6",
    "mini-css-extract-plugin": "^1.6.2",
    "moment-locales-webpack-plugin": "^1.2.0",
    "optimize-css-assets-webpack-plugin": "^6.0.1",
    "postcss": "^6.0.1",
    "postcss-less": "^4.0.1",
    "postcss-loader": "^6.1.0",
    "style-loader": "^3.0.0",
    "url-loader": "^4.1.0",
    "webpack": "^5.41.1",
    "webpack-bundle-analyzer": "^4.4.2",
    "webpack-cli": "^4.7.2",
    "webpack-dev-server": "^3.11.2",
    "webpack-merge": "^5.8.0"
}