рдПрдХ рдирдП рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдирд┐рдпрдо

рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп


рдмрд╣реБрдд рдмрд╛рд░ рдореИрдВ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рд╡рд┐рдХрд╛рд╕ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдЧрд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдЯрд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкреВрд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА рди рдХрд░реЗрдВ рдФрд░ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред


рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рдирд╛


Git


рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ Git рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЯреАрдо рдХрд╛ рдХреЛрдИ рднреА рд╕рджрд╕реНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрди рдХреЗ рдХреЛрдб рдХрд╛ рд▓реЗрдЦрдХ рдвреВрдВрдв рд╕рдХреЗрдЧрд╛ред


//    (  )   $ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com //            $ git config user.name "John Doe" $ git config user.email johndoe@example.com 

NodeJs рдФрд░ NVM


рдЕрдЧрд▓реА рдЪреАрдЬрд╝ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ NodeJs ред рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ NodeJs рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░ рджреЗрдЧрд╛ред


  1. MacOs рдкрд░, рдЖрдкрдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ .zshrc рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреА рд╣реЛрдЧреАред

 $ touch ~/.zshrc 

  1. рдПрдирд╡реАрдПрдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБред рдЯреАрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ ред

 $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash $ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash 

  1. NodeJs рдХрд╛ рдирд╡реАрдирддрдо LTS рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

 $ nvm install 'lts/*' 

  1. рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

 $ nvm use 'lts/*' $ nvm alias default 'lts/*' 

  1. MacOs рдкрд░, nvm рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ~ / .zshrc рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ ред рдЬрдм рдЖрдк рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ nnm рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ nvm рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдореИрдиреБрдЕрд▓ рдкрдврд╝реЗрдВред

 # place this after nvm initialization! autoload -U add-zsh-hook load-nvmrc() { local node_version="$(nvm version)" local nvmrc_path="$(nvm_find_nvmrc)" if [ -n "$nvmrc_path" ]; then local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")") if [ "$nvmrc_node_version" = "N/A" ]; then nvm install elif [ "$nvmrc_node_version" != "$node_version" ]; then nvm use fi elif [ "$node_version" != "$(nvm version default)" ]; then echo "Reverting to nvm default version" nvm use default fi } add-zsh-hook chpwd load-nvmrc load-nvmrc 

рд╕реАрдПрд▓рдЖрдИ рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг


  1. рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдПрд▓рдЖрдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

 $ npm install -g @angular/cli 

  1. рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рд░рд┐рдХреНрдд рдХреЛрдгреАрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ

 $ cd ~/Projects $ ng new --create-application false --new-project-root apps project-name 

рд╣рдордиреЗ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдореЛрдиреЛрд░реЗрдкреЛрдЬрд╝рд┐рдЯрд░реА рдХрд╛ рдЖрдзрд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред


  1. рдореЛрдиреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╣рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдмрдирд╛рдПрдВред

 $ cd project-name $ ng generate application --routing true --style scss website $ git add . $ git commit -m 'website application created' 

рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕ рдЪрд░рдг рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрдорд╛рдг


рдореИрдВ рдЖрдорддреМрд░ рдкрд░ libs рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ angular.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓рдиреА рд╣реЛрдЧреА:


 "newProjectRoot": "apps", 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрди рдкрд░:


 "newProjectRoot": "libs", 

рдФрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


 $ ng generate library @group-name/lib-name 

рд╣рдордиреЗ рд╕рдореВрд╣-рдирд╛рдо рдХреЛ рдбреЛрдореЗрди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдореВрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк npm рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕рдореВрд╣-рдирд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧрдарди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╕реНрдерд╛рди рдХреА рддрд░рд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 "@angular/common" "@angular/compiler" "@angular/core" "@angular/forms" 

рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдПрдирдкреАрдПрдо рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рдмрд╕ рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред


рдФрд░ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ angular.json рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ: "newProjectRoot": "apps"


рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдиреНрдпрд╛рд╕


NodeJs рд╕рдВрд╕реНрдХрд░рдг


рдЗрд╕рдореЗрдВ lts/* рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ .nvmrc рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдЖрдк рдиреЛрдб рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 12.13.1 ред рдпрджрд┐ рдЖрдкрдиреЗ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрдиреЗ рдЖрдк рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк $ nvm use рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рднреА рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 $ touch .nvmrc $ echo "lts/*" > .nvmrc 

рдЕрд╢рдХреНрдд рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдЬрд╛рдБрдЪ


tsconfig.json рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдЬрд╛рдБрдЪ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tsconfig.json рд▓рд┐рдП рдирд┐рдореНрди рдирд┐рдпрдо рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдЕрд╢рдХреНрдд рдЪрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред


 "compilerOptions": { "strictNullChecks": true, } 

рдпрд╛ рдмреЗрд╣рддрд░ , рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдХрдареЛрд░ рдЬрд╛рдВрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╕рднреА рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:


 /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ "noUnusedLocals": true, /* Report errors on unused locals. */ "noUnusedParameters": true, /* Report errors on unused parameters. */ "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдЯреАрдПрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдХреЛрдгреАрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЖрдкрдХреЛ tsconfig.json рдореЗрдВ 'fullTemplateTypeCheck' рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 { "compilerOptions": { ... }, "angularCompilerOptions": { "fullTemplateTypeCheck": true ... } } 

рдЗрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


 $ npm run build 

рд╕рдЦреНрдд рдирд┐рдпрдо рдирд┐рдпрдо


рд╕рдмрд╕реЗ рдХрдбрд╝реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╕рднреА tslint рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ, рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП tslint.json рдореЗрдВ рдмрджрд▓реЗрдВ


 "extends": "tslint:recommended", 

рдкрд░


 "extends": "tslint:all", 

рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдЬреЛрдбрд╝реЗрдВ


 "no-implicit-dependencies": false, "no-submodule-imports": false, "completed-docs": false, "prefer-function-over-method": false, "file-name-casing": [ true, "kebab-case" ], "no-object-literal-type-assertion": [ true, { "allow-arguments": true } ], "no-floating-promises": false, "promise-function-async": false, "no-unsafe-any": false, "no-any": false, "comment-format": [ true, "check-space" ], "newline-per-chained-call": false, "typedef": [ true, "call-signature", "arrow-call-signature", "parameter", "arrow-parameter", "property-declaration", "object-destructuring", "array-destructuring" ] 

рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЕрдкрдиреЗ IDE рдореЗрдВ tslint рд╕рдорд░реНрдерди рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред


рдЗрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд┐рдВрдЯрд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВред


 $ npm run lint 

рд╕реНрдЯрд╛рдЗрд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдЯ рдПрд╕рд╕реАрдПрд╕рдПрд╕


рдЕрдкрдиреЗ sssss рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рдЗрд▓рд▓рд┐рдВрдЯ рдЬреЛрдбрд╝реЗрдВ


 $ npm install stylelint stylelint-config-standard --save-dev $ touch .stylelintrc 

рдФрд░ .stylelintrc рдкрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


 { "extends": "stylelint-config-standard", "rules": {} } 

Package.json рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓рд▓рд┐рдВрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ


 "scripts": { "lint-all-scss": "stylelint \"**/*.scss\"", "lint-all-scss-fix": "npm run lint-all-scss -- --fix" } 

рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЕрдкрдиреЗ IDE рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓рд▓рд┐рдВрдЯ рд╕рдорд░реНрдерди рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ


 $ npm run lint-all-scss-fix 

рдЦреВрдмрд╕реВрд░рдд


Prettier рдХрд╛ рдЙрдкрдпреЛрдЧ code рдХреЛ format рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, Prettier рдЖрдкрдХреЛ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдмрд╣реБрдд рдХреБрдЫ рд╣реИред


 $ npm install --save-dev --save-exact prettier 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП .prettierrc рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ


 { "printWidth": 120, "tabWidth": 2, "arrowParens": "always", "bracketSpacing": true, "endOfLine": "lf", "semi": true, "singleQuote": true, "quoteProps": "consistent", "trailingComma": "all" } 

рдФрд░ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдлрд╛рдЗрд▓


 karma.conf.js protractor.conf.js ng-package.json package.json tsconfig.lib.json tsconfig.app.json tsconfig.spec.json tslint.json tsconfig.json browserslist .gitkeep favicon.ico 

Package.json рдореЗрдВ рдкреНрд░реАрдЯрд┐рдпрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ


 "scripts": { "prettier": "prettier --write \"{apps,libs}/**/*\"", "prettier:check": "prettier --check \"{apps,libs}/**/*\"" }, 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрдЯрд┐рдпрд░ рдЪрд▓рд╛рдПрдВ


 $ npm run prettier 

рд╣реБрдХ


рд▓рд┐рдВрдЯрд░, рдлреЙрд░реНрдореЗрдЯрд░ рдпрд╛ рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЧрд┐рдЯ рд╣реБрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


  • рдХрд░реНрдХрд╢ - рд╣реБрдХ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
  • рд╕реБрдВрджрд░-рддреНрд╡рд░рд┐рдд - рдХреЗрд╡рд▓ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдЯрд┐рдпрд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ

 $ npm i husky pretty-quick -D 

рдЕрдЧрд▓рд╛ рдХрджрдо рд╣рдорд╛рд░реЗ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛ рд╣реИред рдореИрдВ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╣рдо 3 рд╣реБрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ:


  1. рдкреНрд░реА-рдХрдорд┐рдЯ - рдПрдХ рд╣реБрдХ рдЬрд┐рд╕реЗ рдХрдорд┐рдЯ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╣реБрдб рдореЗрдВ, рд╣рдо рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдкреНрд░реЗрдЯрд┐рдпрд░ рдХрд░реЗрдВрдЧреЗред
  2. рдкреНрд░рддрд┐рдмрджреНрдз-рд╕рдВрджреЗрд╢ - рдПрдХ рд╣реБрдХ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкреНрд░рддрд┐рдмрджреНрдз рдкрд╛рда рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрджреНрдз рдкрд╛рда рдореЗрдВ рдПрдХ рд╢рд╛рдЦрд╛ рдХрд╛ рдирд╛рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
  3. рдкреНрд░реА-рдкреБрд╢ - рдПрдХ рд╣реБрдХ рдЬрд┐рд╕реЗ рдЧрд┐рдЯ рдкреБрд╢ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

Package.json рдореЗрдВ рдХрд░реНрдХрд╢ рд╡рд┐рдиреНрдпрд╛рд╕:


 "husky": { "hooks": { "pre-commit": "pretty-quick --staged", "commit-msg": "node ./tools/commit-msg.js", "pre-push": "./tools/pre-push.sh" } }, 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ ./tools/commit-msg.js


 const fs = require('fs'); const { execSync } = require('child_process'); const message = fs.readFileSync(process.env.HUSKY_GIT_PARAMS, 'utf8').trim(); const currentBranch = getCurrentBranch(); fs.writeFileSync(process.env.HUSKY_GIT_PARAMS, `${currentBranch}: ${message}`); process.exit(0); function getCurrentBranch() { const branches = execSync('git branch', { encoding: 'utf8' }); return branches .split('\n') .find((b) => b.charAt(0) === '*') .trim() .substring(2); } 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ ./tools/pre-push.sh


 #!/usr/bin/env bash npm run lint-all-scss || exit npm run lint || exit 

рдЖрдк рдкреНрд░реА-рдкреБрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯреЗрд╕реНрдЯ рд░рди рдФрд░ e2e рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЬрд▓реНрдж рдЖ рд░рд╣рд╛ рд╣реИ ...


рдпрд╣ рд▓реЗрдЦ рдПрдХ рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдореЗрд░реА рдпреЛрдЬрдирд╛ рд╣реИ:


  • рдЯреНрд░реИрд╡рд┐рд╕ рдФрд░ рдбреЙрдХрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
  • рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди
  • рдЕрдиреБрд╡рд╛рдж
  • рдкрд░реАрдХреНрд╖рдг
  • рд░рд╛рдЬреНрдп рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди
  • Nrwl.Nx рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА

рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ, рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВред рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред




рдордзреНрдпрдо , рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдпрд╛ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рднреА рд╣рдорд╛рд░реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред

Source: https://habr.com/ru/post/hi481444/


All Articles