前段時間遇到網站換膚的需求,本想挺簡單的,直接用 Sass 或者 Less 設置變量就行了,結果致使的問題就是 js 中設置的樣式html
得單獨設置,好麻煩。vue
本文章代碼gitHub地址 https://github.com/l-x-f/variables-css-less-sass-js node
這個時候若是能讓樣式文件和 js 文件實現變量共享,那這個問題就解決了。查了好多資料,最終的解決方案以下:webpack
1.原理介紹:經過 webpack 和 css module,咱們能夠在 js 中使用樣式 Sass,Less,Css 文件中定義的變量。git
2.環境: node: v8.10.0 vue-cli:3.5.3 github
3.package.json ( scss和less及其loader等先安裝,vue-cli:3.5.3 下webpack已配置)web
{ "name": "Javascript 如何 Sass,Less,Css 之間共享變量", "version": "0.1.0", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, "dependencies": { "core-js": "^2.6.5", "vue": "^2.6.6", "vue-router": "^3.0.1", "vuex": "^3.0.1" }, "devDependencies": { "@vue/cli-plugin-babel": "^3.5.0", "@vue/cli-plugin-eslint": "^3.5.0", "@vue/cli-service": "^3.5.0", "babel-eslint": "^10.0.1", "eslint": "^5.8.0", "eslint-plugin-vue": "^5.0.0", "less": "^3.9.0", "less-loader": "^4.1.0", "node-sass": "^4.9.0", "sass-loader": "^7.1.0", "vue-template-compiler": "^2.5.21" } }
4.文件目錄
vue-router
5.variables文件夾下代碼(核心代碼)
css.css文件vuex
/* @value 定義變量,而後使用。 @value bgcColor: red; 會導出@ 後面的變量, 在:export {} 能夠取到該變量,也能夠導出 他們在功能上等同於 ES6 的關鍵字export,即導出一個 js 對象。*/ @value bgcColor: red; @value fontSize: 10px; /* 這裏能夠直接使用 .demo { background-color: bgcColor; font-size: fontSize; } */ /* CSS Module 導出 :export { cssExportBgcColor: bgcColor; } */
less.less文件
@mainColor: #398bd0; @fontSize: 100px; // CSS Module 有一個:export關鍵字,它在功能上等同於 ES6 的關鍵字export,即導出一個 js 對象。 :export { name: "less"; mainColor: @mainColor; fontSize: @fontSize; }
scss.scss文件
$primaryColor: #f4d020; $fontSize: 11px; // CSS Module 有一個:export關鍵字,它在功能上等同於 ES6 的關鍵字export,即導出一個 js 對象。 :export { name: "scss"; primaryColor: $primaryColor; fontSize: $fontSize; }
index.js文件
import variablesScss from "./scss.scss"; import variablesLess from "./less.less"; import variablesCss from "./css.css"; // 導出變量 export default { variablesScss, variablesLess, variablesCss };
6.styles文件夾下代碼(樣式文件中使用變量)
css-use.css文件
@value variables: "../variables/css.css"; /* 導入變量*/ @value bgcColor, fontSize from variables;/* 取出變量*/ .box { name: "css"; /* 此屬性錯誤,僅用於區分,可忽略*/ background-color: bgcColor; font-size: fontSize; }
less-use.less文件
@import "../variables/less.less"; .box { name: "less";/* 此屬性錯誤,僅用於區分,可忽略*/ background-color: @mainColor; font-size: @fontSize; }
scss-use.scss文件
@import "../variables/scss.scss"; .box { name: "scss"; /* 此屬性錯誤,僅用於區分,可忽略*/ background-color: $primaryColor; font-size: $fontSize; }
7.main.js代碼
import Vue from "vue"; import App from "./App.vue"; Vue.config.productionTip = false; import variables from "./variables"; console.log(variables, "main-variables"); new Vue({ render: h => h(App) }).$mount("#app");
8.App.vue文件代碼
<template> <div id="app" class="box"></div> </template> <script> // variables in js import variables from "./variables"; export default { name: "home", components: {}, data() { return { variables: { ...variables } }; }, created() { console.log(this.variables, "App-this.variables"); } }; </script> <!--css --> <style lang="css"> #app { height: 500px; } @import "./styles/css-use.css"; </style> <!--scss --> <style lang="scss"> @import "./styles/scss-use.scss"; </style> <!-- less--> <style lang="less"> @import "./styles/less-use.less"; </style>
9.最後的效果
如圖咱們在js文件(或vue 文件)中取到樣式變量,最後引用第三個資料中的一句話結束本文章
環境之間共享變量是編程的聖盃
參考資料
http://www.ruanyifeng.com/blo...
https://github.com/css-module...
https://www.bluematador.com/b...
https://github.com/css-module...
https://github.com/css-module...