[关闭]
@Dale-Lin 2022-08-03T21:37:33.000000Z 字数 1669 阅读 312

webpack-merge

webpack5


webpack-merge 提供了一个合并数组/对象的 merge 函数,如果数组/对象的合并过程中遇到了函数,那么会先执行这个函数得到结果,再用一个函数包裹这个执行结果。

merge(...configuration | [...configuration])

merge 是最常用的 API,提供了拆分 webpack 配置的工具:

  1. // webpack.base.js
  2. const path = require('path')
  3. module.exports = {
  4. output: {
  5. path: path.join(__dirname, "./dist"),
  6. },
  7. resolve: {
  8. extensions: [".jsx", ".js"]
  9. },
  10. module: {
  11. rules: [
  12. {
  13. test: /\.jsx$/,
  14. loader: "babel-loader",
  15. options: {
  16. presets: ["@babel/preset-react"]
  17. }
  18. }
  19. ]
  20. }
  21. }
  1. // webpack.client.js
  2. const Merge = require("webpack-merge")
  3. const path = require("path")
  4. const HTMLWebpackPlugin = require("html-webpack-plugin")
  5. const MiniCssExtractPlugin = require("mini-css-extract-plugin")
  6. const { WebpackManifestPlugin } = require("webpack-manifest-plugin")
  7. const base = require("./webpack.base")
  8. module.exports = Merge.merge(base, {
  9. entry: {
  10. // 入口指向 entry-client.js
  11. client: path.join(__dirname, "./src/entry-client.js")
  12. },
  13. output: {
  14. filename: 'public/index.js',
  15. publicPath: "public/"
  16. },
  17. module: {
  18. rules: [{
  19. test: /\.css$/,
  20. use: [MiniCssExtractPlugin.loader, "css-loader"]
  21. }]
  22. },
  23. plugins: [
  24. // 使用 webpack-manifest-plugin 记录产物清单
  25. // 方便在 `serve.js` 中使用
  26. new WebpackManifestPlugin({
  27. fileName: "manifest-client.json"
  28. }),
  29. new MiniCssExtractPlugin({
  30. filename: 'public/index.[contenthash].css'
  31. }),
  32. new HTMLWebpackPlugin({
  33. template: 'public/index.html'
  34. })
  35. ]
  36. })

unique(<configField>, <uniqueField>, uniqueField => uniqueField)

unique 是在配置中强制唯一性的策略,在 plugin 合并时有用:

configField 表示配置项的属性;
uniqueField 表示查找的重复项;
uniqueField => uniqueField 表示判断重复项时应该唯一的值

  1. const { mergeWithCustomize, unique } = require("webpack-merge")
  2. const output = mergeWithCustomize({
  3. customizeArray: unique(
  4. "plugins",
  5. ["HotModuleReplacementPlugin"],
  6. (p) => p.constructor && p.constructor.name
  7. )
  8. })(
  9. {
  10. plugins: [new webpack.HotModuleReplacementPlugin()],
  11. },
  12. {
  13. plugins: [new webpack.HotModuleReplacementPlugin()]
  14. }
  15. )
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注