Howtojs

Качество и красота кода

20 марта 2021 г. • ☕️ 5 мин.

Код, который мы пишем, должен не только корректно решать задачу, но так же быть удобным для чтения и понимания.

Удобный для чтения код - это правильно отформатированный код, красиво расставленные пробелы, запятые и отступы, а так же консистентный стиль по всем проекту.

Понятный для чтения код - это код в котором минимальное количество неявных моментов.

Для улучшения этих параметров, можно использовать различные инструменты, которые помогают их частично автоматизировать.

eslint

Помогает найти и исправить проблемы в коде JavaScript.

prettier

Форматирует код автоматически.

husky

Автоматически запускает набор команд при git commit.

Как все это связать вместе?

Проект с React

Создадим проект с помощью create-react-app.

npx create-react-app --use-npm next-big-thing && cd next-big-thing

Установим необходимые зависимости.

npm i -D eslint-config-standard eslint-config-standard-react eslint-config-prettier prettier husky lint-staged

Добавим набор готовых eslint правил - standard и расширение для интеграции со стилем prettier. Для этого создадим файл с конфигурацией .eslintrc и удалим ключ eslintConfig из файла package.json.

{
  "root": true,
  "parser": "babel-eslint",
  "extends": [
    "react-app", // расширяем конфигурацию create-react-app
    "standard",  // добавляем конфигруацию standard
    "standard-react", // добавляем поддержку react для standard
    "prettier" // добавляем поддержку prettier
  ],
  "env": {
    "es2021": true,
    "browser": true,
    "jest": true
  },
  "rules": {
    "react/react-in-jsx-scope": "off"
  }
}

Добавим скрипты для запуска eslint и prettier в package.json.

{
  // ...
  "scripts": {
    // ...
    "lint": "eslint \"src/**/*.js\"",
    "format": "prettier --write \"src/**/*.{js,json,css,scss}\""
    // ...
  }
  // ...
}

Теперь при запуске npm run lint можно увидеть рекомендации от eslint по исправлению проблем, если они есть, а при запуске npm run format код будет автоматически отформатирован.

Для изменения конфигурации prettier, можно добавить файл .prettierrc.

{
  "semi": false,
  "trailingComma": "all"
}

Так же можно добавить файл .prettierignore, для указания файлов которые не нужно форматировать.

Следующий шаг, убедиться, что код автоматически форматируется prettier и проходит проверки eslint при использовании git commit.

Инициализируем husky.

npx husky init

Эта команда модифицирует файл package.json и создаст pre-commit hook для git в файле next-big-thing/.husky/_/pre-commit

На данный момент, eslint и prettier, обрабатывают все файлы. Мы можем сделать так, чтобы при git commit, обрабатывались только измененные файлы.

Создадим файл с конфигурацией .lintstagedrc.

{
  "*.js": [
    "prettier --write",
    "eslint",
    "npm test -- --watchAll=false --findRelatedTests"
  ],
  "*.{json,css,scss}": [
    "prettier --write"
  ]
}

Модифицируем git hook который был создан husky.

next-big-thing/.husky/_/pre-commit

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no lint-staged

Теперь при git commit обрабатываются только измененные файлы.

Проект Node.js

Создадим проект.

mkdir -p next-big-thing && cd next-big-thing

Инициализируем npm.

npm init -y

Установим необходимые зависимости.

npm i -D jest eslint babel-eslint eslint-config-standard eslint-config-prettier prettier husky lint-staged

Добавим набор готовых eslint правил - standard и расширение для интеграции со стилем prettier. Для этого создадим файл с конфигурацией .eslintrc.

{
  "root": true,
  "parser": "babel-eslint",
  "extends": [
    "standard",  // добавляем конфигруацию standard
    "prettier" // добавляем поддержку prettier
  ],
  "env": {
    "jest": true,
    "node": true
  }
}

Добавим скрипты для запуска eslint и prettier в package.json.

{
  // ...
  "scripts": {
    // ...
    "lint": "eslint \"**/*.js\"",
    "format": "prettier --write \"**/*.{js,json}\""
    // ...
  }
  // ...
}

Теперь при запуске npm run lint можно увидеть рекомендации от eslint по исправлению проблем, если они есть, а при запуске npm run format код будет автоматически отформатирован.

Для изменения конфигрурации prettier, можно добавить файл .prettierrc.

{
  "semi": false,
  "trailingComma": "all"
}

Так же можно добавить файл .prettierignore, для указания файлов которые не нужно форматировать.

Следующий шаг, убедиться, что код автоматически форматируется prettier и проходит проверки eslint при использовании git commit.

Инициализируем husky.

npx husky init

Эта команда модифицирует файл package.json и создаст pre-commit hook для git в файле next-big-thing/.husky/_/pre-commit

На данный момент, eslint и prettier, обрабатывают все файлы. Мы можем сделать так, чтобы при git commit, обрабатывались только измененные файлы.

Создадим файл с конфигурацией .lintstagedrc.

{
  "*.js": [
    "prettier --write",
    "eslint",
    "jest --findRelatedTests"
  ],
  "*.json": [
    "prettier --write"
  ]
}

Модифицируем git hook который был создан husky.

next-big-thing/.husky/_/pre-commit

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no lint-staged

Теперь при git commit обрабатываются только измененные файлы.

Бонус

Если вы пользуетесь VSCode, рекомендую так же установить расширения prettier и eslint, которые добавят интеграцию этих инструментов.