-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCode-Quality.txt
More file actions
207 lines (175 loc) · 11.9 KB
/
Copy pathCode-Quality.txt
File metadata and controls
207 lines (175 loc) · 11.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
🚀 Чек-лист: Настройка Code Quality (Vite + React + TS)
Архитектура качества кода держится на трех китах:
1. Prettier — отвечает за красоту (пробелы, кавычки, переносы строк).
2. ESLint — отвечает за логику (неиспользуемые переменные, ошибки синтаксиса, правила React).
3. TypeScript (tsc) — отвечает за типы (чтобы не передать строку туда, где ожидается число).
👉 Этап 1: Базовая установка пакетов
В новом проекте сразу устанавливаем все необходимые инструменты для связки линтера и форматтера (с учетом нового Flat Config для ESLint 9+):
npm install --save-dev prettier eslint-config-prettier eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh globals rimraf
👉 Этап 2: Конфигурационные файлы
1. Prettier
- Создаем файл .prettierrc в корне. Здесь задаем стандарты команды. Официальная документация: https://prettier.io/docs/options.html:
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 80,
"endOfLine": "auto"
}
- Создаем .prettierignore (чтобы не форматировать мусор):
node_modules
dist
build
.env
package-lock.json
public
2. ESLint (Flat Config)
- Удаляем все старые файлы .eslintrc... и создаем один eslint.config.mjs:
Секрет: Конфиг eslintConfigPrettier всегда должен идти последним в массиве, чтобы отключать конфликтные правила.
import js from '@eslint/js'
import globals from 'globals'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import eslintConfigPrettier from 'eslint-config-prettier'
export default [
{ ignores: ['dist', 'node_modules'] },
{
files: ['**/*.{js,jsx,ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: 'latest',
ecmaFeatures: { jsx: true },
sourceType: 'module',
},
},
settings: { react: { version: 'detect' } },
plugins: {
react,
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...js.configs.recommended.rules,
...react.configs.recommended.rules,
...react.configs['jsx-runtime'].rules,
...reactHooks.configs.recommended.rules,
'react/prop-types': 'off', // Отключаем, если не используем старые prop-types
'react/jsx-no-target-blank': 'off',
'no-undef': 'off', // Отключаем проверку несуществующих переменных (TS справляется сам)
'react-refresh/only-export-components': 'off', // Отключаем назойливое предупреждение для Next.js
// или
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
eslintConfigPrettier, // <-- Строго в конце!
]
📢 Возможные ошибки:
1. Cannot find package 'eslint-plugin-react' - означает, что в твоем проекте (в папке node_modules) физически не скачаны плагины, которые мы попросили ESLint использовать для проверки React-кода. Как исправить: нужно просто доустановить эти недостающие пакеты.
npm install --save-dev eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-refresh globals
2. 'prettier' is not recognized as an internal or external command - доустановливаем prettier:
npm install --save-dev prettier
👉 Этап 3: Эталонные скрипты в package.json
- Вставляем этот блок в package.json. Здесь собраны скрипты на все случаи жизни.
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"--- CODE QUALITY ---": "",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,json}\"",
"format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,json}\"",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"typecheck": "tsc --noEmit",
"--- UTILS ---": "",
"clean": "rimraf dist",
"build:strict": "npm run clean && npm run format && npm run lint && npm run typecheck && vite build"
}
📢 Разбор полетов: за что отвечает каждый скрипт. Обязательный минимум (Использовать каждый день)
npm run format — Причесывает весь код в папке src. Запускать перед каждым коммитом, чтобы код выглядел так, будто его писал один человек.
npm run lint:fix — Ищет логические ошибки и плохие практики, автоматически исправляет то, что может (например, удаляет неиспользуемые импорты).
npm run typecheck (только для TypeScript) — Прогоняет проект через компилятор TS без сборки. Выявит все ошибки типов, которые ты мог пропустить в редакторе.
- Строгая сборка (Перед деплоем)
npm run clean — Удаляет папку со старой сборкой (спасает от редких багов кэширования Vite).
npm run build:strict — Контрольный выстрел. Выполняет очистку, форматирование, проверку линтером, проверку типов и только если нигде нет ошибок — запускает финальную сборку. Идеально для CI/CD (GitHub Actions).
📢 Возможна при запуске команды возникнет ошибка: 'rimraf' is not recognized as an internal or external command - нужна установить пакет npm install --save-dev rimraf
Что такое и зачем вообще нужен rimraf:
- Поскольку ты работаешь на Windows, стандартная команда удаления папок из Linux/Mac (rm -rf) у тебя не сработает. На Windows для этого нужно писать rmdir /s /q.
- Пакет rimraf (сокращение от rm -rf) выступает в роли универсального «ластика». Ему всё равно, Windows у тебя, Linux или Mac — он сам подберет нужную команду под капотом и безопасно снесет нужную папку. Это незаменимая вещь для команд в package.json, чтобы они работали у любого разработчика на любой операционной системе!
🔥👉 Этап 4: Продвинутые фишки (Pro-level)
То, что отличает просто хороший проект от железобетонного.
1. Настройка VS Code (Автоматизация)
- Чтобы не писать npm run format руками каждую минуту, заставь редактор делать это за тебя при сохранении файла Ctrl+S.
Создай в корне папку .vscode, а в ней файл settings.json:
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
}
2. Защита от грязных коммитов (Husky + lint-staged)
- Иногда забываешь запустить скрипты и пушишь кривой код. Инструмент Husky перехватывает команду git commit и автоматически запускает форматтер и линтер только для измененных файлов (чтобы не ждать проверку всего проекта). Если есть ошибки — коммит отменяется.
Быстрая установка:
1. npx mrm@2 lint-staged (Эта команда сама установит и настроит Husky).
2. В package.json появится блок lint-staged. Настрой его так:
"lint-staged": {
"src/**/*.{js,jsx,ts,tsx}": [
"prettier --write",
"eslint --fix"
],
"src/**/*.{css,scss,json}": [
"prettier --write"
]
}
📢 Возможные ошибки:
1. Parsing error: Unexpected token - если мы работаем на TypeScript, то нам лучше всего установить так называемый словарь терминов npm install --save-dev typescript-eslint и обновляем eslint.config.js:
import js from '@eslint/js';
import globals from 'globals';
import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import eslintConfigPrettier from 'eslint-config-prettier';
import tseslint from 'typescript-eslint'; // 1. ДОБАВИЛИ ИМПОРТ
export default [
{ ignores: ['dist', 'node_modules', '.next'] },
...tseslint.configs.recommended, // 2. ВКЛЮЧИЛИ БАЗОВЫЕ ПРАВИЛА TS
{
files: ['**/*.{js,jsx,ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parser: tseslint.parser, // 3. УКАЗАЛИ ИСПОЛЬЗОВАТЬ ПАРСЕР TS
parserOptions: {
ecmaVersion: 'latest',
ecmaFeatures: { jsx: true },
sourceType: 'module',
},
},
settings: { react: { version: 'detect' } },
plugins: {
react,
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...js.configs.recommended.rules,
...react.configs.recommended.rules,
...react.configs['jsx-runtime'].rules,
...reactHooks.configs.recommended.rules,
'react/prop-types': 'off',
'react/jsx-no-target-blank': 'off',
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
eslintConfigPrettier,
];