Skip to content

Ant-design-vue 优化icons 包体积

之前antd-vue 引入了全量icons, 优化没成功,可能是版本问题,记录下,需要创建一个文件导出对应使用的icon,然后在webpack配置里面加个alias,体积较小200多K。

antd-icons.js:需要注意不同的类型图标目录和名称不一样哈,fill outline……, 有些组件自带图标的也需要引入,比如message的成功失败告警灯图标,可以看node_modules里面查看具体导出的模块名称,查看未知图标,页面审查看class名称

javascript
export { default as PaperClipOutline } from "@ant-design/icons/lib/outline/PaperClipOutline";
export { default as DeleteOutline } from "@ant-design/icons/lib/outline/DeleteOutline";

export { default as CheckCircleFill } from "@ant-design/icons/lib/fill/CheckCircleFill";
export { default as InfoCircleFill } from "@ant-design/icons/lib/fill/InfoCircleFill";
export { default as ExclamationCircleFill } from "@ant-design/icons/lib/fill/ExclamationCircleFill";
export { default as CloseCircleFill } from "@ant-design/icons/lib/fill/CloseCircleFill";export { default as PaperClipOutline } from "@ant-design/icons/lib/outline/PaperClipOutline";
export { default as DeleteOutline } from "@ant-design/icons/lib/outline/DeleteOutline";

export { default as CheckCircleFill } from "@ant-design/icons/lib/fill/CheckCircleFill";
export { default as InfoCircleFill } from "@ant-design/icons/lib/fill/InfoCircleFill";
export { default as ExclamationCircleFill } from "@ant-design/icons/lib/fill/ExclamationCircleFill";
export { default as CloseCircleFill } from "@ant-design/icons/lib/fill/CloseCircleFill";

vue.config.js 配置片段,文章末尾是全部配置:

javascript
alias: {
        "@ant-design/icons/lib/dist$": resolve("./src/util/antd-icons.js"), //解决官方包icons 全量引入
},

开发环境:

╰─$ node -v

v14.16.0

╰─$ npm -v

6.14.11

脚手架:@vue/cli 4.5.11

ant-design-vue 版本

╰─$ yarn list | grep ant

├─ @ant-design/colors@3.2.2

├─ @ant-design/icons-vue@2.0.0

│ ├─ @ant-design/colors@^3.1.0

├─ @ant-design/icons@2.1.1

├─ ant-design-vue@1.7.4

│ ├─ @ant-design/icons-vue@^2.0.0

│ ├─ @ant-design/icons@^2.1.1

│ ├─ http-cache-semantics@3.8.1

javascript
//https://cli.vuejs.org/zh/config/
const resolve = (dir) => require("path").join(__dirname, dir);
const CompressionWebpackPlugin = require("compression-webpack-plugin"); //版本5.0.1 下面写法高版本不支持
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg|png)(\?.*)?$/i;
const webpack = require("webpack");

module.exports = {
  // Project deployment base
  // By default we assume your app will be deployed at the root of a domain,
  // e.g. https://www.my-app.com/
  // If your app is deployed at a sub-path, you will need to specify that
  // sub-path here. For example, if your app is deployed at
  // https://www.foobar.com/my-app/
  // then change this to '/my-app/'
  publicPath: "/judge-app/",

  // where to output built files
  outputDir: "judge-build", //"dist", //
  lintOnSave: "warning",
  productionSourceMap: false,
  configureWebpack: {
    plugins: [
      new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn/), //减小moment语言包体积
    ],
    resolve: {
      alias: {
        "@ant-design/icons/lib/dist$": resolve("./src/util/antd-icons.js"), //解决官方包icons 全量引入
      },
    },
  },
  chainWebpack: (config) => {
    // config.resolve.alias.set("_css_", resolve("src/assets/css")); //test 设置别名

    config.plugin("html").tap((args) => {
      args[0].title = "NTI - 威胁研判平台";
      return args;
    });
    // 开发环境不需要gzip 等
    if (process.env.NODE_ENV === "production") {
      config.plugin("CompressionWebpackPlugin").use(
        new CompressionWebpackPlugin({
          // filename: '[path].gz[query]',
          algorithm: "gzip",
          test: productionGzipExtensions,
          threshold: 1024,
          // minRatio: 0.8,
          // deleteOriginalAssets: true  //需要保留原文件
        })
      );
      config.module
        .rule("images")
        .test(/\.(png|jpe?g|gif)(\?.*)?$/) //TODO: svg 有点问题
        .use("image-webpack-loader")
        .loader("image-webpack-loader")
        .options({
          bypassOnDebug: true,
        })
        .end();
    }
  },
  css: {
    loaderOptions: {
      // 给 sass-loader 传递选项
      //   sass: {
      //     // @/ 是 src/ 的别名
      //     // 所以这里假设你有 `src/variables.sass` 这个文件
      //     data: `@import "~@/variables.sass"`
      //   },
      //   // 默认情况下 `sass` 选项会同时对 `sass` 和 `scss` 语法同时生效
      //   // 因为 `scss` 语法在内部也是由 sass-loader 处理的
      //   // 但是在配置 `data` 选项的时候
      //   // `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号
      //   // 在这种情况下,我们可以使用 `scss` 选项,对 `scss` 语法进行单独配置
      //   scss: {
      //     data: `@import "~@/variables.scss";`
      //   },
      //   // 给 less-loader 传递 Less.js 相关选项
      less: {
        // http://lesscss.org/usage/#less-options-strict-units `Global Variables`
        // `primary` is global variables fields name
        globalVars: {
          hack: `true; @import '~@/assets/css/var.less';`,
        },
        modifyVars: {
          // hack: `true; @import '~@/assets/css/var.less';`,
          // "primary-color": "#55A722",
          // "success-color": "#68B92E",
          // "warning-color": "#F59F00",
          // "error-color": "#F52222",
          // "info-color": "#0A88FF",
          // "primary-5": "#68B92E",
          // "item-active-bg": "rgba(85,167,34,.10)", //覆盖计算的primary-color值
          // "item-hover-bg": "rgba(85,167,34,.10)",
          // "table-row-hover-bg": "rgba(85,167,34,.10)",
          // "link-color": "#0072ee",
          // "link-hover-color": "#0A88FF",
          // "link-active-color": "#0056FF",
          // "btn-danger-color": "#fff",
          // "btn-danger-bg": "#ff524d", // color(~`colorPalette('"{error-color}', 5) `)
          // "btn-danger-border": "#ff524d", // color(~`colorPalette('"{error-color}', 5) `)
          // "layout-header-background": "#26303A", //导航颜色
          // "table-header-bg": "#F5F5F5",
          // // "card-actions-background"   : "#F7F9FA",
          // "modal-mask-bg": "rgba(0, 0, 0, 0.45)",
          // "font-family":
          //   "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB','Microsoft YaHei', 'Helvetica Neue',Helvetica, Arial, sans-serif,  'Segoe UI Symbol'",
        },
        javascriptEnabled: true,
      },
    },
  },
  devServer: {
    open: process.platform === "darwin",
    host: "0.0.0.0",
    port: 3666, //前端开发启动的端口
    https: false,
    hotOnly: false,
    // See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#configuring-proxy
    proxy: {
      "/api": {
        target: "http://10.24.20.27:8003", //"http://10.24.20.32:8004", //"http://10.24.20.27:8004", //后台API地址

        changeOrigin: true,
      },
    }, // string | Object
    before: (app) => {},
  },
};