ESLint(ãããã¯TSLint)ã¨Prettierãä½µç¨ãã
[追è¨:] TypeScriptã§ESLintã使ãæ¹æ³ãæ¸ãã¾ãã
TSLintã§ã¯ãªãESLintã使ãããæ¹ã¯ãã¡ãããã¨ã§èªãã§ã¿ã¦ãã ããã
ãªã
- JS with ESLint
- TS with TSLint
ãã®æ§æããæ±ãã®æ¹ã¯å½è¨äº(ä¸è¨)ã§ãã
Prettierå°å ¥ããã«ããã£ã¦è²ã 絡ã¿åããã®ãããã®ã§èª¿ã¹ãããããã¨ãã¾ã¨ãã¦ããã
åºæ¬çã«ãªã³ãã¨ãã©ã¼ããã¿ã®ã©ã¡ããçæ¹ãã使ããªãã¨ããå ´é¢ã¯ããªãªã¼ã¹ãæèããããã¸ã§ã¯ãã§ã¯ãã¾ããªãã¨æãã®ã§ãå®è³ªãã®çµã¿åããã¯å¿ é ã®ããã«ãªã£ã¦ããæ°ããã¦ããã
ããã§ãPrettierã¨ã¯ãªãããâ¦JSã®ã³ã¼ããã©ã¼ããã¿ã§ããã¨ããPrettierã®æ¦è¦ã«ã¤ãã¦ã¯ã°ã°ãã°ãã£ã¡ãåºã¦ããã®ã§çç¥ã
ãã®è¨äºã¯å°å ¥ããããã©ãªã«ãã©ãããã°ããããã¨ãã人åãã
ã¨ããããESLint+Prettierã«ã¤ãã¦æ¸ãã¦ç解ãã¦ããã£ããã¨ã§TypeScripteråãã«TSLint+Prettierã®ãã¨ãæ¸ãã¦ããã¾ããã¡ãªã¿ã«å°å ¥ã«ã¤ãã¦ã®è©±ãªã®ã§ESLintãPrettierã®ã«ã¼ã«ã®è§£èª¬ã¯ãªãã
ããããESLintã¨Prettierã©ãéãããã¿ãããªã®ã¯å ¬å¼ã«ãããããã¼ã¸ãããã
CAVEAT
ãã®è¨äºãåèã«ãã¹ã対象è
ãã®è¨äºã¯ããã¸ã§ã¯ããã©ã«ãå ã§ESLintã¨Prettierãä½µç¨ãã¤ã¤ãã³ãããæã«ãå確èªãã¦gitã«ESLintã«ã¼ã«ã«å¾ã£ã¦ããªãã³ã¼ããPrettierã«ããæªæ´å½¢ã®ã³ã¼ããç´ãè¾¼ã¾ãªãããã«ããã人åãã§ãã
ã¤ã¾ã
- ããã¸ã§ã¯ããã©ã«ãããã
- ã¯ã
- ããã¸ã§ã¯ãã«åå¨ããã³ã¼ãã®ç§©åºãä¿ã¡ãã
- ã¯ã
- ESLintã§ã³ã¼ãã®ã«ã¼ã«ãã§ãã¯ãããã
- ã¯ã
- Prettierã使ã£ã¦æ´å½¢æ¸ã¿ã®ãã¬ã¤ãªã³ã¼ããä¿ã¡ãã
- ã¯ã
- Gitã«ç§©åºãä¿ããã¦ããªãã³ã¼ããç´ãè¾¼ãã®ãé»æ¢ããã
- ã¯ã
ãããã欲æ±ããã人åãã§ãã
ä¸çªã¾ã¨ã¾ã£ã¦ããå°å ¥è§£èª¬
ESLint導入環境にprettierを追加して運用する - Kenta Katoh's Blog
ãã®æ¹ã®ããã°ãä¸çªç°¡æ½ã§ããããããã®ã§ã¾ãèªãã¨ããã£ã¦ããã
ãªã®ã§èªãã¨ããããâ¦èªãã§ä¸ããã§çµããã¨éãããã®ã§ã以ä¸ããå°å ¥è§£èª¬ã
å°å ¥ãã¾ããã
å°å ¥ããã«ããã£ã¦ãªããè²ã ãã©ã°ã¤ã³ããã£ã¦ã©ããå ¥ããã°ããã®ãåé¡ãçºçããã¨æãã
ä¸è¨ããã°ã«ãæ¸ãã¦ããããã©ãPrettierã®å¦çã®åãæ±ãã«ã¯2種é¡ããã
.eslintrc
ã«Prettierã®ã«ã¼ã«ãå®ç¾© â ESLintã®å¦çæã«Prettierã®ã«ã¼ã«ããã£ã¦ãããPrettierã§ãã©ã¼ããã â ãã©ã¼ãããæ¸ã¿ã³ã¼ãã
eslint --fix
ã«ç¹ãã§æ¸¡ã â ESLintã«ã¯ESLintã®å¦çãã¦ããã
ESlint+Prettierã®å°å ¥ã¯ä¸è¨2ã¤ã®ã©ã£ã¡ãã®ããããã§ã§ããã
ã1ã®ç¹å¾´ã
- æ¢åESLintç°å¢ãããå ´åã«å°å ¥ãããã
.eslintrc
ã«Prettierã®è¨å®ãã§ãã¦ä¸å 管çæããã- Prettier使ããã¨ãæ示ãããã®ã§ããããããã¦ãã
eslint --fix
ããã¿ã¤ãã³ã°ã§Prettierãå®è¡ããã- ã©ããPrettierãããªãESLintãããã§ãããï¼ã¨ãã人ã«ããã
ã2ã®ç¹å¾´ã
- å¦çãæ
ãã®ã¯
prettier-eslint
ãããã¯prettier-eslint-cli
ã¨ãããã©ã°ã¤ã³- åè ã¯JSãã¡ã¤ã«ã«importãã¦ä½¿ãã©ã¤ãã©ãªã¿ã¤ãã§ãå¾è ã¯cliã³ãã³ãã§ããããå ´å
prettier-eslint
ã使ãã¨Prettierãã¦ããeslint --fix
ãã¦ããã- Prettierã¨ESLintã®å¦çãããããåãã¦ããã
- Prettierã®ãªãã·ã§ã³ã¯
.prettierrc
ã§ç®¡çããããã¨ãã£ã¿ã®Integrationãã©ã°ã¤ã³ä¸ã§è¨å®ããåé¡ããã
ã©ã£ã¡ã§ããããã©èªåã¯1.ã®ææ³ãã¨ã£ã¦ãããã¨ããã®ãæåã«æ¸ããããã«ESLintã¨Prettierã¯ä½µç¨ãå®è³ªå¿ é ã¿ããã«ãªãã¤ã¤ãã(ESLintã®ã¿ã ããªãã¾ã ããPrettierã®ã¿ã¨ããå ´é¢ã¯ãªããã)ããªã®ã§ESLintã®è¨å®ã¨ä¸ç·ã«Prettierã®è¨å®ãæ¸ããã¦ããã»ãã1æã«è¨å®ãã¾ã¨ã¾ã£ã¦ãã¦ãããããããããããã¦ããã
ã¡ãªã¿ã«2ã®ããæ¹ã¯å®éã«ä½¿ã£ã¦ãªãã®ã§å½è¨äºã§ã¯çç¥ãã¾ãã
1.ã®ãããã
ã¨ããããã§1.ã®ããããã§ã®å°å ¥ã
ESLint + Prettierãã¾ãå ¥ãã
yarn add -D eslint prettier
yarnã§æ¸ãã¦ããããã©å¥ã«npmã§ããããã好ããªããã±ã¼ã¸ãã¼ã«ã§ã
ããã§ESLintã¨Prettieræ¬ä½ãå
¥ã£ãã
次ã«ESLintã®Prettierç¨ãã©ã°ã¤ã³ã¨ã³ã³ãã£ã°ãå ¥ãã
GitHub - prettier/eslint-plugin-prettier: ESLint plugin for Prettier formatting
eslint-plugin-prettier
- ESLintã®ã«ã¼ã«ã¨ãã¦Prettierãèªã¿è¾¼ãã§åã ã«å¦çãããã¤
eslint-config-prettier
- ESLintã¨Prettierã®å¦çã§éè¤ããé¨åãç¡å¹åãã¦ããããã¤
yarn add -D eslint-plugin-prettier eslint-config-prettier
ã¨ããããå¿
è¦ãªãã®ã¯å
¥ã£ãã®ã§ãã¨ã¯.eslintrc
ã«è¨å®ãæ¸ãã¦ããã
.eslintrc
以ä¸.eslintrc.json
ã®ä¾
eslint-plugin-prettier
ã®config
{ "plugins": [ "prettier" ], "rules": { "prettier/prettier": "error" } }
次ã«eslint-config-prettier
ã®config
{ "extends": [ "prettier" ] }
åãããã¨ãã
{ "extends": ["prettier"], "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
æå°éã§ããã
å®éã«ã¯ããã«å ãã¦ESlintã®Ruleããã£ã¡ãæ¸ãããããAirbnbãªããã¯xoãªããã¯Googleãªããã¯Standardãããã®ãªã«ãããã®ã«ã¼ã«é¡ãextendsã§å©ç¨ãããã¨ã«ãªãã
以ä¸ã¯åãå®éã«ä½¿ã£ããããESLintã®ä¾ã
GitHub - standard/eslint-config-standard: ESLint Config for JavaScript Standard Style
JavaScript Standardããã¼ã¹ã«ãã¦ãã.eslintrc.json
ã
{ "extends": ["standard", "prettier"], "env": { "browser": true }, "plugins": ["prettier"], "rules": { "prettier/prettier": [ "error", { "singleQuote": true, "semi": false } ], "yoda": 0, "no-unused-vars": 1 }, "globals": { "$": false } }
standard使ãå ´åã¯ä»¥ä¸ãå¿ è¦ãªã®ã§ãã£ã¦ããããããã§ã¯æ¬çã§ã¯ãªãã®ã§é話ä¼é¡ã¨ãããã¨ã§â¦
yarn add -D eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
ã¨ãã£ã¿å´ã®è¨å®
ããã¾ã§ã§Prettierã使ãæºåã¯ã§ãããã®ã§ãã¨ãã£ã¿ã®è¨å®ãããã
VS Codeã§ã®ä¾ã§æ¸ãã
ESLintã®ãã©ã°ã¤ã³ãå ¥ããã
â+,
ãããVS Codeã®è¨å®ãéãã¦
"eslint.autoFixOnSave": true
ããã¨ä¿åæã«eslint --fix
ãããã®ã§Prettierãããããã¨ããæµãã«ãªãã
ããã§ç¡äºESLint+Prettierã使ããããã«ãªã£ãã
Prettierã®ãã©ã°ã¤ã³ã¯ã¨ãã£ã¿ã«å ¥ããªãã¦ããããã§ããï¼
åã¨ãã£ã¿ã«ã¯Prettierã®ãã©ã°ã¤ã³ããããããã¯å¿ è¦ãªã®ãã©ããã¨ããæ©ã¿ãåºãã
端çã«ããã¨ããã¾ã§è§£èª¬ãã¦ããããããã ããããã®ã§ããã°å¿ è¦ãªãã¨ãããã¨ã«ãªãã
ããã¾ã§ã®è§£èª¬ã¯ESLintã¨Prettierãä½µç¨ãããã¨ãåæã¨ããããã¸ã§ã¯ãåä½ã§ã®è©±ã§ãã2ã¤ãä½µç¨ããã¨ã«ã¼ã«é¢ã§ã³ã³ããªã¯ããèµ·ããã®ã§ãããªã«ããããã¨ããã®ãæ ¹åºã«ãããããããããã©ã°ã¤ã³å ¥ãããã³ã³ãã£ã°æ¸ããããã¦ããã
ããããPrettierã ããåä½ã§ä½¿ãã ãã§ããã°ãã¨ãã£ã¿ã«ãã©ã°ã¤ã³ãå ¥ãã¦ãã¾ãã°OKã¨ããäºå®ããããéã«ããã°ãããã¸ã§ã¯ãåä½ã§ã¯ãªããããªâ¦ä¾ãã°gitã«ãä¸ããªããããªå®é¨çãªJSãæ¸ãã¨ããPrettierã使ã£ã¦æ¸ãããã®ãªããã¨ãã£ã¿ã®Prettierãã©ã°ã¤ã³ãå ¥ããå¿ è¦ãããã
Prettierãã©ã°ã¤ã³ã®è¨å®ã«ãESLintã®ãã©ã°ã¤ã³åæ§ã«"onSave"ã®ãããªè¨å®ããã£ã¦ãä¿åæã«Prettierãèµ°ãããã«ã§ãããã§ããããè¨å®ãã¦ããã¨ãããã¾ã§è§£èª¬ãã¦ãããããªeslint --fix
ã§Prettierãèµ°ããããªããã¸ã§ã¯ãã触ãã¨ãã«2åPrettierãèµ°ãã®ã§ã注æããã»ããããã¨ããåé¡ã¯ããããªã®ã§èªåã¯Prettierã®ãã©ã°ã¤ã³ã使ãå ´é¢ã§ã¯æåã§å®è¡ããã¦ããã
ã¨ãã£ã¿ä¾åã«ãªãã®ã§git hookã§Pre-commitæã«Prettierãã¾ããã
èªåã¯ä¸è¿°ã®ã¨ãã£ã¿é£æºããã¦ãã¡ã¤ã«ä¿åæã«éä¸Prettierã¨ESLintãèµ°ããã¨ã©ã¼ãåºããé½åº¦ç´ãã»ãã好ããªã®ã§ãããã使ãããããã¦ãããã§ãOSSã¨ãè¤æ°äººã§å ±æããããã¸ã§ã¯ãã®å ´åãå ¨å¡ãã¨ãã£ã¿ãã©ã°ã¤ã³å ¥ãã¦é£æºãããå¿ è¦ãåºã¦ãã¦ããã§ã¯ãããªãã誰ããã¨ãã£ã¿é£æºããªãã¾ã¾gitã«ããã·ã¥ããã¨ESLint&Prettierã®æ¤é²ãããã¦ããªãã³ã¼ããgitã«ç´ãè¾¼ãã§ãã¾ãã
ããããããã§git commit
ããã¨èªåã§eslint --fix
ãèµ°ãããã«è¨å®ãã¦ããã¨ééãããªããªã£ã¦ä¾¿å©ã
å ¬å¼ã«è§£èª¬ããã£ã¦ããããã¯è¤æ°ãããã©ããã¥ã©ã¼ã£ã½ãHuskyã¨Lint-stagedã使ãæ¹æ³ã§åã¯ãã£ã¦ããã
ã¾ãhusky
ã¨lint-staged
ãå
¥ããã
yarn add -D lint-staged husky
package.json
ã«ä»¥ä¸ã追å
{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{js,jsx}": [ "eslint --fix", "git add" ] } }
ããã§git commit
æã«ESLintã®Fixãèµ°ãã®ã§gitã³ããããããã³ã¼ãã¯ç¢ºå®ã«lint&formatæ¸ã¿ã®ã³ã¼ãã¨ãããã¨ã«ãªã£ã¦ç§©åºãçã¾ããã
TypeScriptã§Prettierããã
ä¸è¨ã¾ã§ã§JSç°å¢ï¼ESLint+Prettierãä½µç¨ã§ããããã«ãªã£ããTSç°å¢ï¼TSLint+Prettierã§ã¯ã©ãããã°ã¨ãã解説ã
æµãã¯åããªã®ã§éã«æ¸ãã¾ãã
ã¾ãå¿ è¦ãªã©ã¤ãã©ãªãå ¥ãã
yarn add -D tslint prettier tslint-config-prettier tslint-plugin-prettier
- GitHub - prettier/tslint-config-prettier: Use tslint with prettier without any conflict
- eslint-config-prettierç¸å½
- GitHub - prettier/tslint-plugin-prettier: Runs Prettier as a TSLint rule and reports differences as individual TSLint issues
- eslint-plugin-prettierç¸å½
tslint.json
ãæ¸ã
{ "rulesDirectory": ["tslint-plugin-prettier"], "extends": ["tslint-config-standard", "tslint-config-prettier"], "rules": { "prettier": [ true, { "singleQuote": true, "semi": false } ] } }
ããããæãã
ã¨ãã£ã¿ã®TSLintãã©ã°ã¤ã³
Pre-commit
ESLintã®ã¨ãã¨åããhusky
ã¨lint-staged
ãå
¥ããã
{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{ts,tsx}": [ "tslint --fix", "git add" ] } }
lint-staged
ã.ts対象ã«ãã
åºæ¬çã«ESLintã¨ããããã¯åãã§ãtslint.jsonã®æ¸ãæ¹ãè¥å¹²ESLintã¨ç°ãªããããã ã¨æãã
ã¡ãªã¿ã«
ããã¯å°ãã¿ã§ã¯ãããã©ãESLintã¯.eslintrc
ãæ¢ãã¨ãã«ã¼ããã£ã¬ã¯ããªã¾ã§ãã£ã¨é¡ã£ã¦æ¢ç´¢ãããã®ã§ãä»®ã«ããã¸ã§ã¯ãã«.eslintrc
ããªããã°ã¦ã¼ã¶ã¼ã®ãã¼ã«ã«ã«ã¼ããã£ã¬ã¯ããªã¾ã§é¡ãã
ã«ã¼ãã«dotfilesãç½®ã風潮ãªã®ã§ãèªåã®.eslintrc
ãã«ã¼ããã£ã¬ã¯ããªã«ããã¦ããã°ãä¾ãã°éã«ã¨ãã£ã¿ã§JSãæ¸ãã¨ãã«ã¯ã«ã¼ãã«ããèªåã®.eslintrc
ãåç
§ãããã
ã¨ãã£ã¿ã®ãã©ã°ã¤ã³ã«.eslintrcã®å ´æãæå®ãããªãã·ã§ã³ããã£ãããããã©ãåºæ¬çã«ç¹æ®ãªé層ã«ããã¦ç®¡çãã¦ããªãã®ã§ããã°ãããããè¨å®ã¯ä¸è¦ã ã£ããããã
é·ããªã£ããã©ESLint+Prettierãå°å ¥ããã«ã¯ããããæãã§ãã
.eslintrc
ã§Prettierã管çãã¦å®è¡ã¯eslint --fix
é§åã¨ãããã¨ãç解ã§ããã°ãããªã«é£ãããªããã©ä»éããè¨å®ããã©ã°ã¤ã³ãå¤ãããã1åã«ã¾ã¨ãã¦æ¬²ããæ°ãããã