ant-design-vue@1在线主题编辑器实现

::: tip

本文介绍工作中碰到的需求,需要基于vue2、ant-design-vue@1版本和less实现使用了ant-design-vue组件库的项目在线配置主题。其中核心就是html支持直接引入stylesheet/less ,可以使用less.modifyVars修改变量动态编译。

:::

项目依赖

  • ant-design-vue@1.7.8
  • vue@2.7.13
  • vuex@3.6.2
  • less@3.13.1
  • less-loader@4.1.0

整体配置的地方汇总

本文涉及到需要修改的文件汇总如下:

脚手架默认生成的public下有index.html,同级新建目录libs,libs下放文件color.less 和从node_modules/less包下copy出来的less.js

color.less里面可以放ant-design-vue支持的所有less变量,默认可以设置为自己想要的一套默认主题色系。

vue.config.js配置

首先需要在vue.config.js配置css的loaderOptions,具体配置如下:

js 复制代码
const path = require('path')
module.exports = {
  css: {
    loaderOptions: {
      less: {
        javascriptEnable: true,
        javascriptEnabledInStrictMode: true, // 严格模式支持在css中写js
        modifyVars: {
          hack: `true; @import "${path.join(__dirname, 'public/libs/color.less')}"`
        }
      }
    }
  }
}

main.js不需要改动,正常全局注册ant-design-vue和引入ant-design-vue/dist/antd.less样式文件就行。

开始配置

准备可以输入或者修改色值的容器,颜色改变之后,可以存储local Store 、vuex等,之后执行如下逻辑:

js 复制代码
let lessNodesAppended = false
const buildIt = function (primaryColor) {
  // 正确判定less是否已经加载,并且less.modifyVars可用
  if (!window.less || !window.less.modifyVars) return
  window.less.modifyVars({
    '@primary-color': primaryColor
  }).then(() => {
    console.log('成功')
  }).catch(err => {
    console.error('失败:', err)
  })
}
const UpdateTheme = function (primaryColor) {
  // 生产环境不编译less
  if (process.env.NODE_ENV === 'production') return
  if (!primaryColor) return
  // 判断是否已经编译过
  if (!lessNodesAppended) {
    // 如果没有编译过,开始插入less.js和color.less
    const lessStyleNode = document.createElement('link')
    const lessConfigNode = document.createElement('script')
    const lessScriptNode = document.createElement('script')
    lessStyleNode.setAttribute('rel', 'stylesheet/less')
    lessStyleNode.setAttribute('href', '/libs/color.less')
    lessConfigNode.innerHTML = `
      window.less = {
        async: true,
        env: 'production',
        javascriptEnabled: true
      }
    `
    lessScriptNode.src = '/libs/less.js'
    lessScriptNode.async = true
    lessScriptNode.onload = () => {
      buildIt(primaryColor)
      lessScriptNode.onload = null
    }
    document.body.appendChild(lessStyleNode)
    document.body.appendChild(lessConfigNode)
    document.body.appendChild(lessScriptNode)
    lessNodesAppended = true
  } else {
    buildIt(primaryColor)
  }
}

执行成功之后,之前定义的color.less文件会重新编译为一份新的css,全站主题色就会变成改之后的颜色,编译完成之后结果如下:

相关推荐
艾利克斯冰5 分钟前
TypeScript 静态类型入门教程:可选静态类型与类型推导详
前端·javascript·typescript
GuWenyue9 分钟前
告别命名混乱!5步掌握BEM规范,写出易维护的前端页面
前端·javascript·面试
无心使然22 分钟前
Openlayers图层按需分层渲染到不同Canvas画布
前端·vue.js·gis
OliverH-yishuihan22 分钟前
【保姆级教程】Win11 下从零部署 Claude Code:本地环境配置 + VSCode 可视化界面全流程指南
ide·vscode·编辑器
西索ovo23 分钟前
从作用域链到闭包,原理一次讲透
javascript
daols8823 分钟前
vxe-table 实现 Excel 风格向下复制填充(Ctrl + D 键)
javascript·vue.js·excel·vxe-table·vxe-ui
fxshy31 分钟前
Vue 组件中 padding 生效了,但竖线还是贴到底边的问题
javascript·vue.js·ecmascript
Aotman_35 分钟前
JavaScript数组对象中指定字段转换
java·开发语言·前端·javascript·vue.js·前端框架·es6
TakeForge38 分钟前
17天跑通交通行业SVG编辑器
编辑器
森叶1 小时前
一线法编程理念
javascript