Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Make Linting Great Again (Long version)
Search
Andrey Okonetchnikov
January 25, 2018
Programming
0
95
Make Linting Great Again (Long version)
Presented at Agent Conf 2018
Andrey Okonetchnikov
January 25, 2018
Tweet
Share
More Decks by Andrey Okonetchnikov
See All by Andrey Okonetchnikov
Component-Driven Design Systems Workshop
okonet
0
220
A Common Design Language
okonet
2
2k
Modular CSS v2 (CSS-in-JS edition)
okonet
3
1.1k
Make Linting Great Again
okonet
0
170
Modular CSS — Agent Conf '17 Edition
okonet
3
390
Modular CSS
okonet
3
280
JavaScript для насыщенных пользовательских интерфейсов
okonet
0
110
Профессия "Front-end архитектор"
okonet
0
170
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
580
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
Patterns of Patterns
denyspoltorak
0
1.4k
CSC307 Lecture 04
javiergs
PRO
0
660
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
140
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
140
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
Fluid Templating in TYPO3 14
s2b
0
130
AgentCoreとHuman in the Loop
har1101
5
240
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
Featured
See All Featured
Side Projects
sachag
455
43k
We Are The Robots
honzajavorek
0
160
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
170
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
76
The browser strikes back
jonoalderson
0
390
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Transcript
Make Linting Great Again with @okonetchnikov
None
https://reason-conf.com
What the #$&% is lint?!
–Wikipedia “lint or a linter is any tool that flags
suspicious usage in software written in any computer language.”
–me “linter is a tool that finds stupid bugs.”
None
These things here :(
None
None
None
How to fix that?
Lint all the things!
Stylelint JSON Lint
Why lint?
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “On average, software developers spend 50% of their
time finding and fixing bugs.”
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “…this inefficiency is estimated to cost the global
economy $312 billion per year.”
None
In reality, though…
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “On average, software developers spend 50% of their
time finding and fixing bugs.”
– me “On average, software developers spend 50% of their
time discussing code style.”
None
You don’t need to uglify your code if it’s already
ugly!
How to fix that?
One code style to rule them all!
None
None
Using linters & formatters leads to 1. Fewer (stupid) bugs
2. Better readability => less time in code reviews 3. But it can slow you down… :(
—Slow down?! —We’re not doing that then!
My typical day…
None
None
10 minutes later…
None
None
None
None
None
None
None
None
None
Raise your hand if this sound familiar to you ✋
None
None
None
428.689
None
2.844.799
– Everyone “I wish I could lint before committing the
changes to the repository”
git hooks
None
git hooks are 1. Hard to setup 2. Hard to
manage 3. Hard to share across the team
npm install -D husky yarn add --dev husky
{ "scripts": { "precommit": "eslint ." } }
None
None
Thanks husky! 1. Hard to setup 2. Hard to manage
3. Hard to share across the team
…but linting the whole project 1. Can be quite slow
2. Will display irrelevant results
None
What if we could run linters only on files we’re
about to commit?
Meet lint-staged!
npm install -D lint-staged yarn add --dev lint-staged
{ "scripts": { "precommit": "lint-staged" } }
{ "scripts": { "precommit": "lint-staged" }, "lint-staged": { "*.js": "eslint"
} }
None
git hooks are 1. Hard to setup 2. Hard to
manage 3. Hard to share across the team 4. Very slow 5. Displaying irrelevant results A WES OME!
There is more!
Automatically fix lint errors
{ "lint-staged": { "*.js": "eslint" } }
{ "lint-staged": { "*.js": [ "eslint --fix", "git add" ]
} }
Automatically reformat your code
None
{ "lint-staged": { "*.js": [ "eslint --fix", "git add" ]
} }
{ "lint-staged": { "*.js": [ "prettier --write", "git add" ]
} }
None
lint-staged and prettier being used in create-react-app
lint-staged and prettier being used in Babel!
How does it work?
#!/bin/bash executable=$(npm bin)/staged-files linter_name="eslint" linter_path=$(npm bin)/eslint lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
None
#!/bin/bash executable=$(npm bin)/staged-files linter_name="stylelint" linter_path=$(npm bin)/stylelint lint_extensions="**/*.@(css|scss|less|styl)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
#!/bin/bash executable=$(npm bin)/staged-files linter_name="flow" linter_path=$(npm bin)/flow lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install ${linter_name}-bin" fi
#!/bin/bash executable=$(npm bin)/staged-files linter_name="jscs" linter_path=$(npm bin)/jscs lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
DRY
Present
lint-staged is a tool that • Can run any task
• Easy to install via npm • Easy to distribute across the team (.lintstagedrc) • Easy to use (DX!)
Future?
None
None
None
None
None
None
Open Source = ❤
https://github.com/okonet/lint-staged
Maintainers ❤
None
Recap
None
Please solve real problems!
Thank You!
Andrey Okonetchnikov @okonetchnikov http://okonet.ru https://github.com/okonet