рдЖрдк рдиреАрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ ... рдЖрдкрдиреЗ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рдкрдврд╝реЗ, рдЬреИрд╕реЗ Airbnb рд╕реЗ, рдЕрдЧреНрд░рдгреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ... рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реИ? рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЦрд░рд╛рдм рдкреИрдЯрд░реНрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛, рдЪрд╛рд╣реЗ рд╡рд╣ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдкрд░рд┐рдЪрд┐рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИ? рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЯреАрдо рд▓реАрдбрд░ рд╣реЛрдВ рдЬрд┐рдирдХреЗ рдиреЗрддреГрддреНрд╡ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЯреАрдо рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдХреА рдЯреАрдо рдореЗрдВ рдирдП рд▓реЛрдЧ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХреЛрдб рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдЖрдкрдХреЗ рдорд╛рдирдХреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рдЖрдкрдХреЗ рджрд┐рди рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЬрдм рдпреЗ рдЪреЗрдХ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде?

рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдЕрднреА рдкреВрдЫреЗ рдЧрдП рдкреНрд░рд╢реНрди рдХреЗ рдкреНрд░рддрд┐ рд╕рдорд░реНрдкрд┐рдд рд╣реИрдВред рд╡рд╣ рдЬреЛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдердХрд╛ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдердХрд╛рдК рд╣реИред рдпрд╣рд╛рдВ рд╡рд╣ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рд╣реА рдЖрд╡реЗрджрди рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрд░реНрдерд╛рддреН, рдпрд╣рд╛рдБ рд╣рдо Prettier, ESLint, Husky, Lint-Staged, EditorConfig рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдФрд░ рдХреЛрдб рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдЬрд╣рд╛рдБ, рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рд╡рд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реИред
рдЦреВрдмрд╕реВрд░рдд
рдкреНрд░реЗрдЯрд┐рдпрд░ рдПрдХ рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдареЛрд░-рдХреЛрдбрд┐рдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдкреНрд░реАрдЯреАрдпрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИIer Prettier рдХреА рддрд╛рдХрдд
рдпрд╣рд╛рдВ рдкреНрд░реАрдЯрд┐рдпрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ:
- рдореМрдЬреВрджрд╛ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдмрд╛рдВрдзрдирд╛ред рдкреНрд░реАрдЯреАрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рдореИрдиреБрдЕрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреА 20,000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╢реНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред
- Prettier рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░реЗрдЯрд┐рдпрд░ рдХреЛрдб рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рдХрд░рддреЗ рд╕рдордп рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП "рдФрд╕рдд", рдХрдо рд╕реЗ рдХрдо рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ, рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рддреЗрдЬ рдХреЛрдиреЛрдВ рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд┐рдпрд╛ рд╣реИред
- Prettier рдЖрдкрдХреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрддрд╛ рд╣реА рдирд╣реАрдВ рдЪрд▓рддрд╛ рдХрд┐ рдХреЛрдб рдХреЛ рдлреЙрд░реНрдореЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рдФрд░ рдореЗрд╣рдирдд рд▓рдЧрддреА рд╣реИред рдкреНрд░реАрдЯреАрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рдХреБрд╢рд▓рддрд╛, рдкреНрд░реАрдЯреАрдпрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, 10% рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИред
- Prettier рд╢реБрд░реБрдЖрддреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЧрдВрднреАрд░ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдирдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рдпреЛрдЧреНрдп рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рд┐рдЯрд┐рдпрд░ рдЖрдкрдХреА рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
тЦНConfiguring Prettier
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░реАрдЯрд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред
app
рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ, рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЬрд╛рдХрд░, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
npm init -y
рдЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
npm
package.json
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ, рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ,
yarn
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк
npm
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Prettier рдХреЛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рдХрд╛рд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ
prettier
рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
yarn add
рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ
package.json
рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
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": { "prettier": "prettier --write src/**/*.js" }, "devDependencies": { "prettier": "^1.14.3" } }
рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐
"prettier": "prettier тАФ write src/**/*.js"
рд▓рд╛рдЗрди рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ
"prettier": "prettier тАФ write src/**/*.js"
рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред рдЗрд╕ рдмреАрдЪ,
app
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
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
, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЦрд░рд╛рдм рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╣реИред
рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ? рдЦрд░рд╛рдм рд╕реНрд╡рд░реВрдкрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:
- рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВред
- рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВ (рдореИрдВ рдЖрдкрд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╣реАрдВ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ)ред
рдореИрдВ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЕрдм рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
package.json
рдлрд╝рд╛рдЗрд▓ рдХреЗ
scripts
рдЕрдиреБрднрд╛рдЧ рдореЗрдВ Prettier рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
app
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ prettier.config.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░реАрдпрд░рд┐рдпрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдЬреЛрдбрд╝реЗрдВ:
module.exports = { printWidth: 100, singleQuote: true, trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, semi: true, };
рдЖрдЗрдП рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
printWidth: 100
- рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ 100 рдЕрдХреНрд╖рд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПредsingleQuote: true
- рд╕рднреА рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХреЛ рдПрдХрд▓ рдЙрджреНрдзрд░рдг рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП Airbnb рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВредtrailingComma: 'all'
- рд╡рд╕реНрддреБ рдХреА рдЕрдВрддрд┐рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рдж рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИредbracketSpacing: true
- рд╡рд╕реНрддреБ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдмреАрдЪ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдФрд░ рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдореЗрдВ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ред рдпрджрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ true
, рддреЛ рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА: { foo: bar }
ред рдпрджрд┐ false
рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ false
, рддреЛ рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ: {foo: bar}
редjsxBracketSameLine: false
- рдЗрд╕ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдмрд╣реБ-рдкрдВрдХреНрддрд┐ JSX рддрддреНрд╡реЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХ рдХреЛ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдирд┐рдпрдо true
рд╣реИ, рддреЛ рдХреЛрдб рдРрд╕рд╛ рджрд┐рдЦрддрд╛ true
:
<button className="prettier-class" id="prettier-id" onClick={this.handleClick}> Click Here </button>
рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣
false
:
<button className="prettier-class" id="prettier-id" onClick={this.handleClick} > Click Here </button>
tabWidth: 2
- рд╕рдВрд░реЗрдЦрдг рд╕реНрддрд░ рдкреНрд░рддрд┐ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИредsemi: true
- рдпрджрд┐ рдпрд╣ рдирд┐рдпрдо рд╕рд╣реА рдкрд░ рд╕реЗрдЯ true
, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╕рднреА рдкреНрд░рд┐рдЯрд┐рдпрд░ рдирд┐рдпрдо рдЦреЛрдЬреЗрдВред
рдЕрдм рдЬрдм рдирд┐рдпрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:
"prettier": "prettier тАФ write src/**/*.js"
рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкреНрд░реАрдЯреАрдпрд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░
src
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА
.js
рдлрд╛рдЗрд▓реЗрдВ рдвреВрдВрдврддрд╛ рд╣реИред -
--write
рдзреНрд╡рдЬ рдЙрд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рдкрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:
yarn prettier
рдЗрд╕рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЦрд░рд╛рдм рдлреЙрд░реНрдореЗрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рдеред
Prettier рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рдХрд╛ рдкрд░рд┐рдгрд╛рдордЗрд╕ рдкрд░ рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░реАрдЯреАрдпрд░ рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдерд╛ред рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рд▓рд┐рдВрдЯрд░ рдХреАред
ESLint
рд▓рд╛рдЗрдирд┐рдВрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдпрд╛ рдХреЛрдб рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд╢реИрд▓реА рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдЯрд░ рд╣реИрдВ, рдХрднреА-рдХрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдХреЛрдбрд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдирд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреА рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдУрдкрди рд╕реЛрд░реНрд╕ рдЗрдВрдлреЙрд░реНрдореЗрд╢рди
рдкреЗрдЬ рд╕реЗ рд▓реА рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
тЦН рдореБрдЭреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЪреВрдВрдХрд┐
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЛрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдХреЛрдб рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкрддрд╛ рдЪрд▓рддреА рд╣реИрдВред
ESLint рдЬреИрд╕реЗ
рд▓рд┐рдВрдЯрд░ , рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
Int ESLint рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдХрд░рдг рдХреНрдпреЛрдВ рд╣реИ?
рдЗрд╕ рдЦрдВрдб рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ ESLint рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рддреЛ, рдХреЛрдб рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рдПрдХ рдЕрдЦрдВрдб рдкреИрдХреЗрдЬ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЬреБрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдЯ рдирд┐рдпрдо рд╕реНрд╡рд╛рдпрддреНрдд рд╣реИ, рдЗрд╕реЗ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдпрд╛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЛ рдбреЗрд╡рд▓рдкрд░ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЕрд▓рд░реНрдЯ рд╕реНрддрд░ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА (рдЪреЗрддрд╛рд╡рдиреА) рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ (рддреНрд░реБрдЯрд┐) рд╣реЛ рд╕рдХрддреА рд╣реИред
ESLint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд╕рдордЭ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд▓рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдХрд┐рд╕ рд╕реЗрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореМрдЬреВрджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реИрд▓реА рдЧрд╛рдЗрдбреЛрдВ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ:
рдореИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, Airbnb рд╢реИрд▓реА рдЧрд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭреЗ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдХрдВрдкрдиреА рдореЗрдВ рдореЗрд░реЗ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рд╕рд▓рд╛рд╣ рджреА рдЧрдИ, рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рдкреЗрд╢реЗрд╡рд░ рдХрд░рд┐рдпрд░ рд╢реБрд░реВ рд╣реБрдЖ, рдФрд░ рдореИрдВ рдЗрд╕ рд╢реИрд▓реА рдЧрд╛рдЗрдб рдХреЛ рдЕрдкрдиреА рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рд╕рдВрдкрддреНрддрд┐ рдорд╛рдирддрд╛ рд╣реВрдВред
рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ - GitHub рдкрд░ рдЗрд╕рдХреЗ
рднрдВрдбрд╛рд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдЕрдм рдЪрд▓рд┐рдП
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" } }
рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЙрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ
package.json
рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред
package.json
ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдкреИрдХреЗрдЬреЛрдВ рдХреА рднреВрдорд┐рдХрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ:
babel-eslint
- рдЖрдкрдХреЛ babel-eslint
рдХреЛ рджреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП babel-eslint
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдлреНрд▓реЛ рдпрд╛ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ ESLint рдЕрднреА рддрдХ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредeslint
рдХреЛрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИредeslint-config-airbnb
- eslint-config-airbnb
рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредeslint-plugin-babel
рдПрдХ ESLint рдкреНрд▓рдЧрдЗрди рд╣реИ, рдЬреЛ babel-eslint
рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬреЛ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп babel-eslint
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВредeslint-plugin-import
- рдпрд╣ рдкреИрдХреЗрдЬ рддрд╛рдЬрд╛ import/export
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрдереЛрдВ рдХреА рдЧрд▓рдд рд╡рд░реНрддрдиреА рдФрд░ рдЖрдпрд╛рддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИредeslint-plugin-jsx-a11y
- рд╡рд┐рдХрд▓рд╛рдВрдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП eslint-plugin-jsx-a11y
рддрддреНрд╡реЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдпрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡реЗрдм рдкрд╣реБрдБрдЪ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИредeslint-plugin-prettier
prettier - ESLint рдФрд░ Prettier рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдЬрдм рдкреНрд░реАрдЯреАрдпрд░ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдИрдПрд╕рдПрд▓рдЖрдИрдЯреА рдирд┐рдпрдореЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИредeslint-plugin-react
- рдЗрд╕рдореЗрдВ рдПрдХреНтАНрд▓рд┐рдВрдЯ рдХреЗ рдирд┐рдпрдо рдЕрднрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╣реИрдВ
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдКрдкрд░ рдХреЗ
package.json
рдореЗрдВред
Jest / Enzyme рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдЕрдм, рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдгред
eslint-config-jest-enzyme
- рдпрд╣ рдкреИрдХреЗрдЬ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрдм рдЖрдк jest-environment-enzyme
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдПрдВрдЬрд╛рдЗрдо рдЪрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, ESLint рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛редeslint-plugin-jest тАФ
рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП ESlint рдкреНрд▓рдЧрдЗрдиред
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдФрд░ рдкреИрдХреЗрдЬ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рд╕реНрд╡рдЪрд╛рд▓рди рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред рдпрд╣
husky
рдФрд░
lint-staged
ред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд╣рдо рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
app
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
.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', // Windows. 'arrow-parens': 'off', // prettier 'object-curly-newline': 'off', // prettier 'no-mixed-operators': 'off', // prettier 'arrow-body-style': 'off', // - ? 'function-paren-newline': 'off', // prettier 'no-plusplus': 'off', 'space-before-function-paren': 0, // prettier 'max-len': ['error', 100, 2, { ignoreUrls: true, }], // airbnb 'no-console': 'error', // airbnb 'no-alert': 'error', // airbnb 'no-param-reassign': 'off', // - ? "radix": "off", // parseInt, parseFloat radix . . 'react/require-default-props': 'off', // airbnb 'react/forbid-prop-types': 'off', // airbnb 'react/jsx-filename-extension': ['error', { extensions: ['.js'] }], // airbnb .jsx 'prefer-destructuring': 'off', 'react/no-find-dom-node': 'off', // 'react/no-did-mount-set-state': 'off', 'react/no-unused-prop-types': 'off', // '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"] } }], // htmlFor label 'prettier/prettier': ['error'], }, };
рдЕрдм
app
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
.eslintignore
рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:
/.git /.vscode node_modules
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐
.eslintrc.js
рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ
.eslintrc.js
, рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЕрд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
module.exports = { env:{}, extends: {}, plugin: {}, parser: {}, parserOptions: {}, rules: {}, };
рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рдореЛрдВ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдИ рдЧрдИ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдмреНрд▓реЙрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
env
- рдЖрдкрдХреЛ рдЙрди рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╣рд╛рдБ es6
, browser
рдФрд░ node
рдЧреБрдг true
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ true
ред es6
рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ ES6 рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде (рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИ, parserOptions
рдмреНрд▓реЙрдХ рдореЗрдВ, ecmaVersion
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ 6
)ред browser
рдкреИрд░рд╛рдореАрдЯрд░ Windows
рдЬреИрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЪрд░ рдХреЛ browser
рдХрд░рддрд╛ рд╣реИред node
рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрд╢реНрд╡рд┐рдХ Node.js рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдФрд░ рд╕реНрдХреЛрдк рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, global
ред рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ редextends
- рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИред Airbnb airbnb
рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ airbnb
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ airbnb
, рдЬреЛ рдХрд┐ jest
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ jest-enzyme
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВредplugins
- рдпрд╣рд╛рдБ рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдо рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдпрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, import
, jsx-a11y
, react
, jsx-a11y
, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд╛рдд рдХреА рдереАредparser
- ESLint рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрд╕реНрдкреНрд░реА parser
рдХрд╛ рдЙрдкрдпреЛрдЧ parser
рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдмреИрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдмреИрдмрд▓-рдИрдПрд╕рдПрд▓рдЖрдИрдПрдирдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредparserOptions
- рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдорд╛рдирдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ babel-eslint
рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдЧреБрдг рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред 6
рдХреЛ рд╕реЗрдЯ рдХреА рдЧрдИ ecmaVersion
рд╕рдВрдкрддреНрддрд┐ ecmaVersion
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ ES6 рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдПрдЧреАред рдЪреВрдВрдХрд┐ рд╣рдо EcmaScript
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, sourceType
рдЧреБрдг module
рд╕реЗрдЯ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЪреВрдВрдХрд┐ рд╣рдо рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ рдХрд┐ ecmaFeatures
рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ true
рдЬреЛ рдХрд┐ ecmaFeatures
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИредrules
- рдореБрдЭреЗ .eslintrc.js
рдХрд╛ рдпрд╣ рднрд╛рдЧ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ ESLint рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдпрд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рд╛ рдпрд╛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ rules
рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд╛рда рдореЗрдВ рдирд┐рдпрдореЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВред
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
.eslintignore
рдлрд╛рдЗрд▓ рдХреАред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЙрди рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ ESLint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреАрди рдлрд╝реЛрд▓реНрдбрд░ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:
/.git
- рдореБрдЭреЗ Git рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ESLint рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред/.vscode
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рд╡реАрдПрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣рд╛рдВ рд╕рдВрдкрд╛рджрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рднреА рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредnode-modules
- рдирд┐рд░реНрднрд░рддрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдПрдХ рд▓рд┐рдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдм рдЖрдЗрдП
package.json
рдореЗрдВ рдХреБрдЫ рдирдИ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ:
"lint": "eslint --debug src/" "lint:write": "eslint --debug src/ --fix"
рдпрджрд┐ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ,
yarn lint
рдпрд╛
npm run lint
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рд┐рдВрдЯрд░ рдХреЛ
src
рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреА рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рдИ рдЧрдИрдВред рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд┐рдВрдЯ рд▓рд┐рдкрд┐ рдЪрд▓ рд░рд╣реА рд╣реИрдпрджрд┐ рдЖрдк рджреВрд╕рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ (
yarn lint:write
) рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдИрдПрд╕рд▓рд┐рдВрдЯ рд╡рд╣реА рдЪреЗрдХ рдХрд░реЗрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореЛрдб рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдкрддрд╛ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдХреЛрдб рдХреЛ рд╕рдмрд╕реЗ рд╕рднреНрдп рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
рд╡реАрдПрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП ESLint рдПрдХреНрд╕рдЯреЗрдВрд╢рди
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Prettier рдФрд░ ESLint рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рдФрд░ рд▓рд╛рдЗрдирд┐рдВрдЧ рд╕рдВрдкрд╛рджрдХ рджреНрд╡рд╛рд░рд╛ рдлрд╛рдЗрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХрдорд┐рдЯрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдбрд┐рдВрдЧ рдХреА рд▓рд╛рдЗрдирд┐рдВрдЧ рдФрд░ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рдо, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реАрдПрд╕ рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ VS рдХреЛрдб рдХреЗ рд▓рд┐рдП
ESLint рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк VS рдХреЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреИрдирд▓ (
ctrl+shift+x
) рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ, рдЦреЛрдЬ рдлрд╝реАрд▓реНрдб рдореЗрдВ,
eslint
рджрд░реНрдЬ
eslint
ред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рд╣рдореЗрдВ рдХреНрдпрд╛ рд░реБрдЪрд┐рдХрд░ рд╣реИ рдЬрд┐рд╕рдХреА рдбреЗрд╡рд▓рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдбрд┐рд░реНрдХ рдмрд╛рдПрдорд░ рд╣реИред рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдкрд╛рджрдХ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред
рдЕрдм, рдкреНрд░реЛрдЬреЗрдХреНрдЯ (
app
) рдХреЗ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
.vscode
рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ (рдирд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбреЙрдЯ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ)ред рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ
settings.json
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
{ "editor.formatOnSave": false, "eslint.autoFixOnSave": true, }
рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
editor.formatOnSave
рдкреНрд░реЙрдкрд░реНрдЯреА false
рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ ESLint рдФрд░ Prettier рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредeslint.autoFixOnSave
рдЧреБрдг рдХреЛ true
рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ true
, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЧрдИ рдкреНрд▓рдЧ-рдЗрди рд╣рд░ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЧ рд▓рдЧ рдЬрд╛рдПред рдЪреВрдВрдХрд┐ ESLint рдФрд░ Prettier рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рд╕реНрд╡рд░реВрдкрдг рдФрд░ рдХреЛрдб рд▓рд╛рдЗрдирд┐рдВрдЧ рджреЛрдиреЛрдВ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдм, рдЬрдм
lint:write
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рд╛рдЗрдирд┐рдВрдЧ рдФрд░ рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред
рдЕрдкрдиреА рднрд╛рд╡рдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЛ 20,000 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдФрд░ рд╕реБрдзрд╛рд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХрд╛рдо рдореЗрдВ рд╢рд╛рдпрдж рдПрдХ рдорд╣реАрдирд╛ рд▓рдЧреЗрдЧрд╛ред рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рдХреА рдорджрдж рд╕реЗ, рдпрд╣ рд╕рдм рд▓рдЧрднрдЧ рддреАрд╕ рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм, рдЖрдкрдХреЛ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдкрд╛рджрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЬрд╛рдБрдЪ рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣рд╛рдБ рд╣рдо VS рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЯреАрдо рдореЗрдВ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдкрд╛рджрдХ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗред рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХрд░реНрдХрд╢
рдХрд░реНрдХрд╢ рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдЧрд┐рдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдорд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛрдб рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
рд╣рд╕реНрдХреА рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
yarn add
рдЙрд╕рдХреЗ рдмрд╛рдж,
package.json
рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
"husky": { "hooks": { "pre-commit": "YOUR_COMMAND_HERE", "pre-push": "YOUR_COMMAND_HERE" } },
рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ рдХрд┐
commit
рдпрд╛
push
рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдпрд╛ рд╕реНрд╡рд░реВрдкрдг рдХрд░рддрд╛ рд╣реИред
рд╣реБрд╕реНрдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг
рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдордВрдЪрди
рд▓рд┐рдВрдЯ-рд╕реНрдЯреЗрдЬреНрдб рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЗрдирд┐рдВрдЧ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рдПрдХреАрдХреГрдд рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирд┐рдВрдЧ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЕрд░реНрдерд╣реАрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд▓рд┐рдирд┐рдВрдЧ рдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
рд▓рд┐рдВрдЯ-рд╕реНрдЯреЗрдЬреНрдб рдЖрдкрдХреЛ рдЦреЛрдЬ рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЧрдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдордирдорд╛рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
Lint-staged рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
yarn add
рдлрд┐рд░,
package.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
"lint-staged": { "*.(js|jsx)": ["npm run lint:write", "git add"] },
рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
lint:write
рдХрдорд╛рдВрдб рдХреЛ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдлрд╛рдЗрд▓ рдХреЛ
git add
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рдпрд╣ рдХрдорд╛рдВрдб
.js
рдФрд░
.jsx
рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╕реНрдХреА рдФрд░ рд▓рд┐рдВрдЯ-рдордВрдЪрд┐рдд рд╕рд╛рдЭрд╛рдХрд░рдг
рдПрдХ рдПрдХреНрд╢рди рдЖрд░реЗрдЦ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рд╕реНрдЯрдо
lint-staged
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ,
lint:write
рдЪрд▓рд╛рддрд╛ рд╣реИ
lint:write
рд╕реНрдХреНрд░рд┐рдкреНрдЯ
lint:write
, рдЬреЛ рдХреЛрдб рдХреА рд▓рд╛рдЗрдирд┐рдВрдЧ рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
package.json
рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА рдереАред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ
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 add . $ git commit -m "some descriptive message here"
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ,
.eslintrc.js
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХреА
.eslintrc.js
рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред
рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░реАрдЯрд┐рдпрд░, ESLint, рд╣рд╕реНрдХреА рдФрд░ рд▓рд┐рдВрдЯ-рд╕реНрдЯреЗрдЬ рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЯреАрдо рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ VS рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрди рд╕рднреА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
.editorconfig
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
.Editorconfig рдлрд╝рд╛рдЗрд▓
рдЖрдкрдХреА рдЯреАрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рджрд╕реНрдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдкрд╛рджрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдПрдХ рд╕рдВрдкрд╛рджрдХ рдХреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдбреЗрдВрдЯ рдпрд╛ рд▓рд╛рдЗрди рдлреАрдб рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
editorconfig
ред .
, . , , WebStorm, AppCode, Atom, Eclipse, Emacs, BBEdit .
app
.editorconfig
:
# EditorConfig - : http://EditorConfig.org # EditorConfig root = true [*.md] trim_trailing_whitespace = false [*.js] trim_trailing_whitespace = true # Unix [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 insert_final_newline = true max_line_length = 100
, :
trim_trailing_whitespace = false
тАФ .md
- . .js
- false
.indent_style = space
тАФ .indent_size = 2
тАФ .end_of_line = lf
тАФ lf
. , , . .insert_final_newline = true
тАФ .max_line_length = 100
тАФ 100 .
рдкрд░рд┐рдгрд╛рдо
, , , . , , .
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! ? ?