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,全站主题色就会变成改之后的颜色,编译完成之后结果如下:

相关推荐
~无忧花开~18 分钟前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
@大迁世界1 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
前端Hardy3 小时前
Wails v3 正式发布:用 Go 写桌面应用,体积仅 12MB,性能飙升 40%!
前端·javascript·go
Highcharts.js4 小时前
Highcharts React v4 迁移指南(下):分步代码示例与常见问题解决
javascript·react.js·typescript·react·highcharts·代码示例·v4迁移
Laurence4 小时前
Qt 前后端通信(QWebChannel Js / C++ 互操作):原理、示例、步骤解说
前端·javascript·c++·后端·交互·qwebchannel·互操作
Pu_Nine_94 小时前
JavaScript 字符串与数组核心方法详解
前端·javascript·ecmascript
这是个栗子4 小时前
前端开发中的常用工具函数(六)
javascript·every
kyriewen4 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
前端·javascript·面试
前端Hardy4 小时前
别再手动写 loading 了!封装一个自动防重提交的 Hook
前端·javascript·vue.js
前端Hardy4 小时前
前端如何实现“无感刷新”Token?90% 的人都做错了
前端·javascript·vue.js