VUE項目中CSS管理最佳實踐

2022-01-02 前端深夜告解室

在Web前端開發的過程中,比起JavaScript,css通常是比較容易忽略的一塊內容。css易於理解,但是應用和維護並不簡單。如果項目規劃中沒有考慮好css管理的問題,隨著項目代碼量的增加和工程體量的增大,後期樣式上的維護會越來越困難。所以今天探討一下如何在vue項目管理好css。

css 選擇器的命名空間是全局的,並沒有局部的概念。同一個頁面下的所有css類名,都是在同一個「作用域」下的,因此我們常常要考慮如何避免命名衝突問題。

在vue項目中,我們一般在 *.vue 單個文件組件內的 <style> 中寫css。當 vue文件中 <style> 標籤有 scoped 屬性時,它的 CSS 只作用於當前組件中的元素,很好的實現了樣式私有化的目的。

<style scoped>
.example {
color: red;
}
</style>

<template>
<div class="example">hi</div>
</template>

vue通過在DOM結構以及css樣式上加唯一不重複的標記,達到樣式私有化模塊化的目的,最終轉換成:

<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>

<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>

使用scoped之後,父組件的樣式將不會滲透到子組件中。不過一個子組件的根節點會同時受其父組件有作用域的 CSS 和子組件有作用域的 CSS 的影響,如果希望父組件樣式影響子組件,可以使用 >>>操作符:

<style scoped>
.a >>> .b { /* ... */ }
</style>

公共css文件可以在每個頁面引入一次就可以了,但是變量和mixin不一樣。在使用sass的過程中,經常會遇到這樣的問題:通常情況下我們會建立一個common.scss文件管理一些公共的樣式,由於sass的變量和mixin的作用域僅限於當前文件,每次在vue文件中引用公共變量或者mixin的時候,都需要先將common.scss import進來。當我們有很多個vue組件的時候,這是一件非常非常麻煩的事情。這個時候我們就需要用到sass-resources-loader了,它會在webpack打包過程中幫助我們將全局scss文件import到每個Vue組件中,舉個例子:

module: {
rules: {
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
css: 'vue-style-loader!css-loader',
scss: [
'vue-style-loader',
'css-loader',
'sass-loader',
{
loader: 'sass-resources-loader',
options: {
resources: path.resolve(__dirname, './src/modules/scss/mixin.scss')
}
}
]
}
}
}
}

如果我們需要在其它scss文件中使用:

module: {
rules: [{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader',
{
loader: 'sass-resources-loader',
options: {
resources: path.resolve(__dirname, './src/modules/scss/mixin.scss')
}
}
]
}]
}

這樣就可以在其它文件裡面裡調用common.scss裡面的變量和mixin了。需要注意的是, sass-resources-loader會將common.scss注入每個vue組件中。為避免重複打包,不要在common.scss寫具體的CSS方法。

如果希望將項目中css抽離出來單獨打包緩存,需要用到webpack的插件extract-text-webpack-plugin,下面是官方vue-loader文檔中的例子:

// webpack.config.js
var ExtractTextPlugin = require("extract-text-webpack-plugin")

module.exports = {
// other options...
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
css: ExtractTextPlugin.extract({
use: 'css-loader',
fallback: 'vue-style-loader' // <- 這是vue-loader的依賴,所以如果使用npm3,則不需要顯式安裝
})
}
}
}
]
},
plugins: [
new ExtractTextPlugin("style.css")
]
}

這樣就可以將vue組件裡面的css單獨打包出來。如果是移動端的項目,可以選擇使用html-webpack-inline-source-plugin把CSS內聯到html裡面以減少請求。

在開發之前,需要結合項目特點和團隊背景,制定合適的技術方案,以保證項目的可維護性。這篇文章在 vue 項目中 css 管理方面,提供一點參考,希望對發家有所啟發。

相關焦點

  • 在 Vue.js 中集成 CSS 框架
    目錄準備工作安裝併集成 Bootstrap 4安裝併集成 Bulma安裝併集成 Foundation在 Vue中 的最佳做法創建自己的樣式注意組件的可重用性總結CSS 框架之所以出色是有很多原因的Vue 項目後,用 npm 下載 Bootstrap 4。
  • 在VUE2.0中使用PostCSS
    其實在 vue-loader 中僅需要簡單的配置即可拯救我們。vue-loader 中 PostCSS 配置vue-loader 中使用了 PostCSS 來處理 css,如下圖所示:上圖為 vue-loader 9.x、webpack 1.x 中配置方法autoprefixer
  • Vue 引入 iconfont 的項目實踐
    從img標籤,到雪碧圖,再到字體圖標,svg,甚至svg也有了類似於雪碧圖的方案svg-sprite-loader。在項目實踐中,bootstrap,font-awesome,element-ui等UI庫都基本標配了字體圖標。一、Iconfont - 圖標管理工具阿里巴巴旗下阿里媽媽MUX團隊打造的圖標管理平臺。
  • 什麼是vue?在項目開發中為什麼要用vue?
    在近兩年的web及項目開發中,vue技術的使用越來越普遍,其各種資料、介紹以及使用攻略內容資料非常多,那麼vue到底什麼?在項目開發中,vue起到什麼作用?它與傳統的html+css+js+lamp開發網站項目又有什麼區別呢?
  • Vue中使用animate.css實現動畫效果
    在實際開發過程中,有些頁面需要一些炫酷的動畫效果這時我們可以通過animate來實現Animate是一個非常實用的動畫庫官網: https://animate.style/Animate動畫庫裡面有很多實用的動畫效果展示如下:應用實例效果展示:使用方法:在vue中使用animate.css第一步:安裝
  • 系統學習 vue 中使用 css 的各種方式
    在未使用 Vue 框架時,可以通過 class 和 style 來給 HTML 元素添加 css,如果想動態修改 css 可直接操作 DOM 元素的屬性。在前端小課 第6天:使用CSS的三種方式 中我們講了 css 的引入方式。
  • 【項目推薦】Vue.js
    在 package control中安裝Vuejs SnippetsVue Syntax Highlight推薦使用 npm 管理,新建兩個文件 app.html,app.js,為了美觀使用 bootstrap,我們的頁面模板看起來是這樣:<!
  • VUE 項目如何快速優化?| 原力計劃
    ,通過控制臺和分析面板,可以方便的查看項目中所存在的問題。如果程式設計師有修改 webpack默認配置的需求,可以在項目根目錄中 按需創建vue.config.js這個配置文件,從而對項目的打包發布過程做自定義配置,具體可以參考 https://cli.vuejs.org/zh/config/#vue-config-js為開發模式和發布模式指定不同的打包入口:默認情況下,Vue項目的開發模式和發布模式公用一個入口文件
  • Vue-使用vue-video-player組件
    在實際開發過程中會有添加視頻的需求在vue項目中添加視頻可以使用vue-video-player組件來實現實現步驟:1.安裝在控制臺輸入: npm install vue-video-player –s
  • Vue 項目中哪些問題戳中你的痛點?你又是如何解決的?(更新中)
    最近要求使用vue進行前後端分離開發微信公眾號,不斷摸索踩坑之後,總結出如下幾點vue項目開發中常見的問題及解決辦法。如果你是vue大佬,請忽略小弟的愚見^V^列表進入詳情頁的傳參問題。css的scoped私有作用域和深度選擇器hiper打開速度測試vue數據的兩種獲取方式+骨架屏自定義組件(父子組件)的雙向數據綁定路由的拆分管理
  • Vue進階篇: vue-loader
    常見的比如: css-loader、url-loader、html-loader、babel-loader…轉換 ES2015,CoffeeScript 或者 TypeScript 模塊為普通的 ES5 CommonJS 模塊;可以選擇在編譯之前檢驗你的原始碼;將 Jade 模版轉換為純 HTML 並且嵌入 Javascript 字符串中;將
  • 對比 12,000 個 Vue.js 開源項目發現最實用的 TOP45!
    ,並從中挑選了最好的 45 個(佔比 0.37%)。這是一個極具權威性的表單,精確匯總了 2018 年 1-12 月期間發布的最佳 Vue.js 開源項目。Vue-yduiStar 數:2308GitHub:https://github.com/ydcss/vue-ydui介紹:Vue2.js 移動組件庫。
  • vue中使用rem
    lib-flexible 用於設置 rem 基準值。
  • 使用Vue CLI腳手架搭建Vue基礎環境
    >環境變量配置規則在項目根目錄(本文根目錄vueproject)下,新建環境變量配置文件文件名規則.env #在所有的環境中被載入.env.local #在所有的環境中被載入,但會被git忽略.env.
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。
  • 5個Vue.js項目的令人敬畏的模板
    你準備開始一個重要的Vue項目嗎?為了確保從堅實的基礎開始,您可以使用模板(也就是樣板,骨架,起動器或腳手架)而不是從npm init或開始vue init。許多經驗豐富的開發人員已經掌握了以開源模板的形式構建高質量Vue應用程式的智慧。這些模板包括最佳配置和項目結構,最佳第三方工具以及其他開發最佳實踐。
  • 2020年5個最佳Vue移動端組件庫|UI框架
    小夥伴們平時開發vue,react或是angular項目,都喜歡使用的什麼UI組件庫呢?今天,就來盤點下,幾個熱門優質的Vue.js移動端UI組件庫。';import Vant from'vant';import'vant/lib/index.css';Vue.use(Vant);// 按需引入部分組件import
  • vue-elemnt-admin學習
    的集成的管理後臺。plop機制plop機制是自動生成vue文件的一種機制。plop相關的有幾個地方,一個是package.json裡面的npm run new。一個是plop.js中定義了3個生成器:view,store,component。
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    ,由於目前所有前端資源都已經通過 NPM 進行管理,所以需要安裝對應的依賴包:npm install bootstrap jquery popper.js然後在 src/main.js 中引入 Bootstrap 的腳本和樣式文件:import Vue from 'vue'import
  • Vue.js輸出HelloWorld
    收錄於話題 #java php vue.js 第一課:輸出Helloworld