Отступ
Принудительно обеспечить согласованный отступ
Некоторые проблемы, обнаруженные этим правилом, автоматически исправляются с помощью опции командной строки --fix командной строки
Это правило было устаревшим в ESLint v8.53.0. Пожалуйста, используйте соответствующее правило в @stylistic/eslint-plugin-js.
Существует несколько общих руководств, которые требуют определенного отступа вложенных блоков и инструкций, таких как:
function hello(indentSize, type) {
if (indentSize === 4 && type !== 'tab') {
console.log('Each next indentation will increase on 4 spaces');
}
}
Это наиболее распространенные сценарии, рекомендуемые в различных руководствах по стилю:
- Два пробела, не более, без табуляции: Google, npm, Node.js, Idiomatic, Felix
- Табуляция: jQuery
- Четыре пробела: Crockford
Подробное описание правила
Это правило навязывает согласованный стиль отступа. По умолчанию используется стиль 4 spaces.
Опции
Это правило имеет смешанную опцию:
Например, для отступа в 2 пробела:
{
"indent": ["error", 2]
}
Или для отступа с табуляцией:
{
"indent": ["error", "tab"]
}
Примеры некорректного кода для этого правила с опциями по умолчанию:
/*eslint indent: "error"*/
if (a) {
b=c;
function foo(d) {
e=f;
}
}
Примеры корректного кода для этого правила с опциями по умолчанию:
/*eslint indent: "error"*/
if (a) {
b=c;
function foo(d) {
e=f;
}
}
Это правило имеет опцию объекта:
-
"ignoredNodes"может использоваться для отключения проверки отступа для любого узла AST. Это принимает массив селекторов. Если узел AST соответствует любому из селекторов, отступ токенов, которые являются непосредственными дочерними элементами этого узла, будет проигнорирован. Это может быть использовано как отступ, чтобы ослабить правило, если вы не согласны с отступом, который оно навязывает для определенного синтаксического паттерна. -
"SwitchCase"(по умолчанию: 0) навязывает уровень отступа дляcaseвswitchинструкциях -
"VariableDeclarator"(по умолчанию: 1) навязывает уровень отступа дляvarдеклараторов; также может принимать объект для определения отдельных правил дляvar,letиconstобъявлений. Также может быть"first", что указывает на то, что все деклараторы должны быть выровнены с первым декларатором. -
"outerIIFEBody"(по умолчанию: 1) навязывает уровень отступа для IIFE на уровне файла. Это также может быть установлено на"off", чтобы отключить проверку для IIFE на уровне файла. -
"MemberExpression"(по умолчанию: 1) навязывает уровень отступа для многострочных цепочек свойств. Это также может быть установлено на"off", чтобы отключить проверку отступа для MemberExpression. -
"FunctionDeclaration"принимает объект для определения правил для объявлений функций.-
parameters(по умолчанию: 1) навязывает уровень отступа для параметров в объявлении функции. Это может быть число, обозначающее уровень отступа, или строка"first", указывающая, что все параметры объявления должны быть выровнены с первым параметром. Это также может быть установлено на"off", чтобы отключить проверку параметров FunctionDeclaration. -
body(по умолчанию: 1) навязывает уровень отступа для тела объявления функции.
-
-
"FunctionExpression"принимает объект для определения правил для выражений функций.-
parameters(по умолчанию: 1) навязывает уровень отступа для параметров в выражении функции. Это может быть число, обозначающее уровень отступа, или строка"first", указывающая, что все параметры выражения должны быть выровнены с первым параметром. Это также может быть установлено на"off", чтобы отключить проверку параметров FunctionExpression. -
body(по умолчанию: 1) навязывает уровень отступа для тела выражения функции.
-
-
"StaticBlock"принимает объект для определения правил для статических блоков класса.-
body(по умолчанию: 1) навязывает уровень отступа для тела статического блока класса.
-
-
"CallExpression"принимает объект для определения правил для выражений вызова функций.-
arguments(по умолчанию: 1) навязывает уровень отступа для аргументов в выражении вызова. Это может быть число, обозначающее уровень отступа, или строка"first", указывающая, что все аргументы выражения должны быть выровнены с первым аргументом. Это также может быть установлено на"off", чтобы отключить проверку аргументов CallExpression.
-
-
"ArrayExpression"(по умолчанию: 1) навязывает уровень отступа для элементов в массивах. Может быть установлено на строку"first", указывающую, что все элементы в массиве должны быть выровнены с первым элементом. Это также может быть установлено на"off"для отключения проверки элементов массива. -
"ObjectExpression"(по умолчанию: 1) навязывает уровень отступа для свойств в объектах. Может быть установлено на строку"first", указывающую, что все свойства в объекте должны быть выровнены с первым свойством. Это также может быть установлено на"off"для отключения проверки свойств объекта. -
"ImportDeclaration"(по умолчанию: 1) навязывает уровень отступа для инструкций импорта. Может быть установлено на строку"first", указывающую, что все импортированные члены из модуля должны быть выровнены с первым членом в списке. Это также может быть установлено на"off"для отключения проверки импортированных членов модуля. -
"flatTernaryExpressions": true(по умолчаниюfalse) не требует отступа для условных операторов, вложенных в другие условные операторы. -
"offsetTernaryExpressions": true(по умолчаниюfalse) требует отступа для значений условных операторов. -
"ignoreComments"(по умолчанию: false) может использоваться, когда комментарии не должны быть выровнены с узлами на предыдущей или следующей строке.
Уровень отступа обозначает кратное указанному отступу. Пример:
- Отступ в 4 пробела с
VariableDeclarator, установленным на2, отступит многострочные объявления переменных на 8 пробелов. - Отступ в 2 пробела с
VariableDeclarator, установленным на2, отступит многострочные объявления переменных на 4 пробела. - Отступ в 2 пробела с
VariableDeclarator, установленным на{"var": 2, "let": 2, "const": 3}, отступит многострочные объявления переменных на 4 пробела дляvarиlet, 6 пробелов дляconstинструкций. - Отступ в табуляцию с
VariableDeclarator, установленным на2, отступит многострочные объявления переменных на 2 табуляции. - Отступ в 2 пробела с
SwitchCase, установленным на0, не будет отступатьcaseс учётомswitchинструкций. - Отступ в 2 пробела с
SwitchCase, установленным на1, отступитcaseна 2 пробела относительноswitchинструкций. - Отступ в 2 пробела с
SwitchCase, установленным на2, отступитcaseна 4 пробела относительноswitchинструкций. - Отступ в табуляцию с
SwitchCase, установленным на2, отступитcaseна 2 табуляции относительноswitchинструкций. - Отступ в 2 пробела с
MemberExpression, установленным на0, отступит многострочные цепочки свойств на 0 пробелов. - Отступ в 2 пробела с
MemberExpression, установленным на1, отступит многострочные цепочки свойств на 2 пробела. - Отступ в 2 пробела с
MemberExpression, установленным на2, отступит многострочные цепочки свойств на 4 пробела. - Отступ в 4 пробела с
MemberExpression, установленным на0, отступит многострочные цепочки свойств на 0 пробелов. - Отступ в 4 пробела с
MemberExpression, установленным на1, отступит многострочные цепочки свойств на 4 пробела. - Отступ в 4 пробела с
MemberExpression, установленным на2, отступит многострочные цепочки свойств на 8 пробелов.
Табуляция
Примеры некорректного кода для этого правила с опцией "tab":
/*eslint indent: ["error", "tab"]*/
if (a) {
b=c;
function foo(d) {
e=f;
}
}
Примеры корректного кода для этого правила с опцией "tab":
/*eslint indent: ["error", "tab"]*/
if (a) {
b=c;
function foo(d) {
e=f;
}
}
ignoredNodes
Следующая конфигурация игнорирует отступ для ConditionalExpression (“условного оператора”) узлов:
Примеры корректного кода для этого правила с опцией 4, { "ignoredNodes": ["ConditionalExpression"] }:
/*eslint indent: ["error", 4, { "ignoredNodes": ["ConditionalExpression"] }]*/
var a = foo
? bar
: baz;
var a = foo
? bar
: baz;
Следующая конфигурация игнорирует отступ в теле IIFE.
Примеры корректного кода для этого правила с опцией 4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }:
/*eslint indent: ["error", 4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }]*/
(function() {
foo();
bar();
})();
Все типы узлов AST можно найти в спецификации ESTree. Вы можете использовать AST Explorer с парсером espree, чтобы изучить дерево AST фрагмента кода.
SwitchCase
Примеры неправильного кода для этой правила с 2, { "SwitchCase": 1 } опциями:
/*eslint indent: ["error", 2, { "SwitchCase": 1 }]*/
switch(a){
case "a":
break;
case "b":
break;
}
Примеры правильного кода для этого правила с 2, { "SwitchCase": 1 } опцией:
/*eslint indent: ["error", 2, { "SwitchCase": 1 }]*/
switch(a){
case "a":
break;
case "b":
break;
}
VariableDeclarator
Примеры неправильного кода для этого правила с 2, { "VariableDeclarator": 1 } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": 1 }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
Примеры правильного кода для этого правила с 2, { "VariableDeclarator": 1 } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": 1 }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
Примеры правильного кода для этого правила с 2, { "VariableDeclarator": 2 } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": 2 }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
Примеры неправильного кода для этого правила с 2, { "VariableDeclarator": "first" } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": "first" }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
Примеры правильного кода для этого правила с 2, { "VariableDeclarator": "first" } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": "first" }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
Примеры правильного кода для этого правила с 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } } опциями:
/*eslint indent: ["error", 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }]*/
var a,
b,
c;
let d,
e,
f;
const g = 1,
h = 2,
i = 3;
outerIIFEBody
Примеры неправильного кода для этого правила с опциями 2, { "outerIIFEBody": 0 }:
/*eslint indent: ["error", 2, { "outerIIFEBody": 0 }]*/
(function() {
function foo(x) {
return x + 1;
}
})();
if (y) {
console.log('foo');
}
Примеры правильного кода для этого правила с опциями 2, { "outerIIFEBody": 0 }:
/*eslint indent: ["error", 2, { "outerIIFEBody": 0 }]*/
(function() {
function foo(x) {
return x + 1;
}
})();
if (y) {
console.log('foo');
}
Примеры правильного кода для этого правила с опциями 2, { "outerIIFEBody": "off" }:
/*eslint indent: ["error", 2, { "outerIIFEBody": "off" }]*/
(function() {
function foo(x) {
return x + 1;
}
})();
(function() {
function foo(x) {
return x + 1;
}
})();
if (y) {
console.log('foo');
}
MemberExpression
Примеры неправильного кода для этого правила с 2, { "MemberExpression": 1 } опциями:
/*eslint indent: ["error", 2, { "MemberExpression": 1 }]*/
foo
.bar
.baz()
Примеры правильного кода для этого правила с 2, { "MemberExpression": 1 } опцией:
/*eslint indent: ["error", 2, { "MemberExpression": 1 }]*/
foo
.bar
.baz();
FunctionDeclaration
Примеры неправильного кода для этого правила с 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} } опцией:
/*eslint indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/
function foo(bar,
baz,
qux) {
qux();
}
Примеры правильного кода для этого правила с 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} } опцией:
/*eslint indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/
function foo(bar,
baz,
qux) {
qux();
}
Примеры неправильного кода для этого правила с 2, { "FunctionDeclaration": {"parameters": "first"} } опцией:
/*eslint indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/
function foo(bar, baz,
qux, boop) {
qux();
}
Примеры правильного кода для этого правила с 2, { "FunctionDeclaration": {"parameters": "first"} } опцией:
/*eslint indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/
function foo(bar, baz,
qux, boop) {
qux();
}
FunctionExpression
Примеры неправильного кода для этого правила с 2, { "FunctionExpression": {"body": 1, "parameters": 2} } опцией:
/*eslint indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/
var foo = function(bar,
baz,
qux) {
qux();
}
Примеры правильного кода для этого правила с 2, { "FunctionExpression": {"body": 1, "parameters": 2} } опцией:
/*eslint indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/
var foo = function(bar,
baz,
qux) {
qux();
}
Примеры неправильного кода для этого правила с опцией 2, { "FunctionExpression": {"parameters": "first"} }:
/*eslint indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/
var foo = function(bar, baz,
qux, boop) {
qux();
}
Примеры правильного кода для этого правила с опцией 2, { "FunctionExpression": {"parameters": "first"} }:
/*eslint indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/
var foo = function(bar, baz,
qux, boop) {
qux();
}
StaticBlock
Примеры неправильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 1} }:
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 1} }]*/
class C {
static {
foo();
}
}
Примеры правильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 1} }:
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 1} }]*/
class C {
static {
foo();
}
}
Примеры неправильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 2} }:
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 2} }]*/
class C {
static {
foo();
}
}
Примеры правильного кода для этого правила с опцией 2, { "StaticBlock": {"body": 2} }:
/*eslint indent: ["error", 2, { "StaticBlock": {"body": 2} }]*/
class C {
static {
foo();
}
}
CallExpression
Примеры неправильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": 1} }:
/*eslint indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/
foo(bar,
baz,
qux
);
Примеры правильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": 1} }:
/*eslint indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/
foo(bar,
baz,
qux
);
Примеры неправильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": "first"} }:
/*eslint indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/
foo(bar, baz,
baz, boop, beep);
Примеры правильного кода для этого правила с опцией 2, { "CallExpression": {"arguments": "first"} }:
/*eslint indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/
foo(bar, baz,
baz, boop, beep);
ArrayExpression
Примеры неправильного кода для этого правила с опцией 2, { "ArrayExpression": 1 }:
/*eslint indent: ["error", 2, { "ArrayExpression": 1 }]*/
var foo = [
bar,
baz,
qux
];
Примеры правильного кода для этого правила с опцией 2, { "ArrayExpression": 1 }:
/*eslint indent: ["error", 2, { "ArrayExpression": 1 }]*/
var foo = [
bar,
baz,
qux
];
Примеры неправильного кода для этого правила с опцией 2, { "ArrayExpression": "first" }:
/*eslint indent: ["error", 2, {"ArrayExpression": "first"}]*/
var foo = [bar,
baz,
qux
];
Примеры правильного кода для этого правила с опцией 2, { "ArrayExpression": "first" }:
/*eslint indent: ["error", 2, {"ArrayExpression": "first"}]*/
var foo = [bar,
baz,
qux
];
ObjectExpression
Примеры неправильного кода для этого правила с опцией 2, { "ObjectExpression": 1 }:
/*eslint indent: ["error", 2, { "ObjectExpression": 1 }]*/
var foo = {
bar: 1,
baz: 2,
qux: 3
};
Примеры правильного кода для этого правила с опцией 2, { "ObjectExpression": 1 }:
/*eslint indent: ["error", 2, { "ObjectExpression": 1 }]*/
var foo = {
bar: 1,
baz: 2,
qux: 3
};
Примеры неправильного кода для этого правила с опцией 2, { "ObjectExpression": "first" }:
/*eslint indent: ["error", 2, {"ObjectExpression": "first"}]*/
var foo = { bar: 1,
baz: 2 };
Примеры правильного кода для этого правила с опцией 2, { "ObjectExpression": "first" }:
/*eslint indent: ["error", 2, {"ObjectExpression": "first"}]*/
var foo = { bar: 1,
baz: 2 };
ImportDeclaration
Примеры правильного кода для этого правила с опцией 4, { "ImportDeclaration": 1 } (по умолчанию):
/*eslint indent: ["error", 4, { "ImportDeclaration": 1 }]*/
import { foo,
bar,
baz,
} from 'qux';
/*eslint indent: ["error", 4, { "ImportDeclaration": 1 }]*/
import {
foo,
bar,
baz,
} from 'qux';
Примеры неправильного кода для этого правила с опцией 4, { "ImportDeclaration": "first" }:
/*eslint indent: ["error", 4, { "ImportDeclaration": "first" }]*/
import { foo,
bar,
baz,
} from 'qux';
Примеры правильного кода для этого правила с опцией 4, { "ImportDeclaration": "first" }:
/*eslint indent: ["error", 4, { "ImportDeclaration": "first" }]*/
import { foo,
bar,
baz,
} from 'qux';
flatTernaryExpressions
Примеры неправильного кода для этой правила с параметрами по умолчанию 4, { "flatTernaryExpressions": false }:
/*eslint indent: ["error", 4, { "flatTernaryExpressions": false }]*/
var a =
foo ? bar :
baz ? qux :
boop;
Примеры правильного кода для этой правила с параметрами по умолчанию 4, { "flatTernaryExpressions": false }:
/*eslint indent: ["error", 4, { "flatTernaryExpressions": false }]*/
var a =
foo ? bar :
baz ? qux :
boop;
Примеры неправильного кода для этой правила с параметром 4, { "flatTernaryExpressions": true }:
/*eslint indent: ["error", 4, { "flatTernaryExpressions": true }]*/
var a =
foo ? bar :
baz ? qux :
boop;
Примеры правильного кода для этой правила с параметром 4, { "flatTernaryExpressions": true }:
/*eslint indent: ["error", 4, { "flatTernaryExpressions": true }]*/
var a =
foo ? bar :
baz ? qux :
boop;
offsetTernaryExpressions
Примеры неправильного кода для этого правила с параметрами по умолчанию 2, { "offsetTernaryExpressions": false }:
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": false }]*/
condition
? () => {
return true
}
: () => {
false
}
Примеры правильного кода для этого правила с параметрами по умолчанию 2, { "offsetTernaryExpressions": false }:
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": false }]*/
condition
? () => {
return true
}
: condition2
? () => {
return true
}
: () => {
return false
}
Примеры неправильного кода для этого правила с параметром 2, { "offsetTernaryExpressions": true }:
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": true }]*/
condition
? () => {
return true
}
: condition2
? () => {
return true
}
: () => {
return false
}
Примеры правильного кода для этого правила с параметром 2, { "offsetTernaryExpressions": true }:
/*eslint indent: ["error", 2, { "offsetTernaryExpressions": true }]*/
condition
? () => {
return true
}
: condition2
? () => {
return true
}
: () => {
return false
}
ignoreComments
Примеры дополнительного правильного кода для этого правила с параметром 4, { "ignoreComments": true }:
/*eslint indent: ["error", 4, { "ignoreComments": true }] */
if (foo) {
doSomething();
// comment intentionally de-indented
doSomethingElse();
}
Совместимость
-
JSHint:
indent - JSCS: validateIndentation
Версия
Это правило было добавлено в ESLint v0.14.0.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/indent