{"id":380276,"date":"2024-06-28T21:01:18","date_gmt":"2024-06-28T21:01:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=380276"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=380276","title":{"rendered":"<span>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 Javascript \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0432\u0438\u0442\u043e\u043a? \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 ES \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432<\/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>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0430\u0441\u044c, \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u0445 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 <code>dependencies<\/code>, <code>devDependencies<\/code> \u0438 <code>peerDependencies<\/code> \u0432 <code>package.json<\/code>. \u042d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 \u0432 \u043c\u043e\u0435\u043c <a href=\"https:\/\/t.me\/denis_voronin_channel\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435<\/a>, \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0435\u0449\u0435 \u043d\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0442\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0436\u0435 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u043e\u0434\u043d\u0443 <a href=\"https:\/\/habr.com\/ru\/companies\/gazprombank\/articles\/725992\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0431\u044b\u043b\u0438 \u043c\u044b\u0441\u043b\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0443\u0441\u0432\u043e\u0438\u0442\u044c \u0442\u0435\u043c\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u0447\u0435\u0440\u0435\u0437 ES Modules. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0443 \u0430\u0432\u0442\u043e\u0440\u0430, \u043b\u0438\u0431\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 <a href=\"#dependencies-management-history\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435<\/a> \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0410 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u044b ESM \u0431\u0443\u0434\u0435\u0442 \u0432\u043e <a href=\"#dependencies-management-future\" rel=\"noopener noreferrer nofollow\">\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"dependencies-management-history\" id=\"dependencies-management-history\"><\/a><\/p>\n<h2>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/h2>\n<p>\u0412 \u0434\u0430\u043b\u0435\u043a\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0431\u044b\u043b\u0438, \u043d\u0435 \u0431\u044b\u043b\u043e NodeJS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 HTML \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u044d\u0433\u0430 <code>script<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"&lt;URL>\">&lt;\/script><\/code><\/pre>\n<p>\u041d\u0430 \u043c\u0435\u0441\u0442\u043e <code>&lt;URL><\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>js<\/code> \u0444\u0430\u0439\u043b. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Content_Delivery_Network\" rel=\"noopener noreferrer nofollow\">CDN<\/a>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/3.6.1\/jquery.min.js\">&lt;\/script><\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0441\u044f \u043d\u0430 CDN-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c. \u041d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0431\u044b\u043b \u0431\u043e\u043d\u0443\u0441 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0440\u043e\u0441\u0441-\u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 <a href=\"https:\/\/www.stefanjudis.com\/notes\/say-goodbye-to-resource-caching-across-sites-and-domains\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e<\/a> \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430 \u0441\u0432\u0435\u0442 \u0432\u044b\u0448\u0435\u043b <a href=\"https:\/\/bower.io\/\" rel=\"noopener noreferrer nofollow\">Bower<\/a> &#8212; \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0441 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c &#8212;<code>bower.json<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"json\">{   \"name\": \"my-app\",   \"dependencies\": {     \"react\": \"^16.1.0\"   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>bower install<\/code> \u0438 Bower \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 <code>dependencies<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0442\u0438\u043f\u0443 <a href=\"https:\/\/gruntjs.com\/\" rel=\"noopener noreferrer nofollow\">Grunt<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/gulpjs.com\/\" rel=\"noopener noreferrer nofollow\">Gulp<\/a>, \u0442\u0430\u043a \u0438 \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435, \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0433 <code>script<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"bower_components\/jquery\/dist\/jquery.min.js\">&lt;\/script><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Bower \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0448\u043b\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438. \u0422\u0430\u043a \u043a\u0430\u043a Bower \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/semver.org\/lang\/ru\/\" rel=\"noopener noreferrer nofollow\">SemVer<\/a> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/501198\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d, \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/860\/d59\/a94\/860d59a94c61173a4810e5d83a5b8c93.png\" alt=\"\u0422\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" title=\"\u0422\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" width=\"3273\" height=\"1221\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/860\/d59\/a94\/860d59a94c61173a4810e5d83a5b8c93.png\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f (resolution) \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Bower \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u043b\u044e dependencies, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>\u0422\u0443\u0442 \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e <code>dependencies<\/code> \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Bower \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0438 \u043f\u043e\u043b\u0435 <code>devDependencies<\/code>. \u041f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 dev \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442.\u043f. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044f\u043c\u044b\u0435 <code>devDependencies<\/code>, \u0430 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/52f\/e3e\/0aa\/52fe3e0aa9cb9fab8b91c395b03b1efa.png\" alt=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 devDependencies\" title=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 devDependencies\" width=\"2396\" height=\"1669\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52f\/e3e\/0aa\/52fe3e0aa9cb9fab8b91c395b03b1efa.png\"\/><\/p>\n<div><figcaption>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 devDependencies<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 Bower \u0432\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee8\/50e\/8c0\/ee850e8c0574e2345bfe5b0b9517f092.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 Bower\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 Bower\" width=\"2454\" height=\"1629\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee8\/50e\/8c0\/ee850e8c0574e2345bfe5b0b9517f092.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 Bower<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0440\u0438\u0441\u043a \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/92f\/b31\/b3f\/92fb31b3f50f909abfad08b628adfa59.png\" alt=\"\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" title=\"\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" width=\"2545\" height=\"1571\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/92f\/b31\/b3f\/92fb31b3f50f909abfad08b628adfa59.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0434\u0435\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0442\u043e Bower \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u043b\u0435\u0447\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0438\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0435 <code>resolutions<\/code>:<\/p>\n<pre><code class=\"json\">{   \"resolutions\": {     \"library-d\": \"2.0.0\"   } } <\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u043b\u0430 \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0418 \u043f\u0440\u0438\u0448\u043b\u043e \u043e\u043d\u043e \u0438\u0437 <a href=\"https:\/\/nodejs.org\/en\" rel=\"noopener noreferrer nofollow\">NodeJS<\/a>, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0441\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 &#8212; <a href=\"https:\/\/www.npmjs.com\/\" rel=\"noopener noreferrer nofollow\">NPM<\/a>.<\/p>\n<p>NPM \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u043c\u0435\u043b <code>nested<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>node_modules<\/code>, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0435\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/35b\/d71\/11d\/35bd7111dde184c86869bf409cd07841.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 NPM 1 \u0438 2 \u0432\u0435\u0440\u0441\u0438\u0438\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 NPM 1 \u0438 2 \u0432\u0435\u0440\u0441\u0438\u0438\" width=\"2454\" height=\"1629\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/35b\/d71\/11d\/35bd7111dde184c86869bf409cd07841.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 NPM 1 \u0438 2 \u0432\u0435\u0440\u0441\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u0443\u0431\u043b\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0431\u0435\u0437\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u0435\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>node_modules<\/code> \u043c\u043e\u0433 \u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430<a href=\"https:\/\/stackoverflow.com\/questions\/26155135\/node-npm-windows-file-paths-are-too-long-to-install-packages\" rel=\"noopener noreferrer nofollow\"> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u043f\u0443\u0442\u0435\u0439 \u043d\u0430 Windows<\/a>.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 NPM 3 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 <code>hoisted<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>node_modules<\/code> \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u0433\u0434\u0435 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5b5\/2ce\/12d\/5b52ce12d990afd59a8ee7f13ec3ee1b.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u043e \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\u043c \u0438\u0437 NPM 3\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u043e \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\u043c \u0438\u0437 NPM 3\" width=\"2454\" height=\"1629\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b5\/2ce\/12d\/5b52ce12d990afd59a8ee7f13ec3ee1b.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u043e \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\u043c \u0438\u0437 NPM 3<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e NodeJS \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>node_modules<\/code> \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/949\/a82\/252\/949a82252aa4bf5b574eff48c070d376.png\" alt=\"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 NodeJS\" title=\"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 NodeJS\" width=\"1986\" height=\"2013\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/949\/a82\/252\/949a82252aa4bf5b574eff48c070d376.png\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 NodeJS<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0448\u043b\u0430 \u0440\u0435\u0447\u044c \u043e Bower \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b dependencies \u0438 devDependencies, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0432 NPM. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 NPM \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0440\u044f\u0434 \u043f\u043e\u043b\u0435\u0439 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/gazprombank\/articles\/725992\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u0447\u0442\u043e \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0438 \u0435\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/545008\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0431\u0435\u0433\u0443\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e. \u041a <code>dependencies<\/code> \u0438 <code>devDependencies<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#peerdependencies\" rel=\"noopener noreferrer nofollow\">peerDependencies<\/a> &#8212; \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u044d\u0442\u043e <code>react-dom<\/code> &#8212; \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 DOM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>react<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c <code>react-dom<\/code> \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044f\u0432\u043d\u043e, \u0447\u0442\u043e \u0435\u0439 \u043d\u0443\u0436\u0435\u043d <code>react<\/code>, \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443?  React \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445. \u0414\u043b\u044f front end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 <code>react<\/code> \u0438 <code>react-dom<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>react-dom<\/code> \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0430 \u043d\u0443\u0436\u0435\u043d <code>react-native<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c peerDependencies \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0432\u044f\u0437\u044c, \u043d\u043e \u043d\u0435 \u0436\u0435\u0441\u0442\u043a\u043e, \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0443\u0436\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#bundledependencies\" rel=\"noopener noreferrer nofollow\">bundledDependencies<\/a> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>npm pack<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0430\u0448\u0443 \u043f\u0430\u043f\u043a\u0443 \u0432 \u0442\u0430\u0440\u0431\u043e\u043b (tarball-\u0444\u0430\u0439\u043b). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0434\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 \u0438\u0445.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#optionaldependencies\" rel=\"noopener noreferrer nofollow\">optionalDependencies<\/a> &#8212; \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 CI\/CD \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e <code>peerDependencies<\/code> \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. NPM 7 \u0438 \u0432\u044b\u0448\u0435 \u0443\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 <code>peerDependencies<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0443\u043f\u0430\u0434\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Storybook 6-\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 React 18:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b0\/715\/06b\/2b071506bc3c3a2e2d01378fc187e878.png\" alt=\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 peerDependencies\" title=\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 peerDependencies\" width=\"3754\" height=\"1686\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b0\/715\/06b\/2b071506bc3c3a2e2d01378fc187e878.png\"\/><\/p>\n<div><figcaption>\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 peerDependencies<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0<code>--force<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>--legacy-peer-deps<\/code>, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u0442\u043e NPM \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u043e NPM 7, \u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u0441 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 NPM \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Bower \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#overrides\" rel=\"noopener noreferrer nofollow\">overrides<\/a>, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<pre><code class=\"json\">{   \"dependencies\": {     \"react\": \"18.2.0\"   },   \"devDependencies\": {     \"@storybook\/react\": \"6.3.13\"   },   \"overrides\": {     \"@storybook\/react\": {       \"react\": \"18.2.0\"     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435  <code>peerDependencies<\/code>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>react-dom<\/code> <code>react<\/code> \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439). \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0435\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435, \u0430 \u0441 \u043d\u0435\u0439 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 <code>package.json<\/code> \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0435 <code>peerDependenciesMeta<\/code>:<\/p>\n<pre><code class=\"json\">{   \"peerDependencies\": {     \"react\": \">= 16\"   },   \"peerDependenciesMeta\": {     \"react\": {       \"optional\": true     }   } }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e NPM \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0435\u0441\u043e\u043c\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438: <a href=\"https:\/\/yarnpkg.com\/\" rel=\"noopener noreferrer nofollow\">Yarn<\/a> \u0438 <a href=\"https:\/\/pnpm.io\/\" rel=\"noopener noreferrer nofollow\">PNPM<\/a>. \u041e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u043b\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0438 \u043f\u043e\u0434\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438 \u0442\u043e\u0442 \u0436\u0435 NPM \u043a \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Yarn \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0436\u043e\u0440\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043e\u0434\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043f\u0440\u043e\u0434 \u0432\u044b\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b Yarn \u0434\u043e\u0431\u0430\u0432\u0438\u043b <a href=\"https:\/\/classic.yarnpkg.com\/lang\/en\/docs\/yarn-lock\" rel=\"noopener noreferrer nofollow\">lock-\u0444\u0430\u0439\u043b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>yarn.lock<\/code>, Yarn \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u0430\u043f \u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u0430\u043f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/55f\/9f4\/2ad\/55f9f42ada3aa8fa758a59e47f9c9951.png\" alt=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 yarn.lock\" title=\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 yarn.lock\" width=\"2757\" height=\"1450\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/55f\/9f4\/2ad\/55f9f42ada3aa8fa758a59e47f9c9951.png\"\/><\/p>\n<div><figcaption>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 yarn.lock<\/figcaption><\/div>\n<\/figure>\n<p>NPM \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u0432\u043e\u0439 <a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-lock-json\" rel=\"noopener noreferrer nofollow\">lock-\u0444\u0430\u0439\u043b<\/a>, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npm ci<\/code>.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 Yarn \u0443\u0441\u043a\u043e\u0440\u0438\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d85\/3eb\/672\/d853eb672c0fc76c857e5b81d7c20cf3.png\" alt=\"Yarn Cache\" title=\"Yarn Cache\" width=\"2076\" height=\"1926\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d85\/3eb\/672\/d853eb672c0fc76c857e5b81d7c20cf3.png\"\/><\/p>\n<div><figcaption>Yarn Cache<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c PNPM \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0448\u0438\u043b \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 NPM, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. NPM \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>hoisted<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u00ab\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442\u00bb \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u0432\u0435\u0440\u0445, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0443\u0431\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u042d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0444\u0444\u0435\u043a\u0442. \u0412\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0447\u0442\u043e \u00ab\u0432\u0441\u043f\u043b\u044b\u043b\u0438\u00bb \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0445\u043e\u0442\u044f \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043a\u0430\u043a <code>dependencies<\/code> \u0432 <code>package.json<\/code>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c49\/906\/c1c\/c49906c1c14a18644c49d6624086aa60.png\" alt=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" width=\"2091\" height=\"1912\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c49\/906\/c1c\/c49906c1c14a18644c49d6624086aa60.png\"\/><\/p>\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0432\u044b\u0448\u0435\u043b \u043f\u0430\u0442\u0447 <code>library-a<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>library-b<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043f\u0430\u0434\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u043f\u043e\u0440\u0442 <code>library-b<\/code> \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/633\/0aa\/782\/6330aa782aa326ce92eb3792defc0435.png\" alt=\"\u0424\u0430\u043d\u0442\u043e\u043c\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\" title=\"\u0424\u0430\u043d\u0442\u043e\u043c\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\" width=\"2091\" height=\"1912\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/633\/0aa\/782\/6330aa782aa326ce92eb3792defc0435.png\"\/><\/p>\n<div><figcaption>\u0424\u0430\u043d\u0442\u043e\u043c\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 NPM \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/import-js\/eslint-plugin-import\/blob\/main\/docs\/rules\/no-extraneous-dependencies.md\" rel=\"noopener noreferrer nofollow\">ESLint-\u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/a>, \u0430 PNPM \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 NPM \u0438 Yarn \u043d\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u00a0<code>node_modules<\/code>\u00a0\u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0439, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0433\u0440\u0430\u0444 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0435\u0436\u0435\u043b\u0438 \u0433\u0440\u0430\u0444. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u00abnested\u00bb \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0435\u0440\u0435\u0432\u0430, \u043d\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D1%84\" rel=\"noopener noreferrer nofollow\">\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u0440\u0430\u0444<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd7\/94e\/c82\/cd794ec8258dc116d928ddd884fab68f.png\" alt=\"\u0420\u043e\u043c\u0431\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" title=\"\u0420\u043e\u043c\u0431\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\" width=\"2057\" height=\"1943\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cd7\/94e\/c82\/cd794ec8258dc116d928ddd884fab68f.png\"\/><\/p>\n<div><figcaption>\u0420\u043e\u043c\u0431\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0434\u0438\u043b\u0435\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0440\u0435\u0448\u0438\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Symbolic_link\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438<\/a>. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 PNPM.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 PNPM \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u00a0node_modules\u00a0\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0.pnpm, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0430\u043c\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\u00a0node_modules\u00a0\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u0430 &#171;nested&#187;-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 NPM, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u0432 \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/948\/10a\/be6\/94810abe612f6e8df9e7b3750e74d315.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 node_modules \u0441 PNPM\" title=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 node_modules \u0441 PNPM\" width=\"2467\" height=\"1621\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/948\/10a\/be6\/94810abe612f6e8df9e7b3750e74d315.png\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 node_modules \u0441 PNPM<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u00a0<code>node_modules<\/code>\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u0438 \u043d\u0430 \u0442\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0443 \u043d\u0435\u0433\u043e \u0432\u00a0<code>package.json<\/code>, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0444\u0430\u043d\u0442\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 ESLint-\u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043e\u0442\u043f\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>\u0412 \u0432\u0435\u0440\u0441\u0438\u0438 NPM 9 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0444\u043b\u0430\u0433\u00a0<a href=\"https:\/\/docs.npmjs.com\/cli\/v9\/commands\/npm-install?v=true#install-strategy\" rel=\"noopener noreferrer nofollow\">install-strategy<\/a>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00ablinked\u00bb \u0432 \u043d\u0451\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e PNPM \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441 \u0441\u0438\u043c\u043b\u0438\u043a\u0430\u043c\u0438, \u043d\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0448\u0435\u043b \u0443\u0436\u0435 NPM 10, \u0430 \u044d\u0442\u0430 \u0444\u0438\u0447\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p><a class=\"anchor\" name=\"dependencies-management-future\" id=\"dependencies-management-future\"><\/a><\/p>\n<h2>\u0411\u0443\u0434\u0443\u0449\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u0441 CommonJS-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0430 EcmaScript-\u043c\u043e\u0434\u0443\u043b\u0438. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/820823\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441 Webstorm \u043d\u0430 Cursor<\/a> \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e <a href=\"https:\/\/mswjs.io\/\" rel=\"noopener noreferrer nofollow\">msw<\/a> \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u0443 <a href=\"https:\/\/mswjs.io\/docs\/migrations\/1.x-to-2.x\/#requestresponsetextencoder-is-not-defined-jest\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/a> \u0441 Jest. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Vitest, \u0447\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441 Webstorm \u043d\u0430 Cursor, \u0442\u0430\u043a \u0441\u0442\u0430\u0440\u044b\u0439 Webstorm \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b Vitest.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/gazprombank\/articles\/725992\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0430\u0432\u0442\u043e\u0440 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e ESM &#8212; \u044d\u0442\u043e, \u043d\u0430 \u0435\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434, \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f NodeJS \u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438. \u0418 \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0448\u043b\u043e.<\/p>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 HTML. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438\u0440\u043e\u043d\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u043e\u0442 \u0447\u0435\u0433\u043e \u0434\u0430\u0432\u043d\u043e \u0443\u0448\u043b\u0438. \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0430\u0431\u0435\u0433\u0430\u0442\u044c \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u043d\u0430\u0447\u043d\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 SPA \u043d\u0430 ESM \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u044f\u0434\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/byteofdev.com\/posts\/how-to-use-esm\/\" rel=\"noopener noreferrer nofollow\">How to use ESM on the web and in Node.js<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/dev.to\/ekeijl\/no-build-todo-app-using-htm-preact-209p\" rel=\"noopener noreferrer nofollow\">Building a TODO app without a bundler<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/dev.to\/open-wc\/developing-without-a-build-1-introduction-26ao\" rel=\"noopener noreferrer nofollow\">Developing Without a Build (1): Introduction<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0430\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 ESM &#8212; \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 ToDo App, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 <a href=\"https:\/\/youtu.be\/2Wwx-lF5NhE\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u043b\u0430\u0434<\/a> 2019 \u0433\u043e\u0434\u0430 \u043e\u0442 \u0424\u0440\u0435\u0434\u0430 \u0428\u043e\u0442\u0442\u0430, \u0433\u0434\u0435 \u043e\u043d \u043f\u043e\u0434\u043d\u044f\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0438 \u043d\u0443\u0436\u043d\u044b \u043b\u0438 \u043e\u043d\u0438 \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u044b\u043b \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430, \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ESM \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435?\u00bb &#8212; \u044d\u0442\u043e \u043e\u0442\u043a\u0430\u0437 \u043e\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432 \u0437\u0430 \u0441\u0432\u043e\u044e \u0436\u0438\u0437\u043d\u044c \u0432\u044b \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0437\u0430\u0434\u0430\u0447. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0443, \u0447\u0442\u043e \u043f\u043e\u0440\u043e\u0439 \u0431\u044b\u0432\u0430\u0435\u0442 \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430.<\/p>\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e\u0448\u043b\u043e 5 \u043b\u0435\u0442. \u0418\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f?<\/p>\n<p>\u041d\u0435\u0442.<\/p>\n<p>NPM \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f Node, Web \u043d\u0430\u0448\u0435\u043b \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0445\u043e\u0434 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e. \u0412\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043d\u0430 CJS, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ESM \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0435 \u0432\u0441\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0435\u0449\u0435 \u0440\u044f\u0434 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0422\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043a Typescript;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Tree-shaking;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0438\u0430\u0441\u044b \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u0438\u043d\u0443\u0441\u044b \u043f\u043e\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0448\u0438\u0432\u0430\u044e\u0442 \u043f\u043b\u044e\u0441\u044b.<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ESM \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0440\u043e\u0433\u043e <a href=\"https:\/\/lodash.com\/\" rel=\"noopener noreferrer nofollow\">Lodash<\/a>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u0432\u0441\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u043b\u044e\u0431\u043e\u043c <code>js<\/code> \u0444\u0430\u0439\u043b\u0435:<\/p>\n<pre><code class=\"javascript\">import get from \"https:\/\/esm.sh\/lodash-es@4.17.21\/get.js\";<\/code><\/pre>\n<p>\u041d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433 <code>script<\/code> \u0441 \u0442\u0438\u043f\u043e\u043c <code>importmap<\/code>:<\/p>\n<pre><code class=\"xml\"> &lt;script type=\"importmap\">   {     \"imports\": {       \"get\": \"https:\/\/esm.sh\/lodash-es@4.17.21\/get.js\"     }   } &lt;\/script><\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432 \u043b\u044e\u0431\u043e\u043c <code>js<\/code> \u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"javascript\">import get from \"get\";<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0432, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 ESM, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u044f\u0434 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/preactjs.com\/\" rel=\"noopener noreferrer nofollow\">preact<\/a> &#8212; \u0442\u0430\u043a \u043a\u0430\u043a \u044f \u043f\u0438\u0448\u0443 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430 React;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/developit\/htm\" rel=\"noopener noreferrer nofollow\">htm<\/a> &#8212; \u0442\u0430\u043a \u043a\u0430\u043a \u043b\u044e\u0431\u043b\u044e jsx.<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u0438 \u0434\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a \u0442\u043e\u043c\u0443, \u043a \u0447\u0435\u043c\u0443 \u044f \u043f\u0440\u0438\u0432\u044b\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 React.<\/p>\n<pre><code class=\"javascript\">import { h, render } from 'https:\/\/esm.sh\/preact'; import htm from 'https:\/\/esm.sh\/htm';  \/\/ Initialize htm with Preact const html = htm.bind(h);  const MyComponent = (props, state) => html`&lt;div ...${props} class=bar>${foo}&lt;\/div>`; render(htm`&lt;${MyComponent} \/>`, container);<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 <a href=\"https:\/\/unsuckjs.com\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430.<\/p>\n<p>\u0421 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0441\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c <a href=\"https:\/\/github.com\/voronindenis\/agify-esm\/tree\/main\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0435\u043a\u0442<\/a>, \u0447\u0442\u043e \u044f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 <a href=\"https:\/\/www.npmjs.com\/package\/serve\" rel=\"noopener noreferrer nofollow\">serve<\/a> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npx serve<\/code>, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p> \u041d\u0430\u0447\u043d\u0435\u043c \u0441 <code>index.html<\/code> :<\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html> &lt;html lang=\"en\">   &lt;head>     &lt;title>Agify&lt;\/title>     &lt;link       href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/css\/bootstrap.min.css\"       rel=\"stylesheet\"       integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\"       crossorigin=\"anonymous\"     \/>     &lt;link       rel=\"stylesheet\"       href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.11.3\/font\/bootstrap-icons.min.css\"     \/>     &lt;link href=\"styles\/styles.css\" rel=\"stylesheet\" \/>     &lt;link rel=\"manifest\" href=\".\/manifest.json\" \/>     &lt;meta charset=\"utf-8\" \/>     &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>     &lt;script type=\"importmap\">       {         \"imports\": {           \"preact\": \"https:\/\/esm.sh\/preact\",           \"preact\/\": \"https:\/\/esm.sh\/preact\/\",           \"htm\": \"https:\/\/esm.sh\/htm\",           \"bootstrap\": \"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/js\/bootstrap.esm.min.js\"         }       }     &lt;\/script>   &lt;\/head>   &lt;body>     &lt;script type=\"module\" src=\"js\/App.mjs\">&lt;\/script>   &lt;\/body> &lt;\/html><\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 bootstrap-\u0441\u0442\u0438\u043b\u0438, \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c <code>App.mjs<\/code>, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437.<\/p>\n<pre><code class=\"javascript\">import { render } from \"preact\"; import html from \".\/render.mjs\"; import { Agify } from \".\/Agify\/index.mjs\"; import { Footer } from \".\/Footer\/index.mjs\"; import { Header } from \".\/Header\/index.mjs\"; import { Layout } from \".\/Layout\/index.mjs\";  const App = () => {   return html`     &lt;${Layout} Header=${Header} Content=${Agify} Footer=${Footer} \/>   `; };  render(html`&lt;${App} \/>`, document.body);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>render<\/code>\u0438\u0437 <code>preact<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>App<\/code>. \u042f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0435\u0433\u043e \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>html<\/code>, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b <code>render.mjs<\/code>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0443 \u0441\u0432\u044f\u0437\u043a\u0443 <code>preact<\/code> \u0438 <code>htm<\/code>, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"javascript\">import { h } from 'preact'; import htm from 'htm';  export default htm.bind(h);<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e \u043a React. \u041f\u0440\u0430\u0432\u0434\u0430 \u0442\u0430\u043a \u043a\u0430\u043a jsx \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e html jsx \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u0432 IDE \u043d\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438. \u0414\u043b\u044f VS Code \u044f \u043e\u0431\u043e\u0448\u0435\u043b \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=bierner.lit-html\" rel=\"noopener noreferrer nofollow\">lit-html<\/a>. <a href=\"https:\/\/lit.dev\/docs\/getting-started\/\" rel=\"noopener noreferrer nofollow\">Lit<\/a> &#8212; \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 <code>App.mjs<\/code> \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>Layout<\/code>, \u043a\u0443\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u044f\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: <code>Header<\/code>, <code>Agify<\/code> \u0438 <code>Footer<\/code>. \u0412\u0441\u0435 \u043a\u0440\u043e\u043c\u0435 <code>Agify<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u0439, \u0430 \u0441 <code>Agify<\/code> \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u044f \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Agify \u0438\u0437 \u043c\u043e\u0435\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e <a href=\"https:\/\/habr.com\/ru\/articles\/805127\/\" rel=\"noopener noreferrer nofollow\">Typescript Generics<\/a>. \u0422\u0430\u043a \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 React, \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 <a href=\"https:\/\/codesandbox.io\/p\/devbox\/typescript-generics-agify-czfn6f\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0443<\/a>. \u0410 \u0437\u0434\u0435\u0441\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>Agify<\/code>:<\/p>\n<pre><code class=\"javascript\">import { useState } from \"preact\/compat\"; import get from \"get\"; import html from \"..\/render.mjs\";  export const Agify = () => {   const [value, setValue] = useState(\"\");   const [age, setAge] = useState(\"\");   const [loading, setLoading] = useState(false);    const handleSubmit = (e) => {     e.preventDefault();     setLoading(true);     fetch(`https:\/\/api.agify.io?name=${value}`)       .then((res) => {         return res.json();       })       .then((data) => {         setAge(get(data, \"age\"));       })       .finally(() => {         setLoading(false);       });   };    const handleReset = () => {     setValue(\"\");     setAge(\"\");   };    return html`     &lt;div class=\"h-100 d-flex justify-content-center align-items-center agify\">       ${loading         ? html`             &lt;div               class=\"h-100 w-100 d-flex justify-content-center align-items-center agify-spinner-container\"             >               &lt;div class=\"spinner-border\" role=\"status\">                 &lt;span class=\"visually-hidden\">Loading...&lt;\/span>               &lt;\/div>             &lt;\/div>           `         : \"\"}       &lt;div class=\"w-50 d-flex flex-column gap-3 agify-content\">         &lt;h2 class=\"text-center agify-title\">           Estimate your age based on your first name         &lt;\/h2>         &lt;form class=\"agify-form\" onSubmit=${handleSubmit}>           &lt;div class=\"input-group mb-3\">             &lt;input               aria-describedby=\"button-addon2\"               aria-label=\"Enter your first name\"               class=\"form-control\"               onChange=${(e) => setValue(e.target.value)}               placeholder=\"Enter your first name\"               type=\"text\"               value=${value}             \/>             &lt;button               class=\"btn btn-outline-secondary\"               disabled=${!value}               type=\"submit\"               id=\"button-addon2\"             >               &lt;i class=\"bi bi-search\">&lt;\/i>             &lt;\/button>           &lt;\/div>           &lt;div             class=\"d-flex flex-column justify-content-center align-items-center gap-3 agify-result\"           >             &lt;h3 class=\"agify-result-title\">               Your age is:               ${age ? age : html`&lt;i class=\"bi bi-question-circle\">&lt;\/i>`}             &lt;\/h3>             &lt;button               class=\"btn btn-secondary\"               disabled=${!age}               type=\"button\"               onClick=${handleReset}             >               Reset             &lt;\/button>           &lt;\/div>         &lt;\/form>       &lt;\/div>     &lt;\/div>   `; };<\/code><\/pre>\n<p>Agify \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u043a\u0443\u0434\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0435 \u0438\u043c\u044f, \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0433\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u0442\u0435\u043a\u0441\u0442 \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0431\u0440\u043e\u0441\u0430. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. <\/p>\n<p>\u041d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e <code>preact<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u043e\u0433\u0438\u043c API React, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>useState<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430 html:<\/p>\n<pre><code class=\"javascript\">${age ? age : html`&lt;i class=\"bi bi-question-circle\">&lt;\/i>`}<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0432\u043e\u0434\u044f \u0438\u0442\u043e\u0433\u0438, \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e, \u043a\u0430\u043a \u0438 \u0432 2019, \u043a\u0430\u043a \u0438 \u0432 2022, \u0442\u0430\u043a \u0438 \u0432 2024 \u0433\u043e\u0434\u0443, \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0438\u043c \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u043c\u0430\u043b\u043e\u0433\u043e. \u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e + \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 ESM. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u044e\u0431\u043b\u044e Typescript, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e.<\/p>\n<p>\u041d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043c\u044b\u0441\u043b\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u043f\u0438\u0440\u0430\u043b\u0438. \u0418 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u0442\u043e\u043c\u0443, \u0441 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c. \u041e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043b\u0438.<\/p>\n<p>\u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0443\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f, \u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u043e\u0439 <a href=\"https:\/\/t.me\/denis_voronin_channel\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b<\/a>, \u0433\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u043e\u0440 \u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043c\u043e\u0439 <a href=\"https:\/\/www.youtube.com\/@denis.voronin\" rel=\"noopener noreferrer nofollow\">YouTube-\u043a\u0430\u043d\u0430\u043b<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/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\/articles\/825424\/\"> https:\/\/habr.com\/ru\/articles\/825424\/<\/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>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0430\u0441\u044c, \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u0445 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 <code>dependencies<\/code>, <code>devDependencies<\/code> \u0438 <code>peerDependencies<\/code> \u0432 <code>package.json<\/code>. \u042d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 \u0432 \u043c\u043e\u0435\u043c <a href=\"https:\/\/t.me\/denis_voronin_channel\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435<\/a>, \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0435\u0449\u0435 \u043d\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0442\u043e \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0436\u0435 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u043e\u0434\u043d\u0443 <a href=\"https:\/\/habr.com\/ru\/companies\/gazprombank\/articles\/725992\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0431\u044b\u043b\u0438 \u043c\u044b\u0441\u043b\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0443\u0441\u0432\u043e\u0438\u0442\u044c \u0442\u0435\u043c\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u0447\u0435\u0440\u0435\u0437 ES Modules. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0443 \u0430\u0432\u0442\u043e\u0440\u0430, \u043b\u0438\u0431\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 <a href=\"#dependencies-management-history\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435<\/a> \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0410 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u044b ESM \u0431\u0443\u0434\u0435\u0442 \u0432\u043e <a href=\"#dependencies-management-future\" rel=\"noopener noreferrer nofollow\">\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"dependencies-management-history\" id=\"dependencies-management-history\"><\/a><\/p>\n<h2>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/h2>\n<p>\u0412 \u0434\u0430\u043b\u0435\u043a\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0431\u044b\u043b\u0438, \u043d\u0435 \u0431\u044b\u043b\u043e NodeJS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 HTML \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u044d\u0433\u0430 <code>script<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"&lt;URL>\">&lt;\/script><\/code><\/pre>\n<p>\u041d\u0430 \u043c\u0435\u0441\u0442\u043e <code>&lt;URL><\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>js<\/code> \u0444\u0430\u0439\u043b. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Content_Delivery_Network\" rel=\"noopener noreferrer nofollow\">CDN<\/a>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/3.6.1\/jquery.min.js\">&lt;\/script><\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0441\u044f \u043d\u0430 CDN-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c. \u041d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0431\u044b\u043b \u0431\u043e\u043d\u0443\u0441 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0440\u043e\u0441\u0441-\u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 <a href=\"https:\/\/www.stefanjudis.com\/notes\/say-goodbye-to-resource-caching-across-sites-and-domains\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e<\/a> \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430 \u0441\u0432\u0435\u0442 \u0432\u044b\u0448\u0435\u043b <a href=\"https:\/\/bower.io\/\" rel=\"noopener noreferrer nofollow\">Bower<\/a> &#8212; \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0441 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c &#8212;<code>bower.json<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"json\">{   \"name\": \"my-app\",   \"dependencies\": {     \"react\": \"^16.1.0\"   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>bower install<\/code> \u0438 Bower \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 <code>dependencies<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0442\u0438\u043f\u0443 <a href=\"https:\/\/gruntjs.com\/\" rel=\"noopener noreferrer nofollow\">Grunt<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/gulpjs.com\/\" rel=\"noopener noreferrer nofollow\">Gulp<\/a>, \u0442\u0430\u043a \u0438 \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435, \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0433 <code>script<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;script src=\"bower_components\/jquery\/dist\/jquery.min.js\">&lt;\/script><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Bower \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0448\u043b\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438. \u0422\u0430\u043a \u043a\u0430\u043a Bower \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/semver.org\/lang\/ru\/\" rel=\"noopener noreferrer nofollow\">SemVer<\/a> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/501198\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u0432 \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d, \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f (resolution) \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Bower \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u043b\u044e dependencies, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>\u0422\u0443\u0442 \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e <code>dependencies<\/code> \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Bower \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0438 \u043f\u043e\u043b\u0435 <code>devDependencies<\/code>. \u041f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 dev \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442.\u043f. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044f\u043c\u044b\u0435 <code>devDependencies<\/code>, \u0430 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 devDependencies<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 Bower \u0432\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 Bower<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0440\u0438\u0441\u043a \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0434\u0435\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0442\u043e Bower \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u043b\u0435\u0447\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0438\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0435 <code>resolutions<\/code>:<\/p>\n<pre><code class=\"json\">{   \"resolutions\": {     \"library-d\": \"2.0.0\"   } } <\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u043b\u0430 \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0448\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0418 \u043f\u0440\u0438\u0448\u043b\u043e \u043e\u043d\u043e \u0438\u0437 <a href=\"https:\/\/nodejs.org\/en\" rel=\"noopener noreferrer nofollow\">NodeJS<\/a>, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0441\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 &#8212; <a href=\"https:\/\/www.npmjs.com\/\" rel=\"noopener noreferrer nofollow\">NPM<\/a>.<\/p>\n<p>NPM \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u043c\u0435\u043b <code>nested<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>node_modules<\/code>, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0435\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 NPM 1 \u0438 2 \u0432\u0435\u0440\u0441\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u0443\u0431\u043b\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0431\u0435\u0437\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u0435\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>node_modules<\/code> \u043c\u043e\u0433 \u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430<a href=\"https:\/\/stackoverflow.com\/questions\/26155135\/node-npm-windows-file-paths-are-too-long-to-install-packages\" rel=\"noopener noreferrer nofollow\"> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u043f\u0443\u0442\u0435\u0439 \u043d\u0430 Windows<\/a>.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 NPM 3 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 <code>hoisted<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u0432\u0435\u0440\u0441\u0438\u0439, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <code>node_modules<\/code> \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u0433\u0434\u0435 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u043e \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\u043c \u0438\u0437 NPM 3<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e NodeJS \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>node_modules<\/code> \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442\u00bb.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 NodeJS<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0448\u043b\u0430 \u0440\u0435\u0447\u044c \u043e Bower \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b dependencies \u0438 devDependencies, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0432 NPM. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 NPM \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0440\u044f\u0434 \u043f\u043e\u043b\u0435\u0439 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/gazprombank\/articles\/725992\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u0447\u0442\u043e \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0438 \u0435\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/545008\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0431\u0435\u0433\u0443\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e. \u041a <code>dependencies<\/code> \u0438 <code>devDependencies<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#peerdependencies\" rel=\"noopener noreferrer nofollow\">peerDependencies<\/a> &#8212; \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u044d\u0442\u043e <code>react-dom<\/code> &#8212; \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 DOM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>react<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c <code>react-dom<\/code> \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044f\u0432\u043d\u043e, \u0447\u0442\u043e \u0435\u0439 \u043d\u0443\u0436\u0435\u043d <code>react<\/code>, \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443?  React \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445. \u0414\u043b\u044f front end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 <code>react<\/code> \u0438 <code>react-dom<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>react-dom<\/code> \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0430 \u043d\u0443\u0436\u0435\u043d <code>react-native<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c peerDependencies \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0432\u044f\u0437\u044c, \u043d\u043e \u043d\u0435 \u0436\u0435\u0441\u0442\u043a\u043e, \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0443\u0436\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#bundledependencies\" rel=\"noopener noreferrer nofollow\">bundledDependencies<\/a> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u00a0<code>npm pack<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0430\u0448\u0443 \u043f\u0430\u043f\u043a\u0443 \u0432 \u0442\u0430\u0440\u0431\u043e\u043b (tarball-\u0444\u0430\u0439\u043b). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0434\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442 \u0438\u0445.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#optionaldependencies\" rel=\"noopener noreferrer nofollow\">optionalDependencies<\/a> &#8212; \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 CI\/CD \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e <code>peerDependencies<\/code> \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. NPM 7 \u0438 \u0432\u044b\u0448\u0435 \u0443\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 <code>peerDependencies<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0443\u043f\u0430\u0434\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Storybook 6-\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 React 18:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 peerDependencies<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0<code>--force<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>--legacy-peer-deps<\/code>, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u0442\u043e NPM \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u043e NPM 7, \u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u0441 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 NPM \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Bower \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-json#overrides\" rel=\"noopener noreferrer nofollow\">overrides<\/a>, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<pre><code class=\"json\">{   \"dependencies\": {     \"react\": \"18.2.0\"   },   \"devDependencies\": {     \"@storybook\/react\": \"6.3.13\"   },   \"overrides\": {     \"@storybook\/react\": {       \"react\": \"18.2.0\"     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435  <code>peerDependencies<\/code>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>react-dom<\/code> <code>react<\/code> \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439). \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043d\u0435\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u044e\u0447\u0435, \u0430 \u0441 \u043d\u0435\u0439 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0445\u043e\u0441\u0442-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 <code>package.json<\/code> \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0435 <code>peerDependenciesMeta<\/code>:<\/p>\n<pre><code class=\"json\">{   \"peerDependencies\": {     \"react\": \">= 16\"   },   \"peerDependenciesMeta\": {     \"react\": {       \"optional\": true     }   } }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e NPM \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0435\u0441\u043e\u043c\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438: <a href=\"https:\/\/yarnpkg.com\/\" rel=\"noopener noreferrer nofollow\">Yarn<\/a> \u0438 <a href=\"https:\/\/pnpm.io\/\" rel=\"noopener noreferrer nofollow\">PNPM<\/a>. \u041e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u043b\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0438 \u043f\u043e\u0434\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438 \u0442\u043e\u0442 \u0436\u0435 NPM \u043a \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Yarn \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0436\u043e\u0440\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043e\u0434\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043f\u0440\u043e\u0434 \u0432\u044b\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b Yarn \u0434\u043e\u0431\u0430\u0432\u0438\u043b <a href=\"https:\/\/classic.yarnpkg.com\/lang\/en\/docs\/yarn-lock\" rel=\"noopener noreferrer nofollow\">lock-\u0444\u0430\u0439\u043b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>yarn.lock<\/code>, Yarn \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u0430\u043f \u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u0430\u043f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 yarn.lock<\/figcaption><\/div>\n<\/figure>\n<p>NPM \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u0432\u043e\u0439 <a href=\"https:\/\/docs.npmjs.com\/cli\/v10\/configuring-npm\/package-lock-json\" rel=\"noopener noreferrer nofollow\">lock-\u0444\u0430\u0439\u043b<\/a>, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>npm ci<\/code>.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 Yarn \u0443\u0441\u043a\u043e\u0440\u0438\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Yarn Cache<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c PNPM \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0448\u0438\u043b \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 <\/p>\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-380276","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380276","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=380276"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380276\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=380276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=380276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=380276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}