如何在Vue+Webpack下配置Stylelint

更新了關(guān)于vue-cli3的相關(guān)配置

Stylelint簡(jiǎn)介

stylelint是一個(gè)基于 Javascript 的代碼審查工具参萄,它易于擴(kuò)展匿刮,支持最新的 CSS 語法焦履,也理解類似 CSS 的語法到推。此外床三,因?yàn)樗腔?JavaScript,所以比起 Ruby 開發(fā)的 scss-lint 速度更快月趟。

stylelint 是一個(gè)強(qiáng)大和現(xiàn)代的 CSS 審查工具灯蝴,有助于開發(fā)者推行統(tǒng)一的代碼規(guī)范,避免樣式錯(cuò)誤孝宗。

stylelint 由 PostCSS 提供技術(shù)支持穷躁,所以它也可以理解 PostCSS 解析的語法,比如 SCSS因妇。

PostCSS 是一個(gè)使用 JS 解析樣式的插件集合问潭,它可以用來審查 CSS 代碼,也可以增強(qiáng) CSS 的語法(比如變量和混合宏)婚被,還支持未來的 CSS 語法狡忙、行內(nèi)圖片等等。

PostCSS 的哲學(xué)是專注于處理一件事址芯,并做到極致灾茁,目前它已經(jīng)有了 200 多個(gè)插件,由于它們都是基于 JavaScript 編寫的谷炸,所以運(yùn)行速度非潮弊ǎ快。

Stylelint使用

1.安裝

npm install -g stylelint --save-dev

2.配置

1.本地安裝:

npm install stylelint-config-standard --save-dev

2.在項(xiàng)目中添加配置文件"stylelint.config.js"

module.exports = { 
    extends: ["stylelint-config-standard"] 
}

3.添加或修改標(biāo)準(zhǔn)配置中的內(nèi)容

module.exports = { 
    extends: ["stylelint-config-standard"], 
    rules: { 
        "max-nesting-depth": 2 // 允許嵌套的深度為2
    } 
}

在Vue+Webpack下配置Stylelint

1.Webpack下配置

1.本地安裝stylelint-webpack-plugin:

npm install stylelint-webpack-plugin --save-dev

2.打開文件 build/webpack.base.conf.js旬陡,并在頂部添加加載插件代碼

var StyleLintPlugin = require('stylelint-webpack-plugin')

在plugins數(shù)組下添加以下代碼:

plugins: [
    //... 
    new StyleLintPlugin({ 
        // 正則匹配想要lint監(jiān)測(cè)的文件
        files: ['src/**/*.vue', 'src/assets/styles/*.l?(e|c)ss'] 
    }),
    //... 
],

更新:vue-cli3下配置

1.本地安裝@ascendancyy/vue-cli-plugin-stylelint:

#需添加新插件
npm install  @ascendancyy/vue-cli-plugin-stylelint --save-dev

2.vue-cli3的vue.config.js需添加以下配置

  pluginOptions: {
    lintStyleOnBuild: true, // 添加了插件(@ascendancyy/vue-cli-plugin-stylelint), 所以需要配置
    stylelint: {
      fix: true, // boolean (default: true)
      files: ['src/**/*.vue', 'src/assets/styles/*.l?(e|c)ss'] // string | [string] (default: ['src/**/*.{vue,htm,html,css,sss,less,scss}'])
      // formatter: () => { } // function (default: require('stylelint-codeframe-formatter'))
      // etc...
    }
  }

2.若在Vue文件下進(jìn)行stylelint校驗(yàn)拓颓,則需要:

1.本地安裝 stylelint-processor-html(若需要第3步校驗(yàn)css屬性順序,可忽略此插件):

npm install stylelint-processor-html --save-dev

2.修改配置文件"stylelint.config.js"

module.exports = { 
    processors: ["stylelint-processor-html"], 
    extends: ["stylelint-config-standard"], 
    rules: {
    } 
}

這樣描孟,當(dāng)項(xiàng)目啟動(dòng)時(shí)驶睦,就會(huì)對(duì)vue文件下的css,或者目錄下的css文件進(jìn)行stylelint校驗(yàn)了

3.stylelint 搭配 stylelint-order画拾,可以校驗(yàn) CSS的屬性順序

1.安裝stylelint-order(校驗(yàn)排序) 啥繁、css-properties-sorting(自動(dòng)修復(fù)排序,若安裝此插件青抛,需刪除processors: ["stylelint-processor-html"])

npm i --save-dev stylelint-order css-properties-sorting

2.在"stylelint.config.js"配置文件新增stylelint-order插件,通過"order/properties-order"定義順序

module.exports = { 
    extends: ["stylelint-config-standard", "css-properties-sorting"], 
    plugins: ["stylelint-order"], // stylelint-order是CSS屬性排序插件
    rules: {
        "order/properties-order":[]
    } 
}

3.在項(xiàng)目下創(chuàng)建.stylelintignore文件酬核,指明忽略stylelint的文件或目錄

*.js
*.png
*.eot
*.ttf
*.woff

Stylelint 規(guī)則

根據(jù)自己項(xiàng)目規(guī)范蜜另,配置需要的規(guī)則。以下是在stylelint-config-standard基礎(chǔ)上嫡意,根據(jù)自身項(xiàng)目需求修改出的一些規(guī)則:

module.exports = {
  extends: ["stylelint-config-standard", "css-properties-sorting"],
  plugins: ["stylelint-order"], // stylelint-order是CSS屬性排序插件
  rules: {
    // "color-hex-case": "lower", // 顏色值為小寫字母(stylelint-config-standard)
    // "color-no-invalid-hex": true, // 顏色值不能為無效值(stylelint-config-standard)
    "font-family-name-quotes": "always-where-recommended", // 字體系列中命名時(shí)帶引號(hào)
    "function-url-quotes": "always", // 地址一定要寫引號(hào)
    "number-leading-zero": "never", // 要求或分?jǐn)?shù)低于1的數(shù)字禁止前導(dǎo)零
    "number-no-trailing-zeros": true, // 禁止在數(shù)量尾隨零
    "string-quotes": "double", // 指定字串举瑰,雙引號(hào)
    "length-zero-no-unit": true, // 禁止單位零長(zhǎng)度。
    "value-keyword-case": "lower", // 指定小寫關(guān)鍵字的值
    "value-list-comma-newline-after": "always-multi-line",// 在值列表的逗號(hào)后指定一個(gè)換行符或禁止留有空格
    "shorthand-property-no-redundant-values": true, // 不允許在簡(jiǎn)寫屬性冗余值
    // "property-case": "lower", // 為屬性指定小寫(stylelint-config-standard)
    "keyframe-declaration-no-important": true, // 不允許!important在關(guān)鍵幀聲明
    // "block-closing-brace-empty-line-before": "never", // 不允許關(guān)閉括號(hào)前空一行(stylelint-config-standard)
    // "block-closing-brace-newline-after": "always", // 需要一個(gè)換行符關(guān)閉括號(hào)后的空白(stylelint-config-standard)
    // "block-opening-brace-newline-after": "always-multi-line", // 開括號(hào)的塊之后需要新的一行(stylelint-config-standard)
    "selector-class-pattern": "^[a-z]+([a-z0-9]?|[a-z0-9\\-\\_]*[a-z0-9])$", // 指定一個(gè)模式類選擇符蔬螟,限制選擇器名稱寫法
    "selector-id-pattern": "^[a-z]+([a-z0-9]?|[a-z0-9\\-\\_]*[a-z0-9])$", // 指定一個(gè)模式此迅,id選擇器,限制選擇器名稱寫法
    "value-keyword-case": "lower", // 屬性值小寫
    "no-empty-source": null, // 不允許空的來源
    "at-rule-no-unknown": null, // 不允許at-rules不明
    // "indentation": 2, // 指定縮進(jìn)(stylelint-config-standard)
    "max-nesting-depth": 3, // 允許嵌套的深度為3
    "no-duplicate-selectors": true, // 不允許重復(fù)的選擇器
    // "no-eol-whitespace": true, // 不允許行尾空白(stylelint-config-standard)
    // "no-invalid-double-slash-comments": true // 不允許雙斜杠注釋(/ /…)不支持CSS(stylelint-config-standard)
    "order/order": [ // 指定聲明塊內(nèi)的內(nèi)容順序
      ["custom-properties", "declarations"], {
        "disableFix": true
      }
    ],
    "order/properties-order": [ // 指定聲明塊內(nèi)屬性的字母順序
      'position',
      'top',
      'right',
      'bottom',
      'left',
      'z-index',
      'display',
      'float',
      'width',
      'height',
      'max-width',
      'max-height',
      'min-width',
      'min-height',
      'padding',
      'padding-top',
      'padding-right',
      'padding-bottom',
      'padding-left',
      'margin',
      'margin-top',
      'margin-right',
      'margin-bottom',
      'margin-left',
      'margin-collapse',
      'margin-top-collapse',
      'margin-right-collapse',
      'margin-bottom-collapse',
      'margin-left-collapse',
      'overflow',
      'overflow-x',
      'overflow-y',
      'clip',
      'clear',
      'font',
      'font-family',
      'font-size',
      'font-smoothing',
      'osx-font-smoothing',
      'font-style',
      'font-weight',
      'hyphens',
      'src',
      'line-height',
      'letter-spacing',
      'word-spacing',
      'color',
      'text-align',
      'text-decoration',
      'text-indent',
      'text-overflow',
      'text-rendering',
      'text-size-adjust',
      'text-shadow',
      'text-transform',
      'word-break',
      'word-wrap',
      'white-space',
      'vertical-align',
      'list-style',
      'list-style-type',
      'list-style-position',
      'list-style-image',
      'pointer-events',
      'cursor',
      'background',
      'background-attachment',
      'background-color',
      'background-image',
      'background-position',
      'background-repeat',
      'background-size',
      'border',
      'border-collapse',
      'border-top',
      'border-right',
      'border-bottom',
      'border-left',
      'border-color',
      'border-image',
      'border-top-color',
      'border-right-color',
      'border-bottom-color',
      'border-left-color',
      'border-spacing',
      'border-style',
      'border-top-style',
      'border-right-style',
      'border-bottom-style',
      'border-left-style',
      'border-width',
      'border-top-width',
      'border-right-width',
      'border-bottom-width',
      'border-left-width',
      'border-radius',
      'border-top-right-radius',
      'border-bottom-right-radius',
      'border-bottom-left-radius',
      'border-top-left-radius',
      'border-radius-topright',
      'border-radius-bottomright',
      'border-radius-bottomleft',
      'border-radius-topleft',
      'content',
      'quotes',
      'outline',
      'outline-offset',
      'opacity',
      'filter',
      'visibility',
      'size',
      'zoom',
      'transform',
      'box-align',
      'box-flex',
      'box-orient',
      'box-pack',
      'box-shadow',
      'box-sizing',
      'table-layout',
      'animation',
      'animation-delay',
      'animation-duration',
      'animation-iteration-count',
      'animation-name',
      'animation-play-state',
      'animation-timing-function',
      'animation-fill-mode',
      'transition',
      'transition-delay',
      'transition-duration',
      'transition-property',
      'transition-timing-function',
      'background-clip',
      'backface-visibility',
      'resize',
      'appearance',
      'user-select',
      'interpolation-mode',
      'direction',
      'marks',
      'page',
      'set-link-source',
      'unicode-bidi',
      'speak'
    ]
  }
};

具體的規(guī)則以及例子可以查看以下文檔:
stylelint 的官方配置文檔Example config
CSS屬性順序

參考:
使用stylelint對(duì)CSS/Sass做代碼審查
A nice way to lint .vue files with Stylelint?
Linting CSS in Vue files
"declaration-block-properties-order" rule is not the same rule that stylelint uses.
更新補(bǔ)充vue-cli3:
vue-cli-plugin-stylelint插件 git地址
Support of style lint
vue單文件組件lint error自動(dòng)fix及styleLint報(bào)錯(cuò)自動(dòng)fix


原文:
如何在Vue+Webpack下配置Stylelint

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耸序,一起剝皮案震驚了整個(gè)濱河市忍些,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坎怪,老刑警劉巖罢坝,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搅窿,居然都是意外死亡嘁酿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門男应,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹司,“玉大人,你說我怎么就攤上這事沐飘】觯” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵薪铜,是天一觀的道長(zhǎng)众弓。 經(jīng)常有香客問我,道長(zhǎng)隔箍,這世上最難降的妖魔是什么谓娃? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蜒滩,結(jié)果婚禮上滨达,老公的妹妹穿的比我還像新娘。我一直安慰自己俯艰,他們只是感情好捡遍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竹握,像睡著了一般画株。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啦辐,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天谓传,我揣著相機(jī)與錄音,去河邊找鬼芹关。 笑死续挟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侥衬。 我是一名探鬼主播诗祸,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼跑芳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了直颅?” 一聲冷哼從身側(cè)響起博个,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎际乘,沒想到半個(gè)月后坡倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脖含,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年罪塔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片养葵。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡征堪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出关拒,到底是詐尸還是另有隱情佃蚜,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布着绊,位于F島的核電站谐算,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏归露。R本人自食惡果不足惜洲脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剧包。 院中可真熱鬧恐锦,春花似錦、人聲如沸疆液。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堕油。三九已至潘飘,卻和暖如春馍迄,著一層夾襖步出監(jiān)牢的瞬間福也,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工攀圈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峦甩。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓赘来,卻偏偏與公主長(zhǎng)得像现喳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犬辰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容