前言
ESLint v6.0.0是ESLint的主要版本,此版本中做了一些重大更改。
下面的列表大致按每個(gè)更改預(yù)計(jì)會(huì)影響的用戶數(shù)量排序鳄乏,其中第一個(gè)項(xiàng)目預(yù)計(jì)會(huì)影響大多數(shù)用戶
對(duì)用戶來說的重大變化
- 不再支持Node.js 6
eslint:recommended
已更新- 插件和可共享配置不再受ESLint位置的影響
- 默認(rèn)解析器現(xiàn)在更嚴(yán)格地驗(yàn)證選項(xiàng)
- 默認(rèn)情況下瞳浦,
no-redeclare
規(guī)則現(xiàn)在更加嚴(yán)格- 默認(rèn)情況下盖文,
comma-dangle
規(guī)則現(xiàn)在更加嚴(yán)格- 默認(rèn)情況下饭弓,
no-confusing-arrow
規(guī)則現(xiàn)在更寬松- 配置文件中的重寫 現(xiàn)在可以匹配dotfiles
- 現(xiàn)在双饥,父配置文件可以重寫 擴(kuò)展配置文件中的重寫規(guī)則
- 現(xiàn)在驗(yàn)證全局變量的配置值
- 已棄用的experimentalObjectRestSpread選項(xiàng)已被刪除
- 使用unicode 解析 規(guī)則選項(xiàng) 中用戶提供的正則表達(dá)式
對(duì)自定義插件的開發(fā)人員的重大變化
- 插件作者可能需要更新安裝說明
- RuleTester 現(xiàn)在驗(yàn)證規(guī)則列表 中的無效默認(rèn)關(guān)鍵字
- RuleTester現(xiàn)在需要
parser
選項(xiàng)的絕對(duì)路徑- 已刪除eslintExplicitGlobalComment范圍分析屬性
對(duì)集成開發(fā)者的 重大變化
- 插件和可共享配置不再受ESLint位置的影響
- Linter不再嘗試從文件系統(tǒng)加載丟失的解析器
變化詳述
1. 不再支持Node.js 6
截至2019年4月,Node.js 6將在EOL示启,將不再接收安全更新兢哭。因此领舰,我們決定在ESLint v6中放棄對(duì)它的支持夫嗓。我們現(xiàn)在支持以下版本的Node.js:
- Node.js 8 (8.10.0 and above)
- Node.js 10 (10.13.0 and above)
- Anything above Node.js 11.10.1
使用ESLint v6時(shí),請(qǐng)確保至少升級(jí)到Node.js 8冲秽。如果您無法升級(jí)舍咖,我們建議您繼續(xù)使用ESLint v5.x,直到您能夠升級(jí)Node.js.
2. eslint:recommended
已更新
以下規(guī)則已添加到eslint:recommended config:
no-async-promise-executor
不允許使用異步函數(shù)作為Promise構(gòu)造函數(shù)的參數(shù)锉桑,這通常是一個(gè)bug排霉。no-misleading-character-class
報(bào)告正則表達(dá)式中可能無法按預(yù)期運(yùn)行的字符類。no-prototype-builtins
定義方法調(diào)用民轴,如foo.hasOwnProperty(“bar”)(這是bug的常見來源)攻柠,并建議將它們替換為Object.prototype.hasOwnProperty.call(foo,“bar”)后裸。no-shadow-restricted-names
不允許使用未定義的陰影變量(例如使用let undefined = 5等代碼)瑰钮,因?yàn)樗赡軙?huì)使讀者感到困惑.no-useless-catch
報(bào)告catch子句是多余的,可以從代碼中刪除而不改變其行為.no-with
禁止使用with語句微驶,這會(huì)使代碼難以理解并導(dǎo)致兼容性問題浪谴。require-atomic-updates
報(bào)告在異步函數(shù)中重新分配變量時(shí)可能發(fā)生的競(jìng)爭(zhēng)條件錯(cuò)誤
此外,以下規(guī)則已從
eslint:recommended
中刪除
no-console
不允許調(diào)用console.log之類的函數(shù)因苹。雖然此規(guī)則在許多情況下很有用(例如苟耻,為了避免無意中將調(diào)試語句留在生產(chǎn)代碼中),但它并不像eslint:recommended
中的其他規(guī)則那樣廣泛適用扶檐,并且在console.log的情況下它是誤報(bào)的來源是可以接受的(例如在CLI應(yīng)用程序中)
最后凶杖,在ESLint v5 eslint中:
eslint:recommended
將明確禁用所有未被視為“recommended”的核心規(guī)則。如果eslint:recommended在另一個(gè)配置之后被加載款筑,這可能會(huì)導(dǎo)致令人困惑官卡,因?yàn)閑slint:recommended會(huì)產(chǎn)生關(guān)閉某些規(guī)則的效果蝗茁。在ESLint v6中,eslint:recommended對(duì)非推薦規(guī)則沒有影響寻咒。
要模仿eslint:5.x中推薦的行為哮翘,您可以在配置文件中顯式禁用/啟用規(guī)則,如下所示:
{
"extends": "eslint:recommended",
"rules": {
"no-async-promise-executor": "off",
"no-misleading-character-class": "off",
"no-prototype-builtins": "off",
"no-shadow-restricted-names": "off",
"no-useless-catch": "off",
"no-with": "off",
"require-atomic-updates": "off",
"no-console": "error"
}
}
在極少數(shù)情況下(如果您依賴以前
eslint:recommended
禁用核心規(guī)則)毛秘,您可能需要禁用這些規(guī)則來恢復(fù)以前的行為饭寺。
3. 插件和可共享配置不再受ESLint位置的影響
以前,ESLint相對(duì)于ESLint包本身的位置加載了插件叫挟。因此艰匙,我們建議使用全局ESLint安裝的用戶也應(yīng)該全局安裝插件,而使用本地ESLint安裝的用戶應(yīng)該在本地安裝插件抹恳。但是员凝,由于設(shè)計(jì)錯(cuò)誤,此策略導(dǎo)致ESLint在某些情況下隨機(jī)無法加載插件和可共享配置奋献,尤其是在使用lerna和Yarn Plug n'Play等包管理工具時(shí)健霹。
據(jù)經(jīng)驗(yàn):使用ESLint v6,即使全局安裝了ESLint瓶蚂,也應(yīng)始終在本地安裝插件糖埋。更確切地說,ESLint v6默認(rèn)解析相對(duì)于最終用戶項(xiàng)目的插件窃这,并且總是相對(duì)于導(dǎo)入它們的配置文件的位置解析可共享配置和解析器瞳别。
如果您使用ESLint的全局安裝(例如,使用npm install eslint --global安裝)以及插件杭攻,則應(yīng)在運(yùn)行ESLint的項(xiàng)目中本地安裝這些插件祟敛。如果您的配置文件擴(kuò)展了可共享的配置和/或解析器,則應(yīng)確保將這些包安裝為包含配置文件的項(xiàng)目的依賴項(xiàng)兆解。
如果您使用位于本地項(xiàng)目之外的配置文件(帶有--config標(biāo)志)馆铁,請(qǐng)考慮將插件安裝為該配置文件的依賴項(xiàng),并將--resolve-plugins-relative-to標(biāo)志設(shè)置為配置文件的
location
痪宰。
4. 默認(rèn)解析器現(xiàn)在更嚴(yán)格地驗(yàn)證選項(xiàng)
espree是ESLint使用的默認(rèn)解析器叼架,現(xiàn)在會(huì)在以下情況下引發(fā)錯(cuò)誤:
ecmaVersion
解析器選項(xiàng)設(shè)置為數(shù)字以外的其他選項(xiàng),例如字符串“2015”衣撬。 (以前乖订,會(huì)忽略非數(shù)字選項(xiàng)。)- The sourceType: "module" parser option is set while ecmaVersion is set to 5 or left unspecified. (Previously, setting sourceType: "module" would implicitly cause ecmaVersion to be set to a minimum of 2015, which could be surprising.)
- sourceType設(shè)置為“script”或“module”以外的任何內(nèi)容具练。
- 如果您的配置將ecmaVersion設(shè)置為數(shù)字以外的其他內(nèi)容乍构,則可以通過刪除ecmaVersion來恢復(fù)以前的行為。 (但是,您可能需要仔細(xì)檢查您的配置是否實(shí)際按預(yù)期工作哥遮。)如果您的配置設(shè)置了parserOptions:{sourceType:“module”}而沒有設(shè)置parserOptions.ecmaVersion岂丘,則應(yīng)添加parserOptions:{ecmaVersion:2015}恢復(fù)以前的行為。
5. 默認(rèn)情況下眠饮,no-redeclare 規(guī)則現(xiàn)在更加嚴(yán)格
no-redeclare規(guī)則的默認(rèn)選項(xiàng)已從{builtinGlobals:false}更改為{builtinGlobals:true}奥帘。此外,no-redeclare規(guī)則現(xiàn)在將報(bào)告由/ * global foo * /等注釋啟用的全局變量的錯(cuò)誤仪召,如果這些全局變量已經(jīng)通過配置啟用了寨蹋。
要恢復(fù)規(guī)則的先前選項(xiàng),可以按如下方式進(jìn)行配置:
{
"rules": {
"no-redeclare": ["error", { "builtinGlobals": false }]
}
}
此外扔茅,如果您在代碼中看到全局注釋的新錯(cuò)誤已旧,則應(yīng)刪除這些注釋。
6. 默認(rèn)情況下召娜,comma-dangle 規(guī)則現(xiàn)在更加嚴(yán)格
以前运褪,除非顯式配置為檢查函數(shù)逗號(hào),否則逗號(hào)懸掛規(guī)則將忽略尾隨函數(shù)參數(shù)和參數(shù)玖瘸。在ESLint v6中秸讹,函數(shù)逗號(hào)的處理方式與其他類型的尾隨逗號(hào)相同。
You can restore the previous default behavior of the rule with:
{
"rules": {
"comma-dangle": ["error", {
"arrays": "never",
"objects": "never",
"imports": "never",
"exports": "never",
"functions": "ignore"
}]
}
}
要恢復(fù)字符串選項(xiàng)的先前行為店读,例如“always-multiline”嗦枢,請(qǐng)?jiān)谏厦娴氖纠袑ⅰ皀ever”替換為“always-multiline”
7. 默認(rèn)情況下攀芯,no-confusing-arrow 規(guī)則現(xiàn)在更寬松
no-confusing-arrow
規(guī)則的默認(rèn)選項(xiàng)已從{allowParens:false}更改為{allowParens:true}屯断。
You can restore the previous default behavior of the rule with:
{
"rules": {
"no-confusing-arrow": ["error", { "allowParens": false }]
}
}
8. 配置文件中的重寫 現(xiàn)在可以匹配dotfiles
- Due to a bug, the glob patterns in a files list in an overrides section of a config file would never match dotfiles, making it impossible to have overrides apply to files starting with a dot. This bug has been fixed in ESLint v6.
- If you don’t want dotfiles to be matched by an override, consider adding something like excludedFiles: [".*"] to that overrides section. See the documentation for more details.
9. 現(xiàn)在,父配置文件可以重寫 擴(kuò)展配置文件中的重寫規(guī)則
由于存在錯(cuò)誤侣诺,以前的情況是殖演,可共享配置中的覆蓋塊優(yōu)先于父配置的頂級(jí)。例如年鸳,使用以下配置設(shè)置趴久,即使在最終用戶的配置中明確禁用了
the semi rule
,也會(huì)最終啟用the semi rule
:
// .eslintrc.js
module.exports = {
extends: ["foo"],
rules: {
semi: "off"
}
};
// eslint-config-foo/index.js
module.exports = {
overrides: {
files: ["*.js"],
rules: {
semi: "error"
}
}
};
- In ESLint v6.0.0, a parent config always has precedence over extended configs, even with overrides blocks.
- 我們預(yù)計(jì)此問題的影響非常低搔确,因?yàn)榇蠖鄶?shù)可共享配置不使用overrides 塊彼棍。但是,如果您使用帶有overrides 塊的可共享配置膳算,則由于在配置中明確指定但在此之前處于非活動(dòng)狀態(tài)的某些內(nèi)容座硕,您可能會(huì)遇到行為更改。如果您希望從可共享配置繼承行為涕蜂,只需從您自己的配置中刪除相應(yīng)的條目华匾。 (在上面的示例中,可以通過從.eslintrc.js中刪除semi:“off”來恢復(fù)先前的行為机隙。)
10. 現(xiàn)在驗(yàn)證全局變量的配置值
以前蜘拉,在使用對(duì)象配置一組全局變量時(shí)萨西,可以使用任何內(nèi)容作為對(duì)象的值。未知值將被視為“可寫”旭旭。
// .eslintrc.js
module.exports = {
globals: {
foo: "readonly",
bar: "writable",
baz: "hello!" // ???
}
};
通過此更改谎脯,globals對(duì)象中的任何未知值都會(huì)導(dǎo)致配置驗(yàn)證錯(cuò)誤。
如果您在更新后看到與全局變量相關(guān)的配置驗(yàn)證錯(cuò)誤持寄,請(qǐng)確保為全局變量配置的所有值都是readonly穿肄,writeable或off。 (ESLint還接受一些替代拼寫和變體的兼容性际看。)
11. 已棄用的experimentalObjectRestSpread選項(xiàng)已被刪除
以前咸产,在使用默認(rèn)解析器時(shí),配置可以使用experimentalObjectRestSpread選項(xiàng)來啟用對(duì)象rest / spread屬性的解析支持:
{
"parserOptions": {
"ecmaFeatures": {
"experimentalObjectRestSpread": true
}
}
}
從ESLint v5開始仲闽,ecmaFeatures:{experimentalObjectRestSpread:true}已經(jīng)等同于ecmaVersion:2018脑溢,并且還發(fā)出了棄用警告。在ESLint v6中赖欣,experimentalObjectRestSpread功能已完全刪除且無效屑彻。如果您的配置依賴于experimentalObjectRestSpread來啟用ES2018解析,您可能會(huì)開始看到解析最近語法的錯(cuò)誤顶吮。
如果您使用experimentalObjectRestSpread選項(xiàng)社牲,則應(yīng)更改配置以包含此選項(xiàng)
{
"parserOptions": {
"ecmaVersion": 2018
}
}
12. 使用unicode 解析 規(guī)則選項(xiàng) 中用戶提供的正則表達(dá)式
max-len之類的規(guī)則接受一個(gè)字符串選項(xiàng),該選項(xiàng)被解釋為正則表達(dá)式悴了。在ESLint v6.0.0中搏恤,這些正則表達(dá)式使用unicode標(biāo)志進(jìn)行解釋,當(dāng)匹配像星體符號(hào)這樣的字符時(shí)湃交,它應(yīng)該表現(xiàn)出更合理的行為熟空。 Unicode正則表達(dá)式還比非unicode正則表達(dá)式更嚴(yán)格地驗(yàn)證轉(zhuǎn)義序列。
如果升級(jí)后出現(xiàn)規(guī)則選項(xiàng)驗(yàn)證錯(cuò)誤搞莺,請(qǐng)確保規(guī)則選項(xiàng)中的任何正則表達(dá)式都沒有無效的轉(zhuǎn)義序列息罗。
13. 插件作者可能需要更新安裝說明
如果您維護(hù)插件并提供安裝說明,則應(yīng)確保安裝說明是最新的才沧,其中包含有關(guān)插件加載方式的用戶更改迈喉。特別是,如果您的插件是使用generator-eslint包生成的温圆,那么它可能包含有關(guān)如何將插件與全局ESLint安裝一起使用的過時(shí)說明挨摸。
14. RuleTester現(xiàn)在驗(yàn)證規(guī)則模式中的無效默認(rèn)關(guān)鍵字
某些情況下,規(guī)則架構(gòu)可以使用default關(guān)鍵字自動(dòng)指定規(guī)則選項(xiàng)的默認(rèn)值捌木。但是油坝,default關(guān)鍵字僅在某些架構(gòu)位置有效,并在其他位置被忽略,如果規(guī)則錯(cuò)誤地預(yù)期將默認(rèn)值作為規(guī)則選項(xiàng)提供澈圈,則會(huì)產(chǎn)生錯(cuò)誤風(fēng)險(xiǎn)彬檀。但是,default關(guān)鍵字僅在某些架構(gòu)位置有效瞬女,并在其他位置被忽略窍帝,如果規(guī)則錯(cuò)誤地預(yù)期將默認(rèn)值作為規(guī)則選項(xiàng)提供,則會(huì)產(chǎn)生錯(cuò)誤風(fēng)險(xiǎn)诽偷。
如果RuleTester開始報(bào)告有關(guān)無效默認(rèn)值的錯(cuò)誤坤学,則可以刪除規(guī)則架構(gòu)中指定位置的默認(rèn)屬性,并且該規(guī)則的行為方式相同报慕。 (如果發(fā)生這種情況深浮,您可能還希望在該位置未提供選項(xiàng)值時(shí)驗(yàn)證規(guī)則是否正常運(yùn)行。)眠冈。
15. RuleTester現(xiàn)在需要 parser 選項(xiàng)的絕對(duì)路徑
To use custom parsers in tests, we could use parser property with a package name or file path. However, if a package name was given, it’s unclear where the tester should load the parser package from because the tester doesn’t know which files are running the tester. In ESLint v6.0.0, RuleTester disallows parser property with a package name.
如果在測(cè)試用例中使用包名稱的parser屬性飞苇,請(qǐng)使用require.resolve()函數(shù)更新它,以將包名稱解析為包的絕對(duì)路徑蜗顽。
16. 已刪除eslintExplicitGlobalComment范圍分析屬性
Previously, ESLint would add an eslintExplicitGlobalComment property to Variable objects in scope analysis to indicate that a variable was introduced as a result of a /* global / comment. This property was undocumented, and the ESLint team was unable to find any usage of the property outside of ESLint core. The property has been removed in ESLint v6, and replaced with the eslintExplicitGlobalComments property, which can contain a list of all / global */ comments if a variable was declared with more than one of them.
If you maintain a rule that uses the eslintExplicitGlobalComment property, update it to use the eslintExplicitGlobalComments property as a list instead.
17. Linter不再嘗試從文件系統(tǒng)加載丟失的解析器
Previously, when linting code with a parser that had not been previously defined, the Linter API would attempt to load the parser from the filesystem. However, this behavior was confusing because Linter never access the filesystem in any other cases, and it was difficult to ensure that the correct parser would be found when loading the parser from the filesystem.
In ESLint v6, Linter will no longer perform any filesystem operations, including loading parsers.
If you’re using Linter with a custom parser, use Linter#defineParser to explicitly define the parser before linting any code.