ant-design-vue antd-theme-webpack-plugin 動態改變主題
安裝
npm install -D antd-theme-webpack-plugin
關鍵原始碼
構造器選項:
const defaulOptions = {
varFile: path.join(__dirname, "../../src/styles/variables.less"),
antDir: path.join(__dirname, "../../node_modules/antd"),
stylesDir: path.join(__dirname, "../../src/styles/antd"),
themeVariables: ["@primary-color"],
indexFileName: "index.html",
generateOnce: false,
lessUrl:
"https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js",
publicPath: ""
};
編譯過程:
compiler.hooks.emit.tapAsync('AntDesignThemePlugin', (compilation, callback) => {
const less = `
<link rel="stylesheet/less" type="text/css" href="${options.publicPath}/color.less" />
<script>
window.less = {
async: false,
env: 'production'
};
</script>
<script type="text/javascript" src="${options.lessUrl}"></script>
`;
if (
options.indexFileName &&
options.indexFileName in compilation.assets
) {
const index = compilation.assets[options.indexFileName];
let content = index.source();
if (!content.match(/\/color\.less/g)) {
index.source = () =>
content.replace(less, "").replace(/<body>/gi, `<body>${less}`);
content = index.source();
index.size = () => content.length;
}
}
從原始碼可看出:若 index.html 檔案中沒有相關樣式、指令碼程式碼時,會自動在 body 開始標籤新增
使用
環境版本:
- @vue/cli 4.5.8
- ant-design-vue 1.7.2
- antd-theme-webpack-plugin 1.3.7
- less 3.0.4
- less-loader 5.0.0
在 vue.config.js 中
const AntDesignThemePlugin = require("antd-theme-webpack-plugin");
module.exports = {
css: {
loaderOptions: {
less: {
modifyVars: { },
javascriptEnabled: true
}
},
extract: false
},
configureWebpack: {
plugins: [
new AntDesignThemePlugin({
// ant 目錄
antDir: resolve("./node_modules/ant-design-vue"),
// 樣式目錄 會獲取該目錄下的 less 檔案編譯
stylesDir: resolve("./src/styles"),
// 變數檔案
varFile: resolve(
// ant-design-vue 變數檔案
// "./node_modules/ant-design-vue/lib/style/themes/default.less"
// 自定義變數檔案 該檔案需要引入 ant-design-vue 變數檔案:@import "~ant-design-vue/lib/style/themes/default.less";
"./src/styles/themes/variables.less"
),
themeVariables: [
"@primary-color",
"@secondary-color",
"@text-color",
"@text-color-secondary",
"@heading-color",
"@layout-body-background",
"@btn-primary-bg",
"@layout-header-background"
],
generateOnce: false,
// 預設
indexFileName: "index.html",
// 預設
lessUrl:
"https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js",
// 實際上是專案名
publicPath: "/[proj_name]"
// customColorRegexArray: [] // An array of regex codes to match your custom color variable values so that code can identify that it's a valid color. Make sure your regex does not adds false positives.
})
]
};
[proj_name] 需要修改成自身的專案名
執行 npm run build
命令生成 color.less 檔案:遇到以下異常:
Building for production...error [LessError: error evaluating function `darken`: color.toHSL is not a function] {
message: 'error evaluating function `darken`: color.toHSL is not a function',
stack: undefined,
type: 'Runtime',
filename: 'input',
index: 363260,
line: 16057,
column: 32,
callLine: NaN,
callExtract: undefined,
extract: [
"@table-header-sort-active-bg: ~'darken(@table-header-bg, 3%)';",
'@table-header-filter-active-bg: darken(@table-header-sort-active-bg, 5%);',
'@table-selection-column-width: 60px;'
]
}
需要在 ant-design-vue 變數檔案【node_modules/ant-design-vue/lib/style/themes/default.less】加上以下使用 ===========
包裹的程式碼:建議在 // Table 註釋下加上
// Table
// --
===========
@table-header-sort-active-bg: darken(@table-header-bg, 3%);
@table-header-filter-active-bg: darken(@table-header-sort-active-bg, 5%);
@table-selection-column-width: 60px;
===========
@table-header-bg: @background-color-light;
加上後執行 npm run build
命令成功生成 color.less 檔案 檢視 index.html 檔案可發現 body
開始標籤下多出相關的樣式、指令碼程式碼:
<body>
<link rel="stylesheet/less" type="text/css" href="/vue-antd-admin/color.less"><script>window.less = {
async: false,
env: true ? 'production' : 'development',
javascriptEnabled: true,
modifyVars: { },
};</script><script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.js"></script><noscript><strong>We're sorry but Vue Antd Admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript>
若要在開發環境中執行,需要將 color.less 檔案複製到 public 目錄,並在 public
目錄中的 index.html
的 body
開始標籤下新增以下程式碼:
<link rel="stylesheet/less" type="text/css" href="<%= BASE_URL %>color.less" />
<script>
window.less = {
async: false,
env: 'production',
javascriptEnabled: true,
modifyVars: { },
};
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.js"></script>
執行 npm run serve
命令後,在控制檯測試
window.less.modifyVars({
"@primary-color": "#db8b12",
'@link-color': '#ee5e7b',
'@btn-primary-bg': '#db8b12',
"@primary-color2": "#db8b12"
})
@primary-color2 在自定義變數檔案定義,在其他樣式檔案使用時,需要先引入自定義變數檔案
至此,可以成功動態修改主題,但是耗費效能。在 ant-design-vue 官方的後臺管理系統 ant-design-vue-pro 使用 webpack-theme-color-replacer 動態修改,無需編譯 less
相關文章
- 動態路由,透過id改變,改頁面路由
- IOS 動態改變cell的高度iOS
- [譯] CSS 變數和 JavaScript 讓應用支援動態主題CSS變數JavaScript
- javascript動態改變css3的animationJavaScriptCSSS3
- js動態改變css偽類樣式JSCSS
- Linux下共享VG改變活動狀態Linux
- 【layui】 laydate動態改變日期最小值UI
- echarts 主題動態切換Echarts
- 虛擬主播上線:多模態將改變人機互動的未來
- 使用RecyclerView動態改變item時遇到的坑View
- create-react-app中使用antd並且改變主題ReactAPP
- WEUI picker元件無法js動態改變選項UI元件JS
- uni-app 動態修改主題色APP
- flutter使用Provider完成動態主題功能FlutterIDE
- 解決 Retrofit 多 BaseUrl 及執行時動態改變 BaseUrl ?
- 用js實現動態改變根元素字型大小的方法JS
- Java靜態變數在靜態方法內部無法改變值Java變數
- Android開發——Java程式碼動態改變顏色字型的方法AndroidJava
- 解決Retrofit多BaseUrl及執行時動態改變BaseUrl(二)
- VueRouter改變頁面標題Vue
- Linux 中改變主機名的 4 種方法Linux
- react+antd 使用腳手架動態修改主題色React
- ant-design-vueVue
- CSS 動畫方式改變 div 尺寸CSS動畫
- vue 變數賦值同時改變的問題Vue變數賦值
- 改@使用者功能為動態
- 末世主題與生態批判:《地平線》怎麼講氣候變化故事?
- 《無主之地3》:改變與不改變,或許結果都不令人意外
- 滑鼠懸浮div動畫改變尺寸動畫
- Flask 框架啟動無法改變埠Flask框架
- 谷歌報告:流動性的改變谷歌
- 物件呼叫動態變數物件變數
- 實時監聽div,input內容改變並獲取值(包括指令碼動態新增)指令碼
- React專題:可變狀態React
- 變態的面試題目面試題
- 動態主機配置協議DHCP協議
- css 改變scroll滾動條的樣式CSS
- 動態變更vue樣式Vue