рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХрд╣рд╛рдиреА рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрди рддрдХрдиреАрдХреЛрдВ рдореЗрдВ Fastify рдФрд░ Preact рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡рд╣ htm рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ Preact рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ DOM рддрддреНрд╡реЛрдВ рдХреЛ JSX рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реБрдП рд╕рд╣рдЬ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдмрд╛рдмреЗрд▓ рдХреА рддрд░рд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд▓реЗрдЦрдХ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдРрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рд╢реБрд░реБрдЖрдд
рдореИрдВрдиреЗ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ рддрдХрдиреАрдХ рдХреЗ рдЙрдХреНрдд рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рдЬрдм рдореБрдЭреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХреБрдЫ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдореЗрд░рд╛ рдкреНрд░рдпреЛрдЧ рдмреЗрд╣рдж рд╕рдлрд▓ рд░рд╣рд╛ред рдореИрдВ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рд╡реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЫрд╛рдкреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЙрд╕реА рд╕рдордп, рд╡реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рдереЗ, рднрд▓реЗ рд╣реА Node.js рдФрд░ NPM рдЙрдирдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдереЗред
рдпрд╣ рд╕рдм рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Fastify рдФрд░ Preact рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдореИрдВ рддреБрд░рдВрдд рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Fastify рдФрд░ Preact рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдЗрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╕реНрддреБрддрдГ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдХреБрдЫ рдХрджрдо рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
git clone https://github.com/lmammino/fastify-preact-htm-boilerplate.git my-new-project cd my-new-project rm -rf .git npm install
рдмреЗрд╢рдХ, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ,
my-new-project
, рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдоред
рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
src/ui
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдпрд╣рд╛рдВ Preact рдФрд░ htm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)редsrc/server
рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ (Fastify рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЙрдкрдпреБрдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдХреЗ, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
npm start
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ
localhost:3000
рдкрддреЗ рдкрд░ рдЬрд╛рдХрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдПрдХ рдмрд╛рддред рдЕрдЧрд░ рдЖрдкрдХреЛ рдореЗрд░рд╛ рд╡рд┐рдХрд╛рд╕ рдкрд╕рдВрдж рдЖрдпрд╛, рддреЛ рдореИрдВ
GitHub рдкрд░ рд╕реНрдЯрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рдЕрдм рдЖрдЗрдП рдпрд╣рд╛рдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВред
Fastify
Fastify Node.js. рдХреЗ рд▓рд┐рдП рдПрдХ рддреЗрдЬрд╝ рдФрд░ рдХрд┐рдлрд╛рдпрддреА рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рджреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдереАред рдЕрдм рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдЯреАрдо рдореЗрдВ 10 рд▓реЛрдЧ рд╣реИрдВ, 130 рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧрд┐рдЯрд╣рдм рдкрд░ рд▓рдЧрднрдЧ 10,000 рд╕рд┐рддрд╛рд░реЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ред
Fastify рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рд╣рд╛рдкреА рдЬреИрд╕реЗ Node.js рдЪреМрдЦрдЯреЗ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛, рдЬреЛ рд▓рдЧрднрдЧ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдкрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдорджрдж рд╕реЗ рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣, рд╡реИрд╕реЗ, рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ Fastify рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдпрджрд┐ рдЖрдк Fastify рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ Fastify рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реВрдВред рдореИрдВ рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХрд╛ рд╕рджрд╕реНрдп рд╣реВрдВ рдФрд░ рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВред
Preact
Preact рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ React рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕рдлрд▓ рд░рд╣реА, рдЕрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдПрдХ рдкреВрд░реА рдЯреАрдо рдЗрд╕рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИ, GitHub рдкрд░ рдЙрд╕рдиреЗ 20,000 рд╕реЗ рдЕрдзрд┐рдХ рд╕рд┐рддрд╛рд░реЗ рдмрдирд╛рдПред
Preact рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдкрд░рдд рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдмреЗрд▓ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмреИрдмреЗрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк Preact рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
htm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╕рдордп рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд┐рдХреЗрд╢рди рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо htm рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬрд▓реНрдж рд╣реА рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди
рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдпрд╣ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдкреЗрдЬ рдПрдкреНрд▓реАрдХреЗрд╢рди (рдПрд╕рдкреАрдП) рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реАрд░реЗрдХреНрдЯ рдФрд░ htm рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ Fastify рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рдлрд╝реЗрд╡рд┐рдХреЙрди рдЖрдЗрдХрди рд╣реИред рд╕рдЪ рд╣реИ, рд╡рд╣ рд╡рд╣рд╛рдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЛ рддреЛрдбрд╝рдХрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
рдлрд╝реЗрд╡рд┐рдХреЙрдирдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛
рдЪрд▓реЛ рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
mkdir server-time cd server-time
рдЕрдм NPM рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ Fastify рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm init -y npm i --save fastify@next fastify-static@next fastify-cli
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛
@next
рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ
@next
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рд╕реНрдЯрд╛рдЗрдЬрд╝ 2 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд░рд┐рд▓реАрдЬ рдЙрдореНрдореАрджрд╡рд╛рд░ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬрд▓реНрдж рдореБрдЦреНрдп рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдмрди рдЬрд╛рдПрдЧрд╛ред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк
fastify-cli
рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди
fastify-cli
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Fastify рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
npx fastify-cli generate server-time
рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдпрд╣ рдЯреАрдо Fastify 1.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬрд▓реНрдж, Fastify 2 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЯреВрд▓ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдЗрдП рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
fastify
рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИредfastify-static
рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ Fastify рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдереИрддрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредfastify-cli
рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЯреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ Fastify рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо Fastify рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рддреЛ рдЪрд▓реЛ
src/server/server.js
рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛрдб
src/server/server.js
:
const path = require('path') module.exports = async function(fastify, opts) { // `src/ui` fastify.register(require('fastify-static'), { root: path.join(__dirname, '..', 'ui'), }) // API fastify.get('/api/time', async (request, reply) => { return { time: new Date().toISOString() } }) }
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЦреБрдж рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рд╣реИрдВ рдЬреЛ рдмрд╛рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ Fastify рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЖрдк рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ
async
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Fastify рджреЛрдиреЛрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╢реИрд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЙрд▓рдмреИрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдбреЗрд╡рд▓рдкрд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдореЙрдбреНрдпреВрд▓ (Fastify jargon рдореЗрдВ рдЗрд╕реЗ "рдкреНрд▓рдЧрдЗрди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ Fastify рдЗрдВрд╕реНрдЯреЗрдВрд╕ (
fastify
) рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ (
fastify
)
opts
ред рдореЙрдбреНрдпреВрд▓ рдШреЛрд╖рдгрд╛ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐
fastify-static
рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЛрдВ рдЬреИрд╕реЗ рдХрд┐
fastify.get
рдФрд░
fastify.post
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдПрдХ рдмреНрд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╕рд░реНрд╡рд░ рдмрдирд╛рдпрд╛ рд╣реИ, рдФрд░ рдПрдХ рдордВрдЪ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ
/blog
рдФрд░
/forum
рдЬреИрд╕реЗ рд░рд╛рд╕реНрддреЛрдВ рдкрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЙрдХреЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ) рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдЙрдк-рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд░реВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛
fastify-cli
ред
рд╕рд░реНрд╡рд░ рдХреЛ
fastify
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди
fastify
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ:
node_modules/.bin/fastify start --log-level info src/server/server.js
рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдЕрдкрдиреЗ
package.json
рдХреЗ
scripts
рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
package.json
рдлрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓:
{ "scripts": { "start": "fastify start --log-level info src/server/server.js" } }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдЕрдиреНрдпрдерд╛,
fastify-static
рдПрд░рд░
fastify-static
рджреЗрдЧрд╛ред рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
mkdir src/ui
рдЕрдм рд╣рдо
npm start
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
npm start
рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
localhost:3000/api/time
ред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
{ "time": "2019-02-17T19:32:03.354Z" }
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк Fastify рдХреА рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ JSON рдХреНрд░рдорд╛рдВрдХрди, рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рд░реНрдЧ рдПрдХ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдЕрдм рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдкрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЪрд▓реЛ рдПрдХ рджреГрд╢реНрдп рд╣реИред
рд▓рд▓рд╛рдЯ рд╕реЗрдЯрдЕрдк
рдлреНрд░рдВрдЯреЗрдВрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рдХреЛрдб
src/ui
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред рдЗрд╕рдореЗрдВ 5 рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА:
app.js
- app.js
рдЖрд╡реЗрджрди рдХреЛрдбредbootstrap.min.css
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CSS рдХреЛрдб (рдЗрд╕реЗ рд╕реАрдзреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)редfavicon.ico
- рдлрд╝реЗрд╡рд┐рдХреЙрди рдлрд╝рд╛рдЗрд▓ред рдпрджрд┐ рдЖрдк рдПрдХ рдЧрдВрднреАрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЕрдЪреНрдЫреА рдлрд╝реЗрд╡рд┐рдХреЙрди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗредindex.html
рд╣рдорд╛рд░реЗ рдПрдХ-рдкреГрд╖реНрда рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдореБрдЦреНрдп HTML рдлрд╝рд╛рдЗрд▓ рд╣реИредpreacthtm.js
- preacthtm.js
рдФрд░ htm рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдХреЛрдбред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ, рдЬреЛ рд╢реИрд▓реА, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдлрд╝реЗрд╡рд┐рдХреЙрди рдЖрдЗрдХрди рд╣реИрдВ:
curl "https://unpkg.com/htm@2.0.0/preact/standalone.js" > src/ui/preacthtm.js curl "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" > src/ui/bootstrap.min.css curl "https://github.com/lmammino/fastify-preact-htm-boilerplate/blob/master/src/ui/favicon.ico?raw=true" > src/ui/favicon.ico
рдЕрдм
src/ui/index.html
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <!-- Bootstrap CSS --> <link rel="stylesheet" href="/bootstrap.min.css" /> <title>My awesome server time</title> </head> <body> <div id="app"></div> <!-- JavaScript --> <script src="/preacthtm.js"></script> <script src="/app.js"></script> </body> </html>
рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп HTML рдкреГрд╖реНрда рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ (CSS рдФрд░ JS) рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
app
рд╕рд╛рде рдПрдХ рдЦрд╛рд▓реА
<div>
рддрддреНрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред
рдЕрдм рдЖрд╡реЗрджрди рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬреЛ
src/ui/app.js
рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
/* htmPreact */ const { html, Component, render } = htmPreact class App extends Component { componentDidMount() { this.setState({ loading: true, time: null }) fetch('/api/time') .then(response => response.json()) .then(data => this.setState({ loading: false, time: data.time })) } render(props, state) { return html` <div class="container mt-5"> <div class="row justify-content-center"> <div class="col"> <h1>Hello from your new App</h1> <div> ${state.loading && html` <p>Loading time from server...</p> `} ${state.time && html` <p>Time from server: <i><font color="#999999">${state.time}</font></i> </p> `} </div> <hr /> <div> Have fun changing the code from this boilerplate: <ul> <li>UI code available at <code>/src/ui</code></li> <li>Server-side code available at <code>/src/server</code></li> </ul> </div> </div> </div> </div> ` } } render( html` <${App} /> `, document.getElementById('app') )
рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ, рдЬрд┐рд╕реЗ
App
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ 2 рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
loading
рдХрд░рдирд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдЪрд░ рд╣реИ рдЬреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВредtime
- рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╡реАрдирддрдо рд╕рдордп рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
рдпрджрд┐ рдЖрдк React рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред
Preact рдФрд░ htm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ рдШрдЯрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд
Component
рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдПрдХ рдШрдЯрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреАрд╡рди-рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреИрд╕реЗ
componentDidMount()
, рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд
render()
рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА рдШрдЯрдХ рдкреГрд╖реНрда (
componentDidMount()
рд╡рд┐рдзрд┐) рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рд╕реНрдерд┐рддрд┐
loading
рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░
fetch
рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо
time
рд░рд╛рдЬреНрдп рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
loading
рд╕рдВрдкрддреНрддрд┐ рдХреЛ
false
рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
render()
рд╡рд┐рдзрд┐ рдХреЛ рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рдЬрдм рдирдИ рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рдкрд╛рд╕ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо htm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП DOM рдШрдЯрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
Htm рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреИрдЧ -
html
рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЛрдо рдиреЛрдбреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рднреАрддрд░, рдЧрддрд┐рд╢реАрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рднрд░реА рд╣реБрдИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ HTML рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣
htmPreact
рдЧреНрд▓реЛрдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ
render()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдлреНрд░рдВрдЯ-рдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
localhost:3000
рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
localhost:3000
рдФрд░ рдЬреЛ рд╣рдордиреЗ рдЕрднреА рдмрдирд╛рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рдЖрдк рдЬреЛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдХрд┐рд╕реА рдФрд░ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рд▓рд┐рдП рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрдХ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдВрдЯреЗрдирд░реАрдХрд░рдг
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рджреВрд╕рд░реЛрдВ рдХреЛ рдЕрдкрдиреА рдирдИ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдбреЙрдХрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬреЛ рдХреЛрдИ рднреА рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдШрд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╕реЛрдЪрдиреЗ рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ Node.js рдФрд░ NPM рдХрд╛ рдЙрдкрдпреБрдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЙрд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рдХрдорд╛рдВрдбреЛрдВ рдХрд╛ рд╕рд╣реА рдХреНрд░рдо рджрд░реНрдЬ рдХрд░рдХреЗ , рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВред
Dockerfile
рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓
Dockerfile
рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
FROM node:11-alpine WORKDIR /app COPY . /app RUN npm install --production EXPOSE 3000 CMD ["npm", "start"]
рдпрд╣рд╛рдБ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
- рдЫрд╡рд┐ Node.js 11 рдЫрд╡рд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рд╡рд░реНрддрдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрдВрдЯреЗрдирд░ рдХреЗ
/app
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд
npm install
рд▓рд┐рдП npm install
рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВред --production
рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред рдпрд╣ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ рдЕрдЧрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рд╡рд┐рдХрд╛рд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред - рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЦреБрд▓реЗ рдЫрд┐рджреНрд░ 3000 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдкрд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рд░реНрд╡рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
- рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдХрдорд╛рдВрдб,
npm start
рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред
рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
docker build -t server-time .
рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ рддреИрдпрд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
docker run -it -p 3000:3000 server-time
-p
рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдкреЛрд░реНрдЯ 3000 рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкреЛрд░реНрдЯ 3000 рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ
localhost:3000
рдкрд░ рдХрдВрдЯреЗрдирд░реАрдХреГрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЕрдм рдЖрдк рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдбреЙрдХрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдбреЙрдХрдЯрд░ рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рджреЛ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдлрд╛рд╕реНрдЯрд╛рдЗрдЬрд╝ рдФрд░ рдкреНрд░реАрд░реЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдХрд┐ рдбреЙрдХрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрдХрд░рдг рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬрдм рдЖрдк "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ" рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЕрдЧреНрд░-рднрд╛рдЧ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди: рдЕрдиреБрдХреВрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ (рдмрдВрдбрд▓реЛрдВ) рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╕рдВрднрд╡рддрдГ рд╡реЗрдмрдкреИрдХ, рдмреИрдмрд▓ рдпрд╛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рдордиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░реВрдЯрд┐рдВрдЧред
- рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ
- рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд╕рд╛рдзрдиред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЕрднреА рддрдХ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореИрдВ рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ рдЬреЛ рджреЗрдЦрд╛ рдЙрд╕реЗ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдм рдХреЛ рдЖрдзрд╛рд░ рдорд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдкрд╡рд╛рд╕ рдФрд░ рдЙрдкрджреЗрд╢ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдЙрддреНрдкрд╛рджрди рд░рд┐рд▓реАрдЬред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдЖрдк рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ?
