{"id":333845,"date":"2022-05-31T09:00:24","date_gmt":"2022-05-31T09:00:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=333845"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=333845","title":{"rendered":"<span>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u0438\u043d\u043e\u0433\u0434\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0437\u0434\u0440\u0430\u0432\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f, \u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432\/\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430, \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0442 \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442. \u042d\u0442\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0440\u043e\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u0435\u0439\u0441\u0435 \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0435\u0435\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439, UI \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0442\u0430\u0431\u043b\u0438\u0446, \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0430\u043d\u0434\u043b\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u043c\u0435\u0442\u044c \u0432 \u0440\u0443\u043a\u0430\u0432\u0435 \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0438\u0447\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0442\u0438\u043c\u043b\u0438\u0434\u0430\u043c \u0438 \u0442\u0435\u0445\u043b\u0438\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffc\/913\/123\/ffc91312395fbd4e8c1fa9db7e5976d8.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ffc\/913\/123\/ffc91312395fbd4e8c1fa9db7e5976d8.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0442\u0430\u0442\u0438\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c create-react-app \u0438\u043b\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 create-react-app \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442?\u00a0<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, create-react-app \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c webpack \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d depend-bot, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 CRA. \u0422\u0430\u043a\u0436\u0435 \u043c\u0438\u043d\u043e\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u044f\u0432\u043d\u043e \u043d\u0435 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u044e\u0448\u0435\u043a \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0436\u0435\u043a\u0442\u0430 webpack \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0430 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u043d\u0443\u043b\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 CRA \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u0438\u0431\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 webpack 5. \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0433\u0438\u0431\u043a\u0430\u044f \u0438 \u043c\u043e\u0449\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p><strong>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0430 webpack:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0418\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c node_env (development, production, test \u0438 \u0442.\u0434.) \u0438 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 bundle \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 node_env.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 aliases \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c typescript, eslint, prettier.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u0430\u0439\u043b\u0435\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e import react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 git-flow \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0435\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0432\u044b\u0431\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u2014 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0441 \u0442\u0435\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react, react-dom<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^17.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0434\u0435\u0441\u044c \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-router-dom<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u043a\u0438 \u0432 \u044d\u043f\u0438\u043a\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <strong>connected-react-router<\/strong> ^6.<em>*.*<\/em><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>redux<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^4.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>redux-observable<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^1.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>rxjs<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^6.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f redux-observable \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>immer<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">8.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>reselect<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^4.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438 store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>styled-components<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e css<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-virtualized<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^9.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-intl<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^3.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>@loadable\/component<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-final-form<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^6.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u043e\u0440\u043c \u0432\u0432\u043e\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b webpack<\/h4>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 webpack \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442:<\/p>\n<pre><code class=\"javascript\">\/\/ Modules const path = require(\"path\"); \u200b \/\/ Constants from path const APP_DIR = process.cwd(); const ASSETS_FOLDER = \"assets\"; const SOURCE_FOLDER = \"src\"; const PUBLIC = \"public\"; const BUILD_FOLDER = \"build\"; const CACHE_FOLDER = \".cache\"; const PREFIX_PATH = \"@\" \/\/ \u042d\u0442\u043e \u043d\u0430\u0448 alias \u0434\u043b\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 src const PATH_TO_PROJECT = path.resolve(APP_DIR, SOURCE_FOLDER); const PATH_TO_PUBLIC = path.resolve(APP_DIR, PUBLIC); const PATH_TO_ASSETS = path.resolve(APP_DIR, ASSETS_FOLDER); const PATH_TO_BUILD = path.resolve(APP_DIR, BUILD_FOLDER); const PATH_TO_CACHE_FOLDER = path.resolve(APP_DIR, CACHE_FOLDER); \u200b \/\/ Mode const DEVELOPMENT = \"development\"; const PRODUCTION = \"production\"; const { NODE_ENV } = process.env; const ENV_LIST = [DEVELOPMENT, PRODUCTION]; const VALID_NODE_ENV = NODE_ENV &amp;&amp; ENV_LIST.includes(NODE_ENV)  ? NODE_ENV : PRODUCTION; \/\/ \u0415\u0441\u043b\u0438 node_env \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0432\u043e\u0438\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c. const IS_DEVELOPMENT = NODE_ENV === DEVELOPMENT; const IS_PRODUCTION = NODE_ENV === PRODUCTION; const IS_BUNDLE_ANALYZE = process.env.IS_BUNDLE_ANALYZE || false;   \/\/ \u042d\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u0430\u043d\u0434\u043b\u0430, \u043e \u043d\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u200b \/\/ OS const OS = {  IS_WINDOWS: process.platform === \"win32\", };<\/code><\/pre>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 OS. \u041e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 eslint \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043a \u043d\u0435\u043c\u0443 \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f.<\/p>\n<h4>\u041a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0432 package.json \u0441\u0432\u043e\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 env_variable.<\/p>\n<pre><code class=\"javascript\">\"scripts\": {     \"start\": \"cross-env NODE_ENV=development webpack serve --config .\/webpack.config.js\",     \"build\": \"cross-env NODE_ENV=production webpack --config .\/webpack.config.js\",     \"analyze-dev\": \"cross-env NODE_ENV=development cross-env webpack serve --config .\/webpack.config.js\",   }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0441\u0440\u0435\u0434 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0438\u043c\u0435\u043d\u0438:<\/p>\n<p><code>.env.${node_env}<\/code><\/p>\n<p>\u0433\u0434\u0435 node_env \u043b\u044e\u0431\u0430\u044f \u0441\u0440\u0435\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d, \u0442\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0435 \u043d\u0435\u0439\u043c\u0438\u043d\u0433, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p><code>.env.template.${node_env}<\/code><\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 .gitignore, \u0438 \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/p>\n<pre><code class=\"javascript\">NODE_ENV = development HOST = localhost PORT = 3000 VERSION = 1.0.0 CLIENT_ID = xxxx-xxxx-xxxx-xxxx<\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HOST \u0438 PORT \u2014 \u0434\u043b\u044f \u0441\u0440\u0435\u0434\u044b develop, \u0447\u0442\u043e\u0431\u044b webpack \u0447\u0435\u0442\u043a\u043e \u0437\u043d\u0430\u043b, \u0433\u0434\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0432\u043e\u0439 webpack-dev-server, \u0430 \u0442\u0430\u043a\u0436\u0435 API, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>Webpack \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u0443\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041d\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043d\u0435 \u0431\u043e\u043b\u044c\u043d\u043e. =)<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 webpack \u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0432 \u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438:<\/p>\n<ol>\n<li>\n<p><strong>loaders <\/strong>\u2014 \u043d\u0430\u0448\u0438 loaders (babel, sass, less \u0438 \u0442.\u0434.) \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 loader:<\/p>\n<pre><code class=\"javascript\">const getBabelLoader = () => {   const loader = {     loader: \"babel-loader\",     options: {       configFile: path.join(APP_DIR, \".babelrc\"),    },  }; \u200b   return loader; }; \u200b module.exports = { getBabelLoader }; <\/code><\/pre>\n<p>2. <strong>optimization <\/strong>\u2014 \u0441\u044e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, terser \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 webpack, \u043a\u0430\u043a \u0441\u0436\u0438\u043c\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<pre><code class=\"javascript\">const TerserPlugin = require(\"terser-webpack-plugin\"); \u200b const terser = () => {   const plugin = new TerserPlugin({     terserOptions: {       parse: {         ecma: 10,      },       compress: {         ecma: 5,         warnings: false,         comparisons: false,         booleans: true,         collapse_vars: false,         if_return: true,         sequences: true,         unused: true,         conditionals: true,         dead_code: true,         evaluate: true      },       mangle: {         safari10: true,      },       output: {         beautify: false,         ecma: 5,         comments: false,         ascii_only: true,      },    },     parallel: true,  }); \u200b   return plugin; }; \u200b module.exports = { terser };<\/code><\/pre>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>ecma<\/strong> \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 JavaScript, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 5 (ES5)<\/p>\n<\/li>\n<li>\n<p><strong>booleans<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439: !!a ? b : c \u2192 a ? b : c<\/p>\n<\/li>\n<li>\n<p><strong>comparisons<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439: a = !b &amp;&amp; !c &amp;&amp; !d &amp;&amp; !e \u2192 a=!(b||c||d||e)<\/p>\n<\/li>\n<li>\n<p><strong>collapse_vars<\/strong> \u2014 \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 var \u0438 const, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p><strong>if_return<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0437\u0430 \u0441\u0447\u0435\u0442 return<\/p>\n<\/li>\n<li>\n<p><strong>sequences<\/strong> \u2014 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e<\/p>\n<\/li>\n<li>\n<p><strong>unused<\/strong> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 (\u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434)<\/p>\n<\/li>\n<li>\n<p><strong>conditionals<\/strong> \u2014 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c<\/p>\n<\/li>\n<li>\n<p><strong>dead_code<\/strong> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p><strong>evaluate<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/terser.org\/docs\/api-reference#compress-options\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<ol start=\"3\">\n<li>\n<p><strong>optimization-presets <\/strong>\u2014 \u0437\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u0440\u0435\u0441\u0435\u0442\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 2.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">const getOptimizationMainPreset = () => {   const optimization = {     minimize: IS_PRODUCTION,     minimizer: [       terser(),       cssAssets(),    ],     splitChunks: getSplitChunks(),     runtimeChunk: 'single'  }; \u200b   return optimization; }; \u200b module.exports = { getOptimizationMainPreset };<\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p><strong>plugins <\/strong>\u2014 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f webpack.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">'use-strict'; \/\/ Modules const LoadablePlugin = require('@loadable\/webpack-plugin'); \/\/ Constants const {   IS_PRODUCTION, } = require('..\/utils\/constants'); \u200b const getLoadableWebpackPlugin = () => { \u200b   const plugin = new LoadablePlugin({     filename: 'stats-loadable.json',     writeToDisk: IS_PRODUCTION,  }); \u200b   return plugin; }; \u200b module.exports = { getLoadableWebpackPlugin };<\/code><\/pre>\n<ol start=\"5\">\n<li>\n<p><strong>plugins-loader <\/strong>\u2014 \u043b\u043e\u0430\u0434\u0435\u0440\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 4.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">const getMainPluginsLoader = () => {   return [     getProgressBarPlugin(),     getRefreshPlugin(),     IS_PRODUCTION &amp;&amp; getCleanWebpackPlugin(),     getForkTsCheckerWebpackPlugin(),     getDefinePlugin(),  ].filter(Boolean); }; \u200b module.exports = { getMainPluginsLoader };<\/code><\/pre>\n<ol start=\"6\">\n<li>\n<p><strong>presets <\/strong>\u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0441\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">\/\/ Loaders const { getStyleLoader } = require(\"..\/loaders\/style-loader\"); const { getCssLoader } = require(\"..\/loaders\/css-loader\"); const { getPostCssLoader } = require(\"..\/loaders\/postcss-loader\"); \u200b const getCssPreset = () => {   const preset = {     test: \/\\.css$\/i,     use: [       getStyleLoader(),       getCssLoader(),       getPostCssLoader(),    ],  }; \u200b   return preset; }; \u200b module.exports = { getCssPreset}<\/code><\/pre>\n<ol start=\"7\">\n<li>\n<p><strong>utils <\/strong>\u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 \u0434\u043b\u044f webpack.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u043c\u0435\u044f \u0442\u0430\u043a\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u0443\u044e \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043d\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 webpack \u043a\u043e\u043d\u0444\u0438\u0433\u0438.<\/p>\n<p>\u041e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0443\u0434\u0435\u043b\u044f\u0435\u043c aliases.<\/p>\n<pre><code class=\"javascript\">\/\/ Modules const fs = require(\"fs\"); const path = require(\"path\"); \/\/ Constants const { PATH_TO_PROJECT, PREFIX_PATH } = require(\".\/constants\"); \u200b const DEFAULT_ALIASES = {  redux: \"redux\/src\", [PREFIX_PATH]: path.join(PATH_TO_PROJECT), }; \u200b const getDirectories = () =>  fs   .readdirSync(PATH_TO_PROJECT, { withFileTypes: true })   .filter(dirent => dirent.isDirectory())   .map(dirent => dirent.name); \u200b const reducer = (accumulator, currentValue) => {  const key = `${PREFIX_PATH}${currentValue.toLowerCase()}`;  const pathDirectory = path.join(PATH_TO_PROJECT, currentValue); \u200b  accumulator[key] = pathDirectory;  return accumulator; }; \u200b const ALIASES_OBJECT = Object.assign(DEFAULT_ALIASES, getDirectories().reduce(reducer, {})); \u200b module.exports = { ALIASES_OBJECT };<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0441\u0443\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432\u044b\u0448\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e, \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432 webpack:<\/p>\n<pre><code class=\"javascript\">resolve: {    alias: ALIASES_OBJECT,    extensions: [\".js\", \".jsx\", \".ts\", \".tsx\", \".json\", \".mjs\"],    modules: [PATH_TO_PROJECT, \"node_modules\"],    plugins: [PnpWebpackPlugin], },<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0432 eslint \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c .js:<\/p>\n<pre><code class=\"javascript\">settings: {    'import\/extensions': ['.js', '.jsx', '.ts', '.tsx', '.json'],    'import\/resolver': {      alias: {        map: Object.entries(ALIASES_OBJECT),        extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],      },    },    react: {      version: 'detect',    },  },<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 src \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<p><strong>\/\/ Redux<\/strong><\/p>\n<p><strong>actions<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 redux-\u044d\u043a\u0448\u0435\u043d\u0430\u043c\u0438 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 epics.<\/p>\n<p><strong>constants<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 redux-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 actions, epics \u0438 reducers.<\/p>\n<p><strong>modeles<\/strong> \u2014 \u043c\u043e\u0434\u0435\u043b\u0438 redux-store, \u044d\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f reducers, \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 reducers.<\/p>\n<p><strong>epics<\/strong> \u2014 \u044d\u043f\u0438\u043a\u0438 redux \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 store.<\/p>\n<p><strong>reducers<\/strong> \u2014 \u0432\u0441\u0435 reducers \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0435 \u043d\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>selectors<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 selectors \u0438 structured-selectors \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 state \u0432 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/p>\n<p><strong>api<\/strong> \u2014 rxjs.ajax \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 epics \u0441 \u0446\u0435\u043b\u044c\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p><strong>redux<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f redux store, \u043f\u043e\u043b\u043d\u043e\u0433\u043e initial-store, root-reducer, \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 middleware, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, root-epic.\u200b<\/p>\n<p><strong>\/\/ React<\/strong><\/p>\n<p><strong>app<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u043d\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u044e\u0434\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 react providers, \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0438 \u0442.\u0434.<\/p>\n<p><strong>components<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p><strong>enhancers<\/strong> \u2014 \u0441\u044e\u0434\u0430 \u043f\u0438\u0448\u0435\u043c \u0432\u0441\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e compose \u0438\u0437 redux. \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u043b\u043e\u043a\u0430\u043b\u0438, \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0441\u0430\u0439\u0442\u0430 \u0438 \u0442.\u0434.<\/p>\n<p><strong>hooks<\/strong> \u2014 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0445\u0443\u043a\u043e\u0432 react.<\/p>\n<p><strong>i18n<\/strong> \u2014 \u0437\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u043c json \u043b\u043e\u043a\u0430\u043b\u0435\u0439.<\/p>\n<p><strong>layouts<\/strong> \u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b-react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0441\u0430\u0439\u0442\u0430 \u0438\u043c\u0435\u043b\u0438 \u043c\u0435\u043d\u044e. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0430\u043c \u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044b.<\/p>\n<p><strong>lib (\u0438\u043d\u043e\u0433\u0434\u0430 helpers \u0438\u043b\u0438 utils)<\/strong> \u2014 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432, \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0442.\u0434.<\/p>\n<p><strong>modules<\/strong> \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433 react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 layouts. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 menu.<\/p>\n<p><strong>routes<\/strong> \u2014 \u0437\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c.\u200b<\/p>\n<p><strong>\/\/ Other<\/strong><\/p>\n<p><strong>theme<\/strong> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u0435\u043c \u0434\u043b\u044f ui-kits \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f styled-components (\u043f\u0430\u043b\u0438\u0442\u0440\u0430, \u043e\u0442\u0441\u0442\u0443\u043f\u044b, \u0448\u0440\u0438\u0444\u0442\u044b \u0438 \u0442.\u0434). \u041e\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p><strong>utils<\/strong> \u2014 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0438\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0441\u0435\u0431\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432.<\/p>\n<p>\u0418\u043c\u0435\u044f \u0434\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 redux:<\/p>\n<p><code>import @redux\/**\/*'<\/code><\/p>\n<p>\u0438\u043b\u0438<\/p>\n<p><code>import '@\/redux\/**\/*'<\/code><\/p>\n<p>\u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c src \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c webpack.<\/p>\n<h4>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 webpack<\/h4>\n<p>\u0412\u044b\u0448\u0435 \u043c\u044b \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 .env.development. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 process.env \u0438\u0437 \u0441\u0440\u0435\u0434\u044b node \u043e \u043d\u0438\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442. \u041e\u043d \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 env \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b package.json. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c NODE_ENV:<\/p>\n<p><code>\"start\": \"cross-env NODE_ENV=development webpack serve --config .\/webpack.config.js\",<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 process.env, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0445 \u0438\u0437 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/p>\n<pre><code class=\"javascript\">\"use-strict\"; \/\/ Utils const {  VALID_NODE_ENV,  IS_DEVELOPMENT,  IS_PRODUCTION, } = require(\".\/constants\"); const { getConfig } = require(\".\/get-config-file\"); \u200b const DEFAULT_ENV = {  NODE_ENV: VALID_NODE_ENV,  IS_DEVELOPMENT: IS_DEVELOPMENT,  IS_PRODUCTION: IS_PRODUCTION, }; \u200b const getConfigEnv = (objectEnv = {}) => {  const conf = getConfig(); \u200b  if (conf) {    const resultConf = Object.keys(conf).reduce(     (acc, key) => {        const value = JSON.stringify(conf[key]); \u200b        acc[key] = value;        return Object.assign({}, acc);     },      Object.assign({}, objectEnv, DEFAULT_ENV),   ); \u200b    return resultConf; } \u200b  return {}; }; \u200b module.exports = { getConfigEnv };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u0435\u0442\u043e\u0434 getConfigEnv \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f development \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<pre><code class=\"javascript\">NODE_ENV = development HOST = localhost PORT = 3000 VERSION = 1.0.0 CLIENT_ID = xxxx-xxxx-xxxx-xxxx<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 process.env. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 plugins \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">\/\/ Modules const webpack = require(\"webpack\"); \/\/ Utils const { getConfigEnv } = require(\"..\/utils\/get-config-env\"); \u200b const getDefinePlugin = () => {  const plugin = new webpack.DefinePlugin({    \"process.env\": getConfigEnv(), }); \u200b  return plugin; }; \u200b module.exports = { getDefinePlugin };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<h4>\u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/h4>\n<p>\u041f\u0440\u0438 \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043d\u0430\u0448 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u044b, \u043d\u043e \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0427\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c \u043e \u0442\u0430\u043a\u0438\u0445 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u0445, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c webpack-plugin:<\/p>\n<pre><code class=\"javascript\">\/\/ Modules const DuplicatePackageCheckerPlugin =   require('duplicate-package-checker-webpack-plugin');   const getDuplicatePackageCheckerPlugin = () => { const plugin = new DuplicatePackageCheckerPlugin({   verbose: true,   emitError: true, }); \u200b return plugin; }; \u200b module.exports = { getDuplicatePackageCheckerPlugin };<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 package.json \u0432 \u0440\u0430\u0437\u0434\u0435\u043b resolutions, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0437\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<pre><code class=\"javascript\">\"resolutions\": {  \"get-intrinsic\": \"1.1.1\", }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 react):<\/p>\n<p><code>npm ls react<\/code><\/p>\n<p>\u041e\u043d\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0438 \u0432 \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u0435\u0441\u0442\u044c react, \u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 peerDependencies. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f react \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"javascript\">\"peerDependencies\": {    \"react\": \">=16.9.0\",    \"react-dom\": \">=16.9.0\" },<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f react, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0441\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0432\u0435\u0440\u0441\u0438\u044e react, \u043d\u043e \u0438 \u043e\u0434\u043d\u0443 \u043a\u043e\u043f\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e webpack \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c rollup. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043d\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, redux.<\/p>\n<h4>\u041a\u043e\u043d\u0444\u0438\u0433 babel.rc<\/h4>\n<pre><code class=\"javascript\">{   \"presets\": [     [\"@babel\/preset-env\", { \"modules\": false }],     \"@babel\/preset-react\"   ],    \"plugins\": [     [       \"babel-plugin-styled-components\",       { \"ssr\": false, \"pure\": true }     ],     \"@babel\/plugin-syntax-dynamic-import\",     [\"@babel\/plugin-proposal-class-properties\", { \"loose\": true }],     \"@babel\/plugin-proposal-export-default-from\",     \"@babel\/plugin-proposal-optional-chaining\",     \"@babel\/plugin-proposal-unicode-property-regex\",     \"@babel\/plugin-transform-runtime\"   ],    \"env\": {     \"development\": {       \"plugins\": [         \"react-refresh\/babel\"       ]     }   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JavaScript.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c react-refresh.<\/p>\n<h4>Eslint \u043a\u043e\u043d\u0444\u0438\u0433<\/h4>\n<pre><code class=\"javascript\">const path = require('path'); \/\/ Utils const CONSTANTS = require('.\/webpack\/utils\/constants'); const { ALIASES_OBJECT } = require('.\/webpack\/utils\/aliases'); const { APP_DIR, OS } = CONSTANTS; const { IS_WINDOWS } = OS;  \u200b module.exports = {   parser: '@typescript-eslint\/parser',   parserOptions: {     tsconfigRootDir: path.resolve(APP_DIR, 'src'),     project: path.resolve(APP_DIR, '.\/tsconfig.json'),     createDefaultProgram: true,     ecmaVersion: 2018,     sourceType: 'module',     ecmaFeatures: {       jsx: true,     },   },   env: {     browser: true,     es2020: true,     node: true,   },   extends: [     'plugin:@typescript-eslint\/recommended',     'plugin:react\/recommended',     'plugin:react-hooks\/recommended',     'airbnb-typescript',     'plugin:jsx-a11y\/recommended',     'plugin:import\/typescript',   ],   plugins: [     '@typescript-eslint',     'import',     'react',     'optimize-regex',     'prettier',     'promise',   ],   rules: {     'arrow-parens': 'off',     'no-alert': 'error',     '@typescript-eslint\/explicit-function-return-type': 'off',     '@typescript-eslint\/ban-ts-comment': 'off',     '@typescript-eslint\/no-var-requires': 'off',     '@typescript-eslint\/lines-between-class-members': 'off',     'linebreak-style': 0,     'eslint linebreak-style': [0, 'error', IS_WINDOWS ? 'windows' : 'unix'],     'import\/prefer-default-export': 'off',     'import\/no-extraneous-dependencies': 'off',     'no-console': 'off',     'react\/prop-types': 'off',     'implicit-arrow-linebreak': ['error', 'below'],     'no-param-reassign': 'off',   },   settings: {     'import\/extensions': ['.ts', '.tsx', '.json'],     'import\/resolver': {       alias: {         map: Object.entries(ALIASES_OBJECT),         extensions: ['.ts', '.tsx', '.json'],       },     },   },   globals: {     document: true,     window: true,     parent: true,   }, };<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e aliases, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0440\u0430\u043d\u0435\u0435.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430:<\/p>\n<p><code>'eslint linebreak-style': [0, 'error', IS_WINDOWS ? 'windows' : 'unix'],<\/code><\/p>\n<p>\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<h4>HTTPS webpack-dev-server<\/h4>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u044b \u043d\u0443\u0436\u043d\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c https-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 cert. \u0412\u043d\u0443\u0442\u0440\u044c \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043c 2 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<p><code>localhost.crt<\/code><\/p>\n<p><code>localhost.key<\/code><\/p>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438 \u0435\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 webpack \u043a\u043e\u043d\u0444\u0438\u0433\u0435 webpack-dev-server \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e https:<\/p>\n<pre><code class=\"javascript\">\"use-strict\"; \/\/ Modules const fs = require(\"fs\"); const path = require(\"path\"); const dotenv = require(\"dotenv\"); \/\/ Utils const {  APP_DIR,  PATH_TO_ASSETS, } = require(\".\/constants\"); \u200b const devConstants = dotenv.config({ path: \".\/.env.development\" }).parsed; \u200b const getDevServer = () => {  const serverConf = {    compress: true,    static: [      PATH_TO_ASSETS,   ],    firewall: false,    historyApiFallback: true,    hot: true,    https: {      key: fs.readFileSync(path.join(APP_DIR, '\/cert\/localhost.key')),      cert: fs.readFileSync(path.join(APP_DIR, '\/cert\/localhost.crt')),   },    host: devConstants.HOST,    open: true,    port: devConstants.PORT, }; \u200b  return serverConf; }; \u200b module.exports = { getDevServer };<\/code><\/pre>\n<h4>\u041a\u043e\u043c\u043c\u0438\u0442\u044b, husky, \u043a\u043e\u043d\u0444\u0438\u0433 <\/h4>\n<p>\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0438\u0442\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a \u0432\u0438\u0434\u0443 feature(my-project): [TASK-ID] my description, \u0438 \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u0441\u0435, \u0447\u0442\u043e eslint \u0438 prettier \u043c\u043e\u0433\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043c\u044b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u043c. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0438\u0442.<\/p>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p>husky: \u043d\u0435 \u043d\u0438\u0436\u0435 6 \u0432\u0435\u0440\u0441\u0438\u0438<\/p>\n<p>lint-staged, commitizen<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u0440\u043d\u0435 .czrc \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443:<\/p>\n<pre><code class=\"javascript\">{   \"path\": \".\/.commitizen\/cz-config.js\" }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 .commitizen \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0432 \u043d\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0444\u0438\u0433 cz-config.js:<\/p>\n<pre><code class=\"javascript\">'use-strict'; \u200b const { configLoader } = require('commitizen'); const longest = require('longest'); const map = require('lodash\/map'); const config = configLoader.load() || {}; const regExpJiraTicket = \/^(ux|devops)-[1-9][0-9]{0,5}$\/gi; const options = {  scope: 'courier-admin',  maxCommitWidth: 50, };  const choicesList = {   feature: {     title: 'feature',     description: '\u041d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430',   },   'bug-fix': {     title: 'bug-fix',     description: '\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0433',   }, };  const length = longest(Object.keys(choicesList)).length + 1;  const choices = map(choicesList, (type, key) => ({   name: `${`${key}:`.padEnd(length)} ${type.description}`,   value: key, }));   \u200b module.exports = {   prompter(cz, setCommit) {     cz.prompt([       {         type: 'list',         name: 'type',         message: '\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u043a\u043e\u043c\u043c\u0438\u0442\u0430:',         choices,         default: config.defaultType,       },       {         type: 'input',         name: 'jiraTicket',         message: '\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u0433 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 JIRA (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 UX-123):',         validate: value => {           const trimValue = value.trim();            if (!trimValue.length > 0) {             return '\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.';           }            if (!regExpJiraTicket.test(trimValue)) {             return '\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442.';           }            return true;         },         transformer: subject => subject.toUpperCase(),         filter: subject => subject.trim().toUpperCase(),       },       {         type: 'input',         name: 'commit',         message: `\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 (\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 ${options.maxCommitWidth}):\\n`,         validate: value => {           const trimValue = value.trim();            if (!trimValue.length > 0) {             return '\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.';           }            if (trimValue.length > options.maxCommitWidth) {             return '\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0438\u0442.';           }            return true;         },         filter: subject => subject.trim().toLowerCase(),       },     ])       .then(answers => {         const { type, jiraTicket, commit } = answers;         const str = `${type} (${options.scope}): [${jiraTicket}] ${commit}`;          setCommit(str);       })       .catch(error => {         console.log(error);       });   }, };<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0430\u0448\u0435\u043c\u0443 gitflow. \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 commitizen. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438\u0437 npm.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 .husky \u0432 \u043d\u0435\u043c \u0444\u0430\u0439\u043b pre-commit<\/p>\n<pre><code class=\"javascript\">#!\/bin\/sh . \"$(dirname \"$0\")\/_\/husky.sh\" \u200b yarn lint-staged<\/code><\/pre>\n<p>\u0412 package.json \u0432 \u0440\u0430\u0437\u0434\u0435\u043b scripts \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">\"prepare\": \"husky install\", \"commit\": \"cz\"<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430 unix \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 husky. \u0414\u043b\u044f \u0435\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u0430\u0432\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 .husky \u043d\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p><code>chmod -R +w .\/.husky<\/code><\/p>\n<p>\u041f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/p>\n<p><code>yarn cz<\/code><\/p>\n<p>\u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043b\u0438\u043d\u0442\u0435\u0440\u043e\u043c, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u2014 \u043a\u043e\u043c\u043c\u0438\u0442.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043c\u044b \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0443 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u043d\u0443\u043b\u044f, \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0434\u043e\u043b\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0432\u0430\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u0445 \u2013 <\/strong><a href=\"https:\/\/vk.com\/simbirsoft_team\"><strong><u>\u0412\u041a<\/u><\/strong><\/a><strong> \u0438 <\/strong><a href=\"https:\/\/t.me\/simbirsoft_dev\"><strong><u>Telegram<\/u><\/strong><\/a><strong>.<\/strong><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/668622\/\"> https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/668622\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u0438\u043d\u043e\u0433\u0434\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0437\u0434\u0440\u0430\u0432\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f, \u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432\/\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430, \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0442 \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442. \u042d\u0442\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0440\u043e\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u0435\u0439\u0441\u0435 \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0435\u0435\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439, UI \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0442\u0430\u0431\u043b\u0438\u0446, \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0430\u043d\u0434\u043b\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u043c\u0435\u0442\u044c \u0432 \u0440\u0443\u043a\u0430\u0432\u0435 \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0438\u0447\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0442\u0438\u043c\u043b\u0438\u0434\u0430\u043c \u0438 \u0442\u0435\u0445\u043b\u0438\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0442\u0430\u0442\u0438\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c create-react-app \u0438\u043b\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 create-react-app \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442?\u00a0<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, create-react-app \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c webpack \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d depend-bot, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 CRA. \u0422\u0430\u043a\u0436\u0435 \u043c\u0438\u043d\u043e\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u044f\u0432\u043d\u043e \u043d\u0435 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u044e\u0448\u0435\u043a \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0436\u0435\u043a\u0442\u0430 webpack \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0430 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u043d\u0443\u043b\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 CRA \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u0438\u0431\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 webpack 5. \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0433\u0438\u0431\u043a\u0430\u044f \u0438 \u043c\u043e\u0449\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p><strong>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0430 webpack:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0418\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c node_env (development, production, test \u0438 \u0442.\u0434.) \u0438 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 bundle \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 node_env.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 aliases \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c typescript, eslint, prettier.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u0430\u0439\u043b\u0435\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e import react-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 git-flow \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0435\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0432\u044b\u0431\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u2014 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0441 \u0442\u0435\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react, react-dom<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^17.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0434\u0435\u0441\u044c \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-router-dom<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u043a\u0438 \u0432 \u044d\u043f\u0438\u043a\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <strong>connected-react-router<\/strong> ^6.<em>*.*<\/em><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>redux<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^4.*<em>.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>redux-observable<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^1.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>rxjs<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^6.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f redux-observable \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>immer<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">8.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>reselect<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^4.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438 store<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>styled-components<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e css<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-virtualized<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^9.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-intl<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^3.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>@loadable\/component<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^5.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>react-final-form<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"101\" width=\"101\">\n<p align=\"left\">^6.<em>*.*<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u043e\u0440\u043c \u0432\u0432\u043e\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b webpack<\/h4>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 webpack \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442:<\/p>\n<pre><code class=\"javascript\">\/\/ Modules const path = require(\"path\"); \u200b \/\/ Constants from path const APP_DIR = process.cwd(); const ASSETS_FOLDER = \"assets\"; const SOURCE_FOLDER = \"src\"; const PUBLIC = \"public\"; const BUILD_FOLDER = \"build\"; const CACHE_FOLDER = \".cache\"; const PREFIX_PATH = \"@\" \/\/ \u042d\u0442\u043e \u043d\u0430\u0448 alias \u0434\u043b\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 src const PATH_TO_PROJECT = path.resolve(APP_DIR, SOURCE_FOLDER); const PATH_TO_PUBLIC = path.resolve(APP_DIR, PUBLIC); const PATH_TO_ASSETS = path.resolve(APP_DIR, ASSETS_FOLDER); const PATH_TO_BUILD = path.resolve(APP_DIR, BUILD_FOLDER); const PATH_TO_CACHE_FOLDER = path.resolve(APP_DIR, CACHE_FOLDER); \u200b \/\/ Mode const DEVELOPMENT = \"development\"; const PRODUCTION = \"production\"; const { NODE_ENV } = process.env; const ENV_LIST = [DEVELOPMENT, PRODUCTION]; const VALID_NODE_ENV = NODE_ENV &amp;&amp; ENV_LIST.includes(NODE_ENV)  ? NODE_ENV : PRODUCTION; \/\/ \u0415\u0441\u043b\u0438 node_env \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0432\u043e\u0438\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c. const IS_DEVELOPMENT = NODE_ENV === DEVELOPMENT; const IS_PRODUCTION = NODE_ENV === PRODUCTION; const IS_BUNDLE_ANALYZE = process.env.IS_BUNDLE_ANALYZE || false;   \/\/ \u042d\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u0430\u043d\u0434\u043b\u0430, \u043e \u043d\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u200b \/\/ OS const OS = {  IS_WINDOWS: process.platform === \"win32\", };<\/code><\/pre>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 OS. \u041e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 eslint \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043a \u043d\u0435\u043c\u0443 \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f.<\/p>\n<h4>\u041a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0432 package.json \u0441\u0432\u043e\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0439 env_variable.<\/p>\n<pre><code class=\"javascript\">\"scripts\": {     \"start\": \"cross-env NODE_ENV=development webpack serve --config .\/webpack.config.js\",     \"build\": \"cross-env NODE_ENV=production webpack --config .\/webpack.config.js\",     \"analyze-dev\": \"cross-env NODE_ENV=development cross-env webpack serve --config .\/webpack.config.js\",   }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0441\u0440\u0435\u0434 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0438\u043c\u0435\u043d\u0438:<\/p>\n<p><code>.env.${node_env}<\/code><\/p>\n<p>\u0433\u0434\u0435 node_env \u043b\u044e\u0431\u0430\u044f \u0441\u0440\u0435\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d, \u0442\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0435 \u043d\u0435\u0439\u043c\u0438\u043d\u0433, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p><code>.env.template.${node_env}<\/code><\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 .gitignore, \u0438 \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/p>\n<pre><code class=\"javascript\">NODE_ENV = development HOST = localhost PORT = 3000 VERSION = 1.0.0 CLIENT_ID = xxxx-xxxx-xxxx-xxxx<\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HOST \u0438 PORT \u2014 \u0434\u043b\u044f \u0441\u0440\u0435\u0434\u044b develop, \u0447\u0442\u043e\u0431\u044b webpack \u0447\u0435\u0442\u043a\u043e \u0437\u043d\u0430\u043b, \u0433\u0434\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0432\u043e\u0439 webpack-dev-server, \u0430 \u0442\u0430\u043a\u0436\u0435 API, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>Webpack \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u0443\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041d\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043d\u0435 \u0431\u043e\u043b\u044c\u043d\u043e. =)<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 webpack \u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0432 \u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438:<\/p>\n<ol>\n<li>\n<p><strong>loaders <\/strong>\u2014 \u043d\u0430\u0448\u0438 loaders (babel, sass, less \u0438 \u0442.\u0434.) \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 loader:<\/p>\n<pre><code class=\"javascript\">const getBabelLoader = () => {   const loader = {     loader: \"babel-loader\",     options: {       configFile: path.join(APP_DIR, \".babelrc\"),    },  }; \u200b   return loader; }; \u200b module.exports = { getBabelLoader }; <\/code><\/pre>\n<p>2. <strong>optimization <\/strong>\u2014 \u0441\u044e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, terser \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 webpack, \u043a\u0430\u043a \u0441\u0436\u0438\u043c\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<pre><code class=\"javascript\">const TerserPlugin = require(\"terser-webpack-plugin\"); \u200b const terser = () => {   const plugin = new TerserPlugin({     terserOptions: {       parse: {         ecma: 10,      },       compress: {         ecma: 5,         warnings: false,         comparisons: false,         booleans: true,         collapse_vars: false,         if_return: true,         sequences: true,         unused: true,         conditionals: true,         dead_code: true,         evaluate: true      },       mangle: {         safari10: true,      },       output: {         beautify: false,         ecma: 5,         comments: false,         ascii_only: true,      },    },     parallel: true,  }); \u200b   return plugin; }; \u200b module.exports = { terser };<\/code><\/pre>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>ecma<\/strong> \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 JavaScript, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 5 (ES5)<\/p>\n<\/li>\n<li>\n<p><strong>booleans<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439: !!a ? b : c \u2192 a ? b : c<\/p>\n<\/li>\n<li>\n<p><strong>comparisons<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439: a = !b &amp;&amp; !c &amp;&amp; !d &amp;&amp; !e \u2192 a=!(b||c||d||e)<\/p>\n<\/li>\n<li>\n<p><strong>collapse_vars<\/strong> \u2014 \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 var \u0438 const, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p><strong>if_return<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0437\u0430 \u0441\u0447\u0435\u0442 return<\/p>\n<\/li>\n<li>\n<p><strong>sequences<\/strong> \u2014 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e<\/p>\n<\/li>\n<li>\n<p><strong>unused<\/strong> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 (\u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434)<\/p>\n<\/li>\n<li>\n<p><strong>conditionals<\/strong> \u2014 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c<\/p>\n<\/li>\n<li>\n<p><strong>dead_code<\/strong> \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p><strong>evaluate<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/terser.org\/docs\/api-reference#compress-options\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<ol start=\"3\">\n<li>\n<p><strong>optimization-presets <\/strong>\u2014 \u0437\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u0440\u0435\u0441\u0435\u0442\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 2.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">const getOptimizationMainPreset = () => {   const optimization = {     minimize: IS_PRODUCTION,     minimizer: [       terser(),       cssAssets(),    ],     splitChunks: getSplitChunks(),     runtimeChunk: 'single'  }; \u200b   return optimization; }; \u200b module.exports = { getOptimizationMainPreset };<\/code><\/pre>\n<ol start=\"4\">\n<li>\n<p><strong>plugins <\/strong>\u2014 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f webpack.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">'use-strict'; \/\/ Modules const LoadablePlugin = require('@loadable\/webpack-plugin'); \/\/ Constants const {   IS_PRODUCTION, } = require('..\/utils\/constants'); \u200b const getLoadableWebpackPlugin = () => { \u200b   const plugin = new LoadablePlugin({     filename: 'stats-loadable.json',     writeToDisk: IS_PRODUCTION,  }); \u200b   return plugin; }; \u200b module.exports = { getLoadableWebpackPlugin };<\/code><\/pre>\n<ol start=\"5\">\n<li>\n<p><strong>plugins-loader <\/strong>\u2014 \u043b\u043e\u0430\u0434\u0435\u0440\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 4.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">const getMainPluginsLoader = () => {   return [     getProgressBarPlugin(),     getRefreshPlugin(),     IS_PRODUCTION &amp;&amp; getCleanWebpackPlugin(),     getForkTsCheckerWebpackPlugin(),     getDefinePlugin(),  ].filter(Boolean); }; \u200b module.exports = { getMainPluginsLoader };<\/code><\/pre>\n<ol start=\"6\">\n<li>\n<p><strong>presets <\/strong>\u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0441\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"javascript\">\/\/ Loaders const { getStyleLoader } = require(\"..\/loaders\/style-loader\"); const { getCssLoader } =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-333845","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=333845"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333845\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}