摘要:如何為你的項(xiàng)目添加配置如何為你的項(xiàng)目添加配置現(xiàn)在已經(jīng)是年了,網(wǎng)上許多教程和分享帖都已經(jīng)過(guò)期,照著他們的步驟來(lái)會(huì)踩一些坑,如已經(jīng)不再維護(hù),以及之后文件只剩下部分等。如有疑問(wèn)或授權(quán)協(xié)商請(qǐng)與我聯(lián)系。
現(xiàn)在已經(jīng)是 9102 年了,網(wǎng)上許多教程和分享帖都已經(jīng)過(guò)期,照著他們的步驟來(lái)會(huì)踩一些坑,如 stylelint-processor-html
已經(jīng)不再維護(hù),以及 --fix
之后 .vue
文件只剩下 部分等。我在踩完坑跑通出滿意的效果后,維護(hù)一份新的指引,以備后續(xù)項(xiàng)目使用,順便分享一下。
這個(gè)問(wèn)題有兩層含義,一是為什么要使用這個(gè)樣式代碼風(fēng)格檢查工具,二是與其他工具相比,為什么選擇 stylelint 而不是其他如 stylefmt 等。
對(duì)于第一個(gè)問(wèn)題,相信很多小伙伴都會(huì)被歷史遺留的,或多人協(xié)同開(kāi)發(fā)寫下的風(fēng)格不一的樣式代碼困擾過(guò),最基本的就是換行、縮進(jìn)和空格之爭(zhēng),大家對(duì)此應(yīng)該都不陌生。特別是有時(shí)候你可能會(huì)遇上如下祖?zhèn)鞔a:
#idA .classB,.classC{position:absolute;top: 0;left:0; display:-webkit-flex;display: flex;width:100%;background:url(../pic.png) no-repeat;-webkit-background-size:contain;background-size:contain }
這段代碼從我個(gè)人風(fēng)格來(lái)看存在不少問(wèn)題:
-webkit-
前綴,但是項(xiàng)目中已經(jīng)支持 autoprefixer
;當(dāng)然代碼風(fēng)格因人而異,所以才需要團(tuán)隊(duì)統(tǒng)一。在一些早期缺乏完善的代碼評(píng)審等制度的項(xiàng)目中,很容易由于程序員的偷懶圖方便或在一時(shí)的緊急粗糙趕工中積累下一坨對(duì)團(tuán)隊(duì)其他成員不太友好、可閱讀性低、較難維護(hù)的 css 。
至于第二個(gè)問(wèn)題,選擇 stylelint 的原因也很簡(jiǎn)單,它是當(dāng)前所有同類工具中使用人數(shù)最多的,社區(qū)較為活躍,仍在持續(xù)維護(hù)。而且正如這個(gè) issue 中提到,當(dāng)下很多大廠都在使用,如 github 的 primer 體系就定制了一套自己的規(guī)則 stylelint-config-primer
。
至于 stylefmt 也曾經(jīng)被推薦與 stylelint 搭配組合,不少博文都有提到。但是官方已經(jīng)不推薦繼續(xù)使用,直接用 stylelint 的 --fix
選項(xiàng)即可。
NOTICE: Consider other tools before adopting stylefmt
If you are using stylefmt with stylelint configuration to format according to its rules, you can now use stylelints --fix option (from v7.11.0) to autofix.Another on the other hand, prettier supports to format not only JavaScript but also CSS, SCSS and Less code.
而沒(méi)有考慮 prettier 的原因則是它希望提供一套官方自己認(rèn)可的統(tǒng)一風(fēng)格規(guī)范,而不僅僅是個(gè) linter 或者 formatter ,可配置項(xiàng)很少,定制自由度較低,不適合想要自己搞事情的團(tuán)隊(duì),更適合個(gè)人開(kāi)發(fā)者去使用。
其實(shí)官方的 User guide 已經(jīng)很全面,與 eslint 是非常相似的。
安裝 stylelint
npm i -D stylelint stylelint-config-stand
后者 stylelint-config-stand
不是必需的,也可以自己根據(jù)文檔從零開(kāi)始配置規(guī)則,或者用第三方如 github 的規(guī)則 stylelint-config-primer
。
安裝適配預(yù)處理語(yǔ)法的插件
以 sass 為例:
npm i -D stylelint-scss
不過(guò) stylus 目前沒(méi)有發(fā)現(xiàn)可用性高的相關(guān)插件,也導(dǎo)致 stylelint 不能解析 stylus 語(yǔ)法。
安裝 webpack 插件
npm i -D stylelint-webpack-plugin
stylelint 搜索目錄和文件使用的是 glob 規(guī)則:
npx stylelint --cache **/*.{html,vue,css,sass,scss} --fix
--cache
選項(xiàng)可以指定使用緩存,默認(rèn)生成的 .stylelintcache
文件放置于執(zhí)行目錄中, --fix
選項(xiàng)可以指定 stylelint 自動(dòng)修復(fù)不符合可修復(fù)規(guī)則的代碼,其他更多選項(xiàng)可以參考官方文檔。
但需要注意有一個(gè)問(wèn)題,在沒(méi)有配置使用 stylelint-scss
之類的插件前, stylelint 是不能直接解析 vue 文件、 html 文件等的,會(huì)報(bào)出一堆錯(cuò)誤:
1:1 ? Unknown word CssSyntaxError
我們可以用內(nèi)置的自定義語(yǔ)法 postcss-html
來(lái)解析(不需安裝):
npx stylelint **/*.{html,vue} --custom-syntax postcss-html
也可以用內(nèi)置的 scss 語(yǔ)法支持來(lái)解析 css 文件:
npx stylelint **/*.{css,sass,scss} --syntax scss
在 scripts 中加一下就好了,對(duì)于 9102 年的前端程序員應(yīng)該都是基本操作:
// package.json
{
"scripts": {
"lint:style": "stylelint **/*.{html,vue} --custom-syntax postcss-html",
"lint:css": "stylelint **/*.{css,sass,scss} --syntax scss"
}
}
或者(配置了 stylelint-scss
插件后):
{
"scripts": {
"lint:css": "stylelint **/*.{html,vue,css,sass,scss}"
}
}
然后可以手動(dòng)在命令行運(yùn)行:
npm run lint:css
npm run lint:css -- --fix
npm run lint:css -- --cache --fix
// webpack.conf.js
const StyleLintPlugin = require('stylelint-webpack-plugin');
module.exports = {
...
'plugins': [
...
new StyleLintPlugin({
'files': ['**/*.{html,vue,css,sass,scss}'],
'fix': false,
'cache': true,
'emitErrors': true,
'failOnError': false
})
]
};
stylelint 支持的所有命令行選項(xiàng)都可以在初始化插件時(shí)傳遞 options 來(lái)指定,包括上文提到的 --syntax
等。更多可以參考 stylelint-webpack-plugin
官方文檔。
stylelint 支持 cosmiconfig 的配置方式,按如下順序查找配置對(duì)象:
package.json
中的 stylelint
屬性.stylelintrc
文件(可帶后綴)stylelint.config.js
文件它的配置也非常簡(jiǎn)單,只有 rules
、 extends
、 plugins
、 processors
、 ignoreFiles
和 defaultSeverity
。
其中 defaultSeverity
只支持 "warning"
和 "error"
兩種,用于定義全局默認(rèn)的報(bào)錯(cuò)等級(jí)。但是它沒(méi)有相應(yīng)的 cli 選項(xiàng),實(shí)際上不太好用——比如你想 stylelint-webpack-plugin
只是警告,而 git-hooks 則是直接報(bào)錯(cuò)不允許提交的時(shí)候。文檔上關(guān)于如何對(duì)規(guī)則多帶帶配置錯(cuò)誤等級(jí)有一句話提到了如何去控制:
Different reporters may use these severity levels in different way, e.g. display them differently, or exit the process differently.
但是卻沒(méi)有在其他地方或者 Developer guide 中找到任何與 reporters 有關(guān)的信息,有可能是需要自己寫一個(gè) formatter 。
一個(gè)簡(jiǎn)單的配置示例:
// stylelint.config.js
module.exports = {
'defaultSeverity': 'error',
'extends': [ 'stylelint-config-standard' ],
'plugins': [ 'stylelint-scss' ],
'rules': {
// 不要使用已被 autoprefixer 支持的瀏覽器前綴
'media-feature-name-no-vendor-prefix': true,
'at-rule-no-vendor-prefix': true,
'selector-no-vendor-prefix': true,
'property-no-vendor-prefix': true,
'value-no-vendor-prefix': true
}
};
由于可以用 stylelint-scss
去解析文件中的 scss 代碼,我們暫時(shí)不需要使用官方列出的任何 processors
。
雖然可以通過(guò)配置 ignoreFiles
來(lái)簡(jiǎn)單實(shí)現(xiàn),但是我們可能期望在一些遺留的老舊代碼上先暫時(shí)不啟用 stylelint ,等后續(xù)再慢慢放開(kāi),這樣的話需要配置的文件路徑就有點(diǎn)多了。為了方便我們可以再編寫一個(gè) .stylelintignore
文件,它的語(yǔ)法是跟 .gitignore
和 .eslintignore
一樣的:
# .stylelintignore
# 舊的不需打包的樣式庫(kù)
*.min.css
# 其他類型文件
*.js
*.jpg
*.woff
# 測(cè)試和打包目錄
/test/
/dist/
# 通過(guò)反取忽略目錄
/src/component/*
!/src/component/CompA
!/src/component/CompB
# 這樣的效果是除 CompA 和 CompB 外其他目錄都會(huì)被忽略
更多可以參考 node-ignore
。
如果項(xiàng)目中已經(jīng)在用 husky 的 pre-commit
鉤子來(lái)運(yùn)行 eslint ,現(xiàn)在要加 stylelint 其實(shí)很簡(jiǎn)單:
// package.json
{
...
"lint-staged": {
"*.{vue,js}": [
"eslint --fix",
"git add"
],
"*.{html,vue,css,sass,scss}": [
"stylelint --fix",
"git add",
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
}
}
}
唯一需要注意的是, lint-staged 默認(rèn)是并行運(yùn)行的,同時(shí)對(duì) .vue
文件做 git add
會(huì)不會(huì)有沖突?暫時(shí)未在網(wǎng)上見(jiàn)相關(guān)討論,我自己運(yùn)行也沒(méi)有任何問(wèn)題,如果實(shí)在擔(dān)心的話,可以將 glob 匹配分開(kāi)定義。
也是跟 eslint 類似的,我們可以通過(guò) stylelint-disable
注釋來(lái)局部禁用某一項(xiàng)規(guī)則。
但是隨之而來(lái)的是一個(gè)常見(jiàn)錯(cuò)誤:你在文件頭部忽略了對(duì)瀏覽器前綴的提示,卻在另一個(gè)遙遠(yuǎn)的地方由于暫時(shí)性允許同名屬性,通過(guò) /* stylelint-enable */
把之前所有忽略的規(guī)則都重新開(kāi)啟了。所以一定要注意,只 enable 對(duì)應(yīng)的規(guī)則,形成呼應(yīng):
解析 .vue
文件(單文件組件)時(shí)請(qǐng)勿使用 processors
網(wǎng)上一些過(guò)時(shí)的教程包括 github 上的討論都推薦使用 stylelint-processor-html
或者 @mapbox/stylelint-processor-arbitrary-tags
來(lái)解析 html 或 vue 中的 css ,這本身并沒(méi)有什么問(wèn)題,但是這個(gè)插件有個(gè) bug ,當(dāng)指定 stylelint 的 --fix
后將會(huì)把 vue 文件中 以外的部分刪掉。
我們使用自定義語(yǔ)法 postcss-html
或者保留 stylelint-scss
插件就足夠了。
一些規(guī)則在跑 --fix
選項(xiàng)時(shí)是有 bug 的
比如 declaration-block-semicolon-newline-after
設(shè)置 "always"
時(shí),不允許多條 css 規(guī)則寫在一行,但自動(dòng)修復(fù)后可能會(huì)出現(xiàn)縮進(jìn)不正確:
修復(fù)后(示例,之前配置時(shí)沒(méi)嘗試去找必現(xiàn)路徑):
如果你也出現(xiàn)這種情況,可以再指定 indentation
規(guī)則的基準(zhǔn)縮進(jìn)( baseIndentLevel
):
module.exports = {
...
rules: {
...
'indentation': [2, {
'baseIndentLevel': 1,
}],
'declaration-block-semicolon-newline-after': 'always'
}
};
本文基于 知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際許可協(xié)議 發(fā)布,歡迎引用、轉(zhuǎn)載或演繹,但是必須保留本文的署名 BlackStorm 以及本文鏈接 http://www.cnblogs.com/BlackStorm/p/add-stylelint-to-your-vue-project.html ,且未經(jīng)許可不能用于商業(yè)目的。如有疑問(wèn)或授權(quán)協(xié)商請(qǐng)與我聯(lián)系。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/1365.html
摘要:為此我們需要安裝這個(gè)是用于提交代碼的鉤子函數(shù)安裝完之后,我們就需要在增加運(yùn)行鉤子函數(shù)。等鉤子函數(shù)這樣就簡(jiǎn)單的成功對(duì)代碼進(jìn)行效驗(yàn)了,當(dāng)然這邊更進(jìn)一步的可以使用這個(gè)可以將取得所有被提交的文件依次執(zhí)行寫好的任務(wù)。 一個(gè)項(xiàng)目是會(huì)有多個(gè)成員來(lái)開(kāi)發(fā)的,因此統(tǒng)一開(kāi)發(fā)規(guī)范是很有必要的,不然每個(gè)人都有自己的風(fēng)格,同步之后代碼都會(huì)報(bào)錯(cuò)。我這邊是用Vscode編譯器的。 首先用vue-cli3.0創(chuàng)建一個(gè)工...
摘要:從到再到搭建編寫構(gòu)建一個(gè)前端項(xiàng)目選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架搭建一個(gè)前端項(xiàng)目的方式有兩種選擇現(xiàn)成的項(xiàng)目模板自己搭建項(xiàng)目骨架。使用版本控制系統(tǒng)管理源代碼項(xiàng)目搭建好后,需要一個(gè)版本控制系統(tǒng)來(lái)管理源代碼。 從 0 到 1 再到 100, 搭建、編寫、構(gòu)建一個(gè)前端項(xiàng)目 1. 選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架 搭建一個(gè)前端項(xiàng)目的方式有兩種:選擇現(xiàn)成的項(xiàng)目模板、自己搭建項(xiàng)目骨架。 ...
摘要:從到再到搭建編寫構(gòu)建一個(gè)前端項(xiàng)目選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架搭建一個(gè)前端項(xiàng)目的方式有兩種選擇現(xiàn)成的項(xiàng)目模板自己搭建項(xiàng)目骨架。使用版本控制系統(tǒng)管理源代碼項(xiàng)目搭建好后,需要一個(gè)版本控制系統(tǒng)來(lái)管理源代碼。 從 0 到 1 再到 100, 搭建、編寫、構(gòu)建一個(gè)前端項(xiàng)目 1. 選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架 搭建一個(gè)前端項(xiàng)目的方式有兩種:選擇現(xiàn)成的項(xiàng)目模板、自己搭建項(xiàng)目骨架。 ...
摘要:從到再到搭建編寫構(gòu)建一個(gè)前端項(xiàng)目選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架搭建一個(gè)前端項(xiàng)目的方式有兩種選擇現(xiàn)成的項(xiàng)目模板自己搭建項(xiàng)目骨架。使用版本控制系統(tǒng)管理源代碼項(xiàng)目搭建好后,需要一個(gè)版本控制系統(tǒng)來(lái)管理源代碼。 從 0 到 1 再到 100, 搭建、編寫、構(gòu)建一個(gè)前端項(xiàng)目 1. 選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架 搭建一個(gè)前端項(xiàng)目的方式有兩種:選擇現(xiàn)成的項(xiàng)目模板、自己搭建項(xiàng)目骨架。 ...
摘要:代碼質(zhì)量這個(gè)術(shù)語(yǔ)對(duì)于程序員來(lái)說(shuō)并不陌生。在本文中,我們將探討我們?nèi)绾文軌蚶脦椭覀?,保持我們的代碼質(zhì)量更高。怎樣使用在這篇文章中,我們重點(diǎn)介紹幾個(gè)插件,可以幫助我們提高代碼質(zhì)量。使用相當(dāng)簡(jiǎn)單的。這兩個(gè)插件可用于代碼分析。 代碼質(zhì)量這個(gè)術(shù)語(yǔ)對(duì)于程序員來(lái)說(shuō)并不陌生。畢竟,每個(gè)開(kāi)發(fā)人員都知道,代碼只是能工作是不夠的。它還應(yīng)該具備其他要素:它應(yīng)該是可讀的,良好的格式和一致性。它也應(yīng)該符合一些...
閱讀 736·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6183·2021-11-29 11:00