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 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
竹林8185 小时前
Next.js + wagmi v2 踩坑实录:开发 NFT 交易市场时,我如何处理离线签名和链下元数据
javascript·next.js
前端Hardy6 小时前
谁还没⽤过shadcn/ui?114k+星标,不装NPM包,前端组件自由终于实现了
前端·javascript·vue.js
猪猪聪明_V6 小时前
前端码农的本地项目启动器
前端·javascript
暗不需求7 小时前
前端性能优化 防抖与节流完全指南:从原理到最佳实践
前端·javascript·面试
@大迁世界7 小时前
45.什么是内联条件表达式(inline conditional expressions)?在事件处理里怎么用?
开发语言·前端·javascript·react.js·ecmascript
我胖虎不答应!!7 小时前
Three.js开发思想笔记
javascript·笔记·three.js
一颗趴菜7 小时前
微信小程序如何去下载PDF呢
前端·javascript
zithern_juejin8 小时前
JS深拷贝与浅拷贝
javascript
前端毕业班8 小时前
前端"枚举"管理指南
前端·javascript