Tools to help you write Clean Code
Взгляд на Prettier, ESLint, Husky, Lint-Staged и EditorConfig.
Вы хотите научиться писать чистый код но не знаете с чего начать… Изучая руководства по стилю, такие как Airbnb’s Javascript Style Guide … Пытаясь написать код с лучшими инструкциями…
Удаление мертвого кода? Поиск неиспользуемых переменных в базе кода? Пытаетесь найти проблемные шаблоны в коде? Работает return
или нет?
Что-нибудь из этого звучит знакомо?
Нужно столькому научиться и столько сделать но это так изнурительно.
Вы руководитель команды? У вас есть новые разработчики в команде? Вы беспокоитесь, что они напишут код, не соответствующий стандартам? Весь ваш день состоит из обзоров кода, где обзор больше посвящен стандартам кода, а не составляющей?
Когда-то я это и делал, могу сказать, что это просто утомительно и беспокойно.
Давайте пообещаем никогда больше не беспокоиться о том, как код должен выглядеть или научить команду писать код определенным образом, который стандартизирован и отформатирован должным образом.
Если вы вдруг застрянете на протяжении всего данного урока, вот репозиторий кода . Запросы приветствуются, если у вас есть предложения по улучшению.
Этот учебник больше ориентирован на приложения React, но то же самое может быть применено к любому веб-проекту.
Кроме того, редактор, который я использую для этого урока это VS Code от Microsoft. Я уже на протяжении долгих лет влюблен в эту компанию (хотя были времена, когда наоборот недолюбливал).
На повестке дня:
- Prettier
- ESLint
- Automate Format and Lint on Save
- Husky
- Lint-staged
- Объединенные Husky и Lint-staged
- EditorConfig
Let’s start with Prettier
Начнем с Preettier
What is Prettier?
Что такое Prettier: Это своеобразный преобразователь кода. Он форматирует код для вас определенным образом.
Этот GIF в значительной степени объясняет это:
Why do we need it?
Зачем она нам:
- Очищает существующую базу кода: в одной командной строке. Представьте себе очистку базы кода с более чем 20 000 строк кода.
- Легко привыкнуть: Prettier использует наименее спорный стиль кодирования при форматировании кода. он в открытом доступе, многие люди работали над несколькими его итерациями в исправлении некоторых крайних случаев.
- Написание кода: люди не понимают, что они тратят много времени на форматирование кода и тратят свою умственную энергию на это. Пусть Prettier справиться с этим, в то время как вы сосредоточиться на основной бизнес-проекте. В личном плане, Prettier увеличил мою эффективность на 10%.
- Помощь начинающим разработчикам: если вы новый разработчик, работающий бок о бок с великими инженерами, и вы хотите выглядеть круто писать чистый код, будьте умны! Используйте Preetier.
How do I set it up?
Как его настроить: Создайте папку с именем app
и внутри этого типа папки в командной строке:
Это создаст package.json
файл для вас внутри app
папки.
Теперь я собираюсь использовать yarn
на протяжении всего этого урока, но вы npm
также можете использовать.
Давайте установим нашу первую зависимость:
Это установит зависимость dev в вашемpackage.json
, которая будет выглядеть следующим образом:
Я расскажу через секунду, что это “prettier”: “prettier — write src/**/*.js”
делает, но сначала давайте создадим src/
папку внутри нашей app
папки. А внутри src/
папки создадим файл под названием index.js
- Вы можете называть его как угодно.
В index.js
файл вставьте этот код, как он есть:
До сих пор у нас есть src/app/index.js
файл с каким-то уродливым кодом, написанным в нем.
Есть 3 вещи, которые мы можем сделать с этим:
- Отступить и форматировать этот код
- Использовать автоматизированный инструмент
- Пусть все так и будет, двигаемся дальше (пожалуйста, не выбирайте этот вариант)
Я собираюсь использовать второй вариант. Итак, теперь у нас есть установленная зависимость и более красивый сценарий, написанный в нашем package.json
.
Давайте создадим prettier.config.js
файл в нашей корневой app
папке и добавим в него несколько более красивых правил:
printWidth
убедитесь, что код не превышает 100 символов.
singleQuote
конвертирует все ваши двойные кавычки в одинарные.
Подробнее читайте в руководстве по стилю JavaScript Airbnb здесь . Это руководство - мой учебник для написания хорошего кода и способ создания впечатления у моих коллег.
trailingComma
гарантирует наличие висящей запятой в конце свойства last object. Ник Граф объясняет это таким классным способом здесь .
bracketSpacing
печать пробелов между литералами объектов:
jsxBracketSameLine
поставит >
многострочный элемент JSX на последнюю строку:
tabWidth
указывает количество пробелов на уровень отступа.
semi
if true выведет ;
в конце инструкции.
Вот список всех вариантов, которые вы можете дать Preetier.
Теперь, когда мы настроили конфигурацию, давайте поговорим об этом скрипте:
В сценарии выше, я запускаю prettier
и говорю ему найти все .js
файлы в моей src/
папке. --write
Флаг говоритprettier
, чтобы сохранить отформатированные файлы, как он проходит через каждый файл и находит любую аномалию в формировании кода.
Давайте запустим этот скрипт в вашем терминале:
Вот что происходит с моим кодом при его запуске:
Если вы застряли, не стесняйтесь взглянуть на хранилище для этого.
Это в значительной степени завершает нашу более красивую дискуссию. Давайте поговорим о linters.
ESLint
What is a code linter?
Что такое линтер кода:
Линтинг кода-это тип статического анализа, который часто используется для поиска проблемных шаблонов или кода, который не придерживается определенных правил стиля. Для большинства языков программирования существуют линтеры кода, и компиляторы иногда включают линтинг в процесс компиляции. — ESLint
Why do we need one for JavaScript?
Зачем он нужен для JavaScript: Так как JavaScript является динамическим и слабо типизированным языком, он подвержен ошибкам разработчиков. Без пользы процесса компиляции, .js
файлы обычно выполняются для того, чтобы найти синтаксис или другие ошибки.
Инструменты линтинга, такие как ESLint , позволяют разработчикам находить проблемы с их JavaScript-кодом без его выполнения.
What makes ESLint so special?
Что делает ESLint таким особенным: Хороший вопрос! В ESLint все подключаемо. Каждое правило линтинга, которое вы добавляете, является автономным, любое правило может быть включено или выключено. Для каждого правила может быть установлено предупреждение или ошибка. Ваш выбор.
Используя ESLint, вы получаете полную настройку того, как вы хотите, чтобы ваше руководство по стилю выглядело.
Есть 2 популярных гида стиля на данный момент:
Я лично использовал руководство по стилю Airbnb. Это было рекомендовано мне моим руководителем инженерного отдела в моей последней фирме, когда я начинал свою профессиональную карьеру, и это было самым ценным активом в моем распоряжении.
Это руководство по стилю активно поддерживается-проверьте сами GitHub repo. Я буду использовать наборы правил, предпочитаемые руководством по стилю Airbnb в этом уроке. Итак, начнем.
Давайте сначала обновим наш package.json
файл:
Прежде чем приступить к настройке, я твердо верю, что люди должны знать, что входит в их зависимости. Поэтому давайте поговорим о том, что делает каждый из этих пакетов, а затем мы можем двигаться вперед с конфигурациями.
babel-eslint
: этот пакет позволяет вам использовать линтинг на всем Babel с легкостью. Вам не обязательно нужен этот плагин, если вы не используете Flow или экспериментальные функции, которые еще не поддерживаются ESLint.
eslint
: это основной инструмент, необходимый для линтинга кода.
eslint-config-airbnb
: этот пакет предоставляет всю конфигурацию ESLint Airbnb как расширяемую общую конфигурацию, которую можно изменить.
eslint-plugin-babel
: eslint
Плагин companion to babel-eslint
. babel-eslint
делает большую работу по адаптации eslint
для использования с Babel.
eslint-plugin-import
: Этот плагин предназначен для поддержки линтинга ES2015+ (ES6+)
import/export syntax,
и предотвращения проблем с неправильным написанием путей к файлам и имен импорта. Подробнее .
eslint-plugin-jsx-a11y
: установлены правила линтинга для правил доступности элементов JSX. Потому что доступность важна!
eslint-plugin-prettier
: Это помогает ESLint работать гладко с preetier. Поэтому, когда preetier форматирует код, он делает это, имея в виду наши правила ESLint.
eslint-plugin-react
: React-специфические правила линтинга для ESLint.
Это пособие не говорит много о модульном тестировании для
Jest / Enzyme . Но если вы используете его, давайте добавим правила линтинга для них, а также:
eslint-config-jest-enzyme
: Это помогает с React - и Enzyme-специфическими переменными которые глобализированы. Эта конфигурация lint позволяет ESLint знать об этих глобалах и не предупреждать о них — как и утверждения it
и describe
.
eslint-plugin-jest
: ESLint плагин для Jest.
husky
: Подробнее об этом позже в разделе автоматизация.
lint-staged:
Подробнее об этом позже в разделе автоматизация.
Теперь, когда у нас есть основное понимание, давайте начнем;
Создание .eslintrc.js
файла в корневой app/
папке:
Также добавьте .eslintignore
файл в корневой app/
каталог:
Давайте начнем с обсуждения того, что .eslintrc.js
делает.
Давайте сломаем его:
env:
Среда определяет предопределенные глобальные переменные. Доступные среды-в нашем случае этоes6browser
иnode
есть .es6
включает все функции ECMAScript 6, за исключением модулей (дляecmaVersion
параметра parser автоматически устанавливается значение 6).browser
добавит все глобальные переменные браузера, такие какWindows
.node
добавит глобальные переменные узла и область действия узла, напримерglobal
. Подробнее об указании сред.extends:
Массив строк-каждая дополнительная конфигурация расширяет предыдущие конфигурации.
Прямо сейчас мы используем правила линтингаairbnb
, которые расширяютсяjest
и затем расширяютсяjest-enzyme
.plugins:
плагины в основном линтинг правила, которых мы хотим использовать.- Прямо сейчас мы используем
babel, import, jsx-a11y, react, prettier
, все из которых я объяснил выше. parser:
По умолчанию ESLint использует Espree , но так как мы используемbabel
, нам нужно использовать Babel-ESLint .parserOptions:
Когда мы меняем синтаксический анализатор по умолчанию наEspree
tobabel-eslint
, нам нужно указатьparserOptions
-это обязательно.
В опциях я сообщаю ESLint, чтоecmaVersion
собирается линтировать6
. Так как мы пишем наш код в EcmaScriptmodule
, а не ascript
, мы указываемsourceType
какmodule
.
Так как мы используем React, который приносит в JSX, вecmaFeatures
Я указал поменялjsx
наtrue
.rules:
Это часть, которую я люблю больше всего в ESLint, настройки.
Все правила, которые мы расширили и добавили с нашими плагинами, мы можем изменить или переопределить.rules
это место, где вы это делаете. Я уже поместил комментарии против каждого правила для вашего понимания.- Теперь, когда все прояснилось, давайте поговорим о
.eslintignore
.eslintignore
принимает список путей, которые мы хотим, чтобы ESLint не линтировал. Здесь я указываю только три:/.git
Я не хочу, чтобы мои файлы, связанные с Git, были линтованы./.vscode
Так как я использую VS Code, этот редактор поставляется с собственной конфигурацией, которую вы можете установить для каждого проекта. Я не хочу, чтобы мои конфигурации были линтованы. Я использую VS-код, потому что он легкий и с открытым исходным кодом.node_modules
Я не хочу, чтобы мои зависимости были привязаны. Поэтому я добавил Это в список.
Теперь, когда мы закончили с этим, давайте поговорим о новых добавленных скриптах к нашим package.json
$ yarn lint
запуск этой команды, он будет проходить через все ваши файлы вsrc/
и даст вам подробный журнал в каждом файле, где он находит ошибки, которые затем можно войти вручную и исправить.
$ yarn lint:write
запуск команды, он будет делать то же самое, что и команда выше. Единственное дополнение заключается в том, что если он может исправить какую-либо ошибку, которую он видит, он ее исправит и попытаться удалить столько следов кода, сколько он может.
Если вы застряли, не стесняйтесь взглянуть на хранилище для этого.
Это было немного суматошно, и если вы следовали до сих пор:
Let’s Automate A Bit More
Давайте автоматизируем немного больше: На данный момент у нас есть prettier
и eslint
, но каждый раз приходится запускать скрипт. Давайте что-то с этим делать.
- Форматирование и Линт кода при попадании
ctrl+s
в ваш редактор. - Каждый раз при фиксации кода автоматически выполняется предварительная команда, которая создает линты и форматирует код.
Format and Lint Code On Save
Формат и Lint кода при сохранении: Для этого нужно использовать редактор типа VS Code:
- Установите плагин ESLint extension.
Скачайте здесь или нажмитеctrl+shift+x
в редакторе кода VS. Откроется модуль расширений. Там, тип поискаeslint
. Появится список плагинов. Установите тот, что созданDirk Baeumer
. После установки нажмитеreload
кнопку, чтобы перезапустить редактор.
Как только вы установили этот плагин, в вашей корневой app/
папке создайте папку под названием.vscode/
-точка в названии важна.
- Внутри папки создайте
settings.json
файл, как показано ниже:
editor.formatOnSave
Я установил значениеfalse
здесь, потому что я не хочу, чтобы конфигурация редактора по умолчанию для формата файла конфликтовала с ESLint и Prettier.eslint.autoFixOnSave
Я установил значениеtrue
здесь, потому что я хочу, чтобы установленный плагин работал каждый раз, когда я нажму save. Так как ESLint настроен с preetier конфигурациями, каждый раз, когда вы нажметеsave
, он будет форматировать и линтировал ваш код.
Также важно отметить, что при запуске скрипта yarn lint:write
теперь он будет линтировать и приукрашивать ваш код на том же ходу.
Только представьте, если вам где передали кодовую базу из 20к строк кода для аудита и улучшения. Теперь представьте, что это делается вручную. Улучшение неизвестного кода. Теперь представьте, что это делается с помощью одной команды. Ручной подход может занять 30 дней…при этом автоматический подход займет у вас 30 секунд.
Таким образом, сценарии настраиваются, и каждый раз, когда вы нажмете save
редактор будет делать магию для вас для этого конкретного файла. Но не все в вашей команде будут выбирать VS Code, и это нормально. Поэтому давайте автоматизируем немного больше.
Husky
Что такое husky: Хаски в основном дает вам git hook. Это означает, что вы можете выполнить некоторые определенные действия, когда вы собираетесь совершить или когда вы собираетесь отправить код в ветку.
Все, что вам нужно сделать, это установить Husky:
и в ваш package.json
файл добавит
Таким образом, каждый раз, когда вы фиксируете или нажимаете, он будет выполнять определенный сценарий или команду, как запустить тестовые случаи или форматировать код.
Подробнее о Хаски вы можете прочитать здесь .
Lint-staged
Что такое Lint-staged?
Lint-staged помогает запускать линтеры для промежуточных файлов, чтобы плохой код не был перемещен в вашу ветвь.
Почему Lint-staged?
Линтинг имеет больше смысла при запуске перед фиксацией кода. Таким образом, вы можете гарантировать, что никакие ошибки не попадут в репозиторий и не применят стиль кода. Но выполнение процесса Линта в целом по проекту происходит медленно, и результаты линтинга могут не иметь значения. В конечном итоге вы хотите только линтироать файлы, которые будут зафиксированы.
Этот проект содержит сценарий, который будет выполнять произвольные задачи оболочки со списком промежуточных файлов в качестве аргумента, отфильтрованного по заданному шаблону глобуса. Подробнее вы можете прочитать здесь .
Все, что вам нужно, это установить Lint-staged:
затем package.json
добавьте это в файл:
Эта команда сначала выполняет lint:write
команду, а затем добавляет ее в промежуточную область. Эта команда будет запущена только для .js
& .jsx
, но вы можете сделать то же самое для других файлов, если хотите.
При совмещенные H usky
и Lint-staged
Каждый раз, когда вы фиксируете свой код, перед фиксацией кода, он будет запускать скрипт под названием lint-staged
который запустит npm run lint:write
который будет форматировать и линтировать ваш код-затем добавить его в область подготовки и затем зафиксировать. Круто, правда?!
Ваш окончательный package.json
файл должен выглядеть следующим образом. Это тот же фрагмент, которым я поделился выше:
Теперь каждый раз, когда вы делаете это:
Он будет Линтировать и форматировать код на основе всех правил, помещенных в .eslintrc.js
файл. С помощью этого вы можете быть уверены, что ни один плохой код никогда не будет запущен в производство.
Теперь, когда этот раздел завершен, вы prettiereslinthusky
интегрированы в базу кода.
Поговорим о EditorConfig
Сначала создайте .editorconfig
файл в корневой app/
папке и вставьте в него код, приведенный ниже:
Так что такое EditorConfig?
Таким образом, не все будут использовать VS — код-и вы не обязаны его применять. Для того, чтобы держать всех на той же странице с точки зрения того, что по умолчанию, такие как tab space
или line ending
должны быть, мы используем .editorconfig
. Это действительно помогает применять некоторые определенные наборы правил.
Вот список всех редакторов, поддерживающих EditorConfig . Список редакторов включает web storm, App code, Atom, eclipse, emacs, bbedit и многое другое.
Вышеуказанная конфигурация будет делать следующее:
- обрезать пробелы в
.md
&.js
файлах - установить стиль отступа
space
вместоtab
- размер отступа к
2
- конец строки должен быть
lf
таким, чтобы у всех, независимо от их ОС, был один и тот же конец строки. Подробнее здесь. - в конце файла должна быть новая строка
- и максимальная длина линии должна быть
100
Со всей этой конфигурацией теперь вы готовы. Если вы хотите увидеть исходный код .
Также запросы приветствуются, если вы чувствуете, что вы можете улучшить что-нибудь в этом репозитории.
Если вам понравилась моя статья, вы также должны проверить мою другую статью: Как объединить Webpack 4 и Babel 7, чтобы создать фантастическое приложение React , в котором я говорю о настройке Webpack и Babel для React.
Translated: medium
Help us with your claps :)