
рдЖрджрд┐рд▓ рдЗрдорд░рд╛рди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдкрд░ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡, рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрджрд┐рд▓ рдХрд╛
рдирдпрд╛ рд▓реЗрдЦ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реБрдВрджрд░, рд╕рд╛рдл рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдЦрдХ рд╕реЗ: рдЖрдк рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рдкрдврд╝реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрдврд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЬрд╡рд╛рдм рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕рд╡рд╛рд▓ рд╣реИрдВред рдХреНрдпрд╛ "рдореГрдд" рдХреЛрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдпрджрд┐ рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ? рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░реЗрдВ? рдпреЗ рд╕рд╡рд╛рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдФрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЗрдирдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рддрдм рдЖрдкрдХреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдкреИрдЪ рдЫреЗрджреЛрдВ рдХреА рддрд▓рд╛рд╢ рди рдХрд░рдиреА рдкрдбрд╝реЗред рдЕрдЪреНрдЫрд╛ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЬрд┐рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ рд╡рд╣ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рдкреЗрд╢реЗ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░" ред
рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░реЛрдореЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп 10,000 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред
рд▓реЗрдЦ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдБ рд╣реИ:
- рдЦреВрдмрд╕реВрд░рдд
- ESLint
- рд╕реНтАНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рд╛рд░реВрдк рдФрд░ рдмрдЪрдд рдкрд░ рдирд┐рдпрдВрддреНрд░рдг
- рдХрд░реНрдХрд╢
- рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдордВрдЪрди
- рд╣рд╕реНрдХреА рдФрд░ рд▓рд┐рдВрдЯ-рдордВрдЪрд┐рдд рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде
- EditorConfig
рдЖрдЗрдП Prettier рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдЙрдкрдХрд░рдг рдПрдХ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдХреЛрдб рдЕрдиреБрдХреВрд▓рдХ рд╣реИред
рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?рддреИрдпрд╛рд░ рдХреЛрдб рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрднрдЧ 20 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Prettier рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рдЖрдк рдФрд░ рддреЗрдЬрд╝реА рд╕реЗ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдкреНрд░реАрдЯреАрдпрд░ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЯреАрдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдЬреЛ рд╕реБрдВрджрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рддреЛ Prettier рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╕реНрдерд╛рдкрдирд╛рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╛рдордХ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдлрд╝реЛрд▓реНрдбрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:
npm init -y
рдпрд╣ рдХрдорд╛рдВрдб package.json рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдЧреАред
рдЕрдЧрд▓рд╛, рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред
yarn add --dev prettier
рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд╡ рдирд┐рд░реНрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "prettier": "prettier --write src/**/*.js" }, "devDependencies": { "prettier": "^1.14.3" } }
рдЗрд╕рдХреЗ рдмрд╛рдж, рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ src / folder рдмрдирд╛рдПрдВред рдФрд░ src / index.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ:
let person = { name: "Yoda", designation: 'Jedi Master ' }; function trainJedi (jediWarrion) { if (jediWarrion.name === 'Yoda') { console.log('No need! already trained'); } console.log(`Training ${jediWarrion.name} complete`) } trainJedi(person) trainJedi({ name: 'Adeel', designation: 'padawan' });
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирд╛рдбрд╝реА рдХреЛрдб рдХреЗ рд╕рд╛рде src / app / index.js рд╣реИред
рдЖрдк рдЗрд╕ рдкрд░ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВ;
- рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
- рдХреБрдЫ рди рдХрд░реЗрдВ (рдЪреАрдЬреЛрдВ рдХреЛ рдЬрд╛рдиреЗ рджреЗрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ)ред
рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдПрдХ Prettier рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред json рдлрд╝рд╛рдЗрд▓ред
рдЕрдм рдРрдк рдлреЛрд▓реНрдбрд░ рдореЗрдВ prettier.config.js рдмрдирд╛рдПрдВред
module.exports = { printWidth: 100, singleQuote: true, trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, semi: true, };
PrintWidth рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб 100 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ;
SingleQuote рд╕рднреА рдбрдмрд▓ рдХреЛрдЯреНрд╕ рдХреЛ рд╕рд┐рдВрдЧрд▓ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ;
trailingComma рдХреЛрдб рдореЗрдВ рд╕рднреА рдЭреВрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдВрддрд┐рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВред рдЗрд╕реЗ
рдпрд╣рд╛рдБ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛
рд╣реИредрдХреЛрд╖реНрдардХ рд╕реНрдерд╛рди рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ:
If bracketSpacing is true - Example: { foo: bar } If bracketSpacing is false - Example: {foo: bar} jsxBracketSameLine JSX- ">"
tabWidth рдЗрдВрдбреЗрдВрдЯ рд╕реНрддрд░ рдкрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрд░реНрдз - рдЕрдЧрд░ рд╕рдЪреНрдЪреЗ рдкреНрд░рд┐рдВрдЯ; рдмрдпрд╛рди рдХреЗ рдЕрдВрдд рдореЗрдВред
рдпрд╣рд╛рдВ рдЙрди
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ, рдЬреЛ рдкреНрд░рд┐рдЯрд┐рдпрд░ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
"Prettier": "prettier - src / ** / * рд▓рд┐рдЦреЗрдВред Js"
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ src / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА .js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддреА рд╣реИред
-рд▓реЗрдЦрд┐рдд рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдпрд╛рд░реНрди рдкреНрд░реАрдЯреАрдпрд░

рдпрджрд┐ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ
рдпрд╣рд╛рдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рддреИрдпрд╛рд░ рд╕рдм рдХреБрдЫ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
ESLint
рдпрд╣ рдЙрдкрдХрд░рдг рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкреИрдЯрд░реНрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдпрдореЛрдВ рдФрд░ рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдХрд╛рдлреА рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рд╖рд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВред ESLint рдЖрдкрдХреЛ рд▓рд┐рдЦрд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
ESLint рдХреИрд╕реЗ рдЕрдкрдиреА рддрд░рд╣ рдХрд╛ рд╣реИ?рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝ рдФрд░ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рджреЛ рд╢реИрд▓реА рдЧрд╛рдЗрдб рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ:- Google рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб
- Airbnb рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб
рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВред рд╡рд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЖрдк
рдЙрд╕рдХреЗ GitHub рдкрд░ рдЬрд╛рдХрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред Json рдлрд╛рдЗрд▓:
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ:
рдПрд╕реНрд▓рд┐рдВрдЯ : рдпрд╣ рджреЗрд╢реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИред
рдмреИрдмрд▓-рдПрд╕реНрд▓рд┐рдВрдЯ :
рдЙрдкрдпреЛрдЧреА рдпрджрд┐ рдЖрдк рдлреНрд▓реЛ рдпрд╛ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ ESLint рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
eslint-config-airbnb : рдпрд╣ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░ рдХреЛ Airbnb рдХреЗ ESLint рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
eslint-plugin-babel: babel-eslint рдХреЗ рд▓рд┐рдП рд╕рд╛рдереА рдкреНрд▓рдЧрдЗрдиред
рдЕрдиреБрд▓рдЧреНтАНрдирдХ-рдкреНтАНрд▓рдЧ-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред
рдПрд╕реНрд▓рд┐рдВрдЯ-рдкреНрд▓рдЧрдЗрди-рдЖрдпрд╛рдд: ES2015 + (ES6 +) рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрд╕реНрд▓рд┐рдВрдЯ-рдкреНрд▓рдЧрдЗрди- рдкреНрд░реАрдЯреАрдпрд░
: рдкреНрд░реЗрдЯрд┐рдпрд░ рдХреЗ рд╕рд╛рде ESLint рдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИред
рдмреБрдирд┐рдпрд╛рджреА рд╕рд╛рдорд╛рди рдЦрддреНрдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ .eslintrc.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
module.exports = { env: { es6: true, browser: true, node: true, }, extends: ['airbnb', 'plugin:jest/recommended', 'jest-enzyme'], plugins: [ 'babel', 'import', 'jsx-a11y', 'react', 'prettier', ], parser: 'babel-eslint', parserOptions: { ecmaVersion: 6, sourceType: 'module', ecmaFeatures: { jsx: true } }, rules: { 'linebreak-style': 'off', // Don't play nicely with Windows. 'arrow-parens': 'off', // Incompatible with prettier 'object-curly-newline': 'off', // Incompatible with prettier 'no-mixed-operators': 'off', // Incompatible with prettier 'arrow-body-style': 'off', // Not our taste? 'function-paren-newline': 'off', // Incompatible with prettier 'no-plusplus': 'off', 'space-before-function-paren': 0, // Incompatible with prettier 'max-len': ['error', 100, 2, { ignoreUrls: true, }], // airbnb is allowing some edge cases 'no-console': 'error', // airbnb is using warn 'no-alert': 'error', // airbnb is using warn 'no-param-reassign': 'off', // Not our taste? "radix": "off", // parseInt, parseFloat radix turned off. Not my taste. 'react/require-default-props': 'off', // airbnb use error 'react/forbid-prop-types': 'off', // airbnb use error 'react/jsx-filename-extension': ['error', { extensions: ['.js'] }], // airbnb is using .jsx 'prefer-destructuring': 'off', 'react/no-find-dom-node': 'off', // I don't know 'react/no-did-mount-set-state': 'off', 'react/no-unused-prop-types': 'off', // Is still buggy 'react/jsx-one-expression-per-line': 'off', "jsx-a11y/anchor-is-valid": ["error", { "components": ["Link"], "specialLink": ["to"] }], "jsx-a11y/label-has-for": [2, { "required": { "every": ["id"] } }], // for nested label htmlFor error 'prettier/prettier': ['error'], }, };
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ .eslintignore рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред
/.git
/.vscode
node_modules
.Eslintrc.js рдлрд╝рд╛рдЗрд▓ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ?
рдЖрдЗрдП рджреЗрдЦреЗрдВ:
module.exports = { env:{}, extends: {}, plugin: {}, parser: {}, parserOptions: {}, rules: {}, };
env: рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд╛рддрд╛рд╡рд░рдг es6, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдПрдХ рдиреЛрдб рд╣реИрдВред ES6 рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░ ECMAScript 6 рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдПрдЧрд╛ред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛрдЬ рдЬреИрд╕реЗ рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рддрджрдиреБрд╕рд╛рд░, рдиреЛрдб рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ рдиреЛрдб рдЪрд░ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдлреИрд▓реА рд╣реБрдИ рд╣реИ: рддрд╛рд░ рдХреА рд╕рд░рдгреА - рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЕрднреА рд╣рдо рдПрдпрд░рдмреАрдПрдирдмреА рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЬрд╕реНрдЯ рдФрд░ рдПрдВрдЬрд╛рдЗрдо рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдкреНрд▓рдЧрдЗрдиреНрд╕: рдпреЗ рдореВрд▓ рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдо рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо babel, import, jsx-a11y, рд░рд┐рдПрдХреНрдЯ, рдкреНрд░реАрдЯреАрдпрд░ рдФрд░ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред
рдкрд╛рд░реНрд╕рд░: ESLint рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрд╕реНрдкреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо
рдмреИрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ
рдмреИрдмрд▓-рдИрдПрд╕рдПрд▓рдЖрдИрдПрдирдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
parserOptions: рдЬрдм рд╣рдо рдПрд╕реНрдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рд░реНрд╕рд░ рдХреЛ babel-eslint рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ parserOptions рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдирд┐рдпрдо: рдХрд┐рд╕реА рднреА рдирд┐рдпрдо рдХреЛ рд╣рдо рдпрд╣рд╛рдВ рдмрджрд▓ рдпрд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЖрдЗрдП .llintignore рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрди рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ ESLint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рддреАрди рдРрд╕реЗ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
/.it - тАЛтАЛрдЬрдм рдореИрдВ рдЕрдкрдиреА рдЧрд┐рдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛
/.vscode, рдЪреВрдВрдХрд┐ рдореИрдВ рд╡реАрдПрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЕрдкрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ред
рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ - рдореИрдВ рдпрд╛ рддреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдирд╣реАрдВ рдЫреВрддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ред
рдпрд╣ рд╕рдм рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ package.json рдХреЗ рд▓рд┐рдП рдирдИ рдЧрдпреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
"рд▓рд┐рдВрдЯ": "рдПрд╕реНрд▓рд┐рдВрдЯ - рдбреЗрдмрдЧ src /"
"рд▓рд┐рдВрдЯ: рд░рд╛рдЗрдЯ": "рдПрд╕реНрд▓рд┐рдВрдЯ - рдбрд┐рдмрдЧ src / --fix"$ рдпрд╛рд░реНрди рд▓рд┐рдВрдЯ - рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк src / рдореЗрдВ рдЕрдкрдиреА рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд▓реЙрдЧ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рддрдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

$ рдпрд╛рд░реНрди рд▓рд┐рдВрдЯ: рд▓рд┐рдЦреЗрдВ - рдпрд╣ рдХрдорд╛рдВрдб рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпрд╛рд░реНрди рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд┐рдд рдЕрдиреБрдорддрд┐ рд╣реИ - рдХрдорд╛рдВрдб рдХреЛрдб рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдХрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред
рддреЛ, рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЗрд╕ рдХреНрд╖рдг рддрдХ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рд╕рдореНрдорд╛рди рдФрд░ рдкреНрд░рд╢рдВрд╕рд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред

рдХрд░реНрдХрд╢
рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ рдЖрдк рдПрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдпрд╛ рдзрдХреНрдХрд╛ рдХреЛрдб рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдмрд╕ рд╣рд╕реНрдХреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ:
рдпрд╛рд░реНрди рдЬреЛрдбрд╝ - рджреЗрд╡ рдХрд░реНрдХрд╢рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред Json рдлрд╝рд╛рдЗрд▓:
"husky": { "hooks": { "pre-commit": "YOUR_COMMAND_HERE", "pre-push": "YOUR_COMMAND_HERE" } },
рдЕрдм рд╣рд░ рдмрд╛рд░ рдПрдХ рдХрдорд┐рдЯ рдпрд╛ рдкреБрд╢ рдХреЗ рджреМрд░рд╛рди, рд╕реНрдирд┐рдкреЗрдЯ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдХрдорд╛рдВрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЛрдб рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХрдорд╛рдВрдбред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдордВрдЪрди
рдЦрд░рд╛рдм рдХреЛрдб рдХреЛ рдЖрдкрдХреА рдЧрд┐рдЯ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд▓рд┐рдВрдЯрд░-рдордВрдЪрди рдХреНрдпреЛрдВ?рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рд╕рддреНрдпрд╛рдкрди рдХрдорд┐рдЯ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднрдВрдбрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдордЧреНрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдПрдХ рдзреАрдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдпрд╛рд░реНрди рдЬреЛрдбрд╝ - рджреЗрд╡ рд▓рд┐рдВрдЯ-рдордВрдЪрдирдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
"lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] },
рддреЛ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдЪрд▓рд╛рддреЗ рд╣реИрдВ: рд▓рд┐рдЦреЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЪрд░рдг рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВред рдХрдорд╛рдВрдб .js рдФрд░ .jsx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╕реНрдХреА рдФрд░ рд▓рд┐рдВрдЯ-рдордВрдЪрди рдХрд╛ рд╕рдВрдпреЛрдЬрди
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд▓рд┐рдВрдЯ-рд╕реНрдЯреЗрдЬреНрдб рдирд╛рдордХ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ npm рд░рди рд▓рд┐рдВрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ: рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдФрд░ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рддреНрдпрд╛рдкрд┐рдд рдХреЛрдб рдЪрд░рдг рдХреЗ рдЪрд░рдг рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо package.json рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
{ "name": "react-boiler-plate", "version": "1.0.0", "description": "A react boiler plate", "main": "src/index.js", "author": "Adeel Imran", "license": "MIT", "scripts": { "lint": "eslint --debug src/", "lint:write": "eslint --debug src/ --fix", "prettier": "prettier --write src/**/*.js" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] }, "devDependencies": { "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-airbnb": "^17.0.0", "eslint-config-jest-enzyme": "^6.0.2", "eslint-plugin-babel": "^5.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jest": "^21.18.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-prettier": "^2.6.0", "eslint-plugin-react": "^7.9.1", "husky": "^1.1.2", "lint-staged": "^7.3.0", "prettier": "^1.14.3" } }
рдЕрдм рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ
$ рдЧрд┐рдЯ рдЬреЛрдбрд╝ред
$ git рдХрдорд┐рдЯ -m "рдХреБрдЫ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдпрд╣рд╛рдБ"рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ .eslintrc.js рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
EditorConfig рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдРрдк / рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ .editorconfig рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВред рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдбрд╛рд▓реЗрдВ:
# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true [*.md] trim_trailing_whitespace = false [*.js] trim_trailing_whitespace = true # Unix-style newlines with a newline ending every file [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 insert_final_newline = true max_line_length = 100
рдпрд╣рд╛рдВ рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ
EditorCondig рдХрд╛ рд╕рдорд░реНрдерди
рдХрд░рддреЗ рд╣реИрдВ ред рд╕реВрдЪреА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рд╡реЗрдм рддреВрдлрд╛рди, рдРрдк рдХреЛрдб, рдПрдЯрдо, рдЧреНрд░рд╣рдг, рдИрдореИрдХреНрд╕, рдмреЗрдмрд┐рдЯред
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдпрд╣ рдХрд░рддрд╛ рд╣реИ:
- .Md рдФрд░ .js рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЛ рд╕реНрдЯреНрд░рд┐рдк рдХрд░реЗрдВред
- рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╢реИрд▓реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
- рдЗрдВрдбреЗрдВрдЯ рдЖрдХрд╛рд░ рдХреЛ 2 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
- рдПрдХ рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
- рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ 100 рд╡рд░реНрдгреЛрдВ рддрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ
рдпрд╣ рд╣реИ ред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: