element-ui 更改主题

491 阅读1分钟

由于使用组件库大部分情况下跟自己的项目主题风格不一致, 所以需要更改 element 主题, 如果都用 deep 深度选择器会消耗大量时间精力, 看着一堆堆的 deep 是在让人头大, 并且有些组件的样式难以修改, elementUi提供了修改主题功能, 因此可以从容的摸鱼拉

首先在官网进行主题定制, 并下载

image.png

项目中使用了scss 可以采用变量覆盖

  1. 创建一个scss文件 这里以 element-variables.scss 为例
  2. 官网下载的文件解压之后得到一个config.json文件

image.png 3 把需要覆盖掉的变量复制到创建的 element-variables.scss 文件中(注意JSON文件是带引号的, 需要把引号去掉), 并把element包里的样式文件导入到这个scss文件中

image.png

  1. 在入口文件中引入创建的 element-variables.scss 文件 (这里不用再引入element的样式文件了)

image.png

缺点: 该方式会造成样式文件有点大 200多kb 可配合 Gzip 压缩

通用方案

  1. 官网下载文件中有一个 theme 文件 复制到项目的src下
  2. 在入口中直接引入 theme 文件中的 index.css 即可

缺点: 同样是样式文件过大 并且比第一种方式还要大一点

webpack 优化

gzip 压缩

  1. 下载依赖 npm i --save-dev compression-webpack-plugin
  2. 在 vue.config.js 中增加配置
// 引入依赖
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 判断环境
const isProduction = process.env.NODE_ENV === 'production';

module.exports = defineConfig({
...,
 configureWebpack: config => {
 
      if (isProduction) {
          config.plugins.push(new CompressionWebpackPlugin({
            algorithm: 'gzip',
            test: /\.js$|\.html$|\.json$|\.css/,
            threshold: 10240,
            minRatio: 0.8
          }))
      }
       ...,
 }
 
})
  1. 打包之后会看到.gz 结尾文件

开启js文件分离

  1. 在 vue.config.js 中增加配置
module.exports = defineConfig({
...,
 configureWebpack: config => {
 
      if (isProduction) {
             config.optimization = {
                runtimeChunk: 'single',
                splitChunks: {
                  chunks: 'all',
                  maxInitialRequests: Infinity,
                  minSize: 20000,
                  cacheGroups: {
                    vendor: {
                      test: /[\\/]node_modules[\\/]/,
                      name (module) {
                        // get the name. E.g. node_modules/packageName/not/this/part.js
                        // or node_modules/packageName
                        const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                        // npm package names are URL-safe, but some servers don't like @ symbols
                        return `npm.${packageName.replace('@', '')}`
                      }
                    }
                  }
                }
              }
        
      }
       ...,
 }
 
})
  1. 打包完成可以看到超过规定大小的文件被拆分成很多js文件

image.png

image.png