{"id":325320,"date":"2021-06-22T21:00:19","date_gmt":"2021-06-22T21:00:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=325320"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=325320","title":{"rendered":"\u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/563568\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tf\/3w\/ms\/tf3wmseehxw3r2srqx3jypde49e.png\"><\/div>\n<p><\/a><\/p>\n<blockquote><p><i>\u00ab\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c, \u0447\u0442\u043e \u043b\u044e\u0434\u0438 \u043a\u0430\u043a \u0431\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u0437\u0435\u043c\u043d\u043e\u043c \u0436\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043f\u0435\u0449\u0435\u0440\u044b, \u0433\u0434\u0435 \u0432\u043e \u0432\u0441\u044e \u0435\u0451 \u0434\u043b\u0438\u043d\u0443 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u043f\u0440\u043e\u0441\u0432\u0435\u0442. \u0421 \u043c\u0430\u043b\u044b\u0445 \u043b\u0435\u0442 \u0443 \u043d\u0438\u0445 \u043d\u0430 \u043d\u043e\u0433\u0430\u0445 \u0438 \u043d\u0430 \u0448\u0435\u0435 \u043e\u043a\u043e\u0432\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0434\u044f\u043c \u043d\u0435 \u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430, \u0438 \u0432\u0438\u0434\u044f\u0442 \u043e\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0438\u0431\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u043d\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437-\u0437\u0430 \u044d\u0442\u0438\u0445 \u043e\u043a\u043e\u0432.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<p>\u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043d\u0435 \u043f\u0438\u0448\u0443\u0442 \u0441 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u043e\u0434 (\u0434\u0430\u043b\u0435\u0435\u00a0<b><font color=\"#3AC1EF\">\u043a\u043e\u0434\u043c\u043e\u0434<\/font><\/b>, \u043e\u0442 \u0441\u043b\u043e\u0432\u00a0<b><font color=\"#3AC1EF\">\u043a\u043e\u0434<\/font><\/b>\u00a0\u0438\u00a0<b><font color=\"#3AC1EF\">\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/font><\/b><i>\u00a0&#8212;\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/i>) \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u0445\u0438\u0442\u0440\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432 \u043d\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u043c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B8%D1%84_%D0%BE_%D0%BF%D0%B5%D1%89%D0%B5%D1%80%D0%B5\">\u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u041f\u043b\u0430\u0442\u043e\u043d\u0430<\/a>, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043a\u043e \u043c\u043d\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/504594\/\">\u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f<\/a>, \u0438 \u043c\u043e\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b.<\/p>\n<p>  \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u00a0<a href=\"https:\/\/nodejs.org\/api\/esm.html#esm_loaders\">loader<\/a>\u00a0<a href=\"https:\/\/github.com\/coderaiser\/estrace\">ESTrace<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ib\/zk\/rl\/ibzkrl_29jelaqtue8qc4lbvahu.png\"><\/div>\n<p>  \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441:<a name=\"habracut\"><\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u258d\u0421\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438<\/font><\/h2>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u041b\u044e\u0434\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u044b \u0441\u043f\u0438\u043d\u043e\u0439 \u043a \u0441\u0432\u0435\u0442\u0443, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443 \u043e\u0442 \u043e\u0433\u043d\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0440\u0438\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u0432 \u0432\u044b\u0448\u0438\u043d\u0435, \u0430 \u043c\u0435\u0436\u0434\u0443 \u043e\u0433\u043d\u0451\u043c \u0438 \u0443\u0437\u043d\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0434\u043e\u0440\u043e\u0433\u0430, \u043e\u0433\u0440\u0430\u0436\u0434\u0451\u043d\u043d\u0430\u044f \u043d\u0435\u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043d\u043e\u0439 \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0439 \u0448\u0438\u0440\u043c\u044b, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u043e\u043a\u0443\u0441\u043d\u0438\u043a\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u0448\u0438\u0440\u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u0443\u043a\u043e\u043b.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<blockquote><p>\u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u00a0<b><font color=\"#3AC1EF\">console.log(&#8216;function name&#8217;, arguments)<\/font><\/b> \u043c\u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e.<\/p><\/blockquote>\n<p>  \u0423\u0437\u043b\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u00a0<a href=\"https:\/\/github.com\/babel\/babel\/blob\/main\/packages\/babel-parser\/ast\/spec.md\">Babel AST<\/a>\u00a0\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<p>  <b><font color=\"#3AC1EF\"> \u2014 <\/font><\/b><b><font color=\"#3AC1EF\">FunctionDeclaration<\/font><\/b> \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<pre><code class=\"javascript\">function hello() {     return 'world'; } <\/code><\/pre>\n<p>   <b><font color=\"#3AC1EF\"> \u2014 <\/font><\/b><b><font color=\"#3AC1EF\">FunctionExpression<\/font><\/b> \u2014 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/p>\n<pre><code class=\"javascript\">hello(function(word) {     return `hello ${word}`; }); <\/code><\/pre>\n<p>   <b><font color=\"#3AC1EF\"> \u2014 <\/font><\/b><b><font color=\"#3AC1EF\">ArrowFunctionExpression<\/font><\/b>\u00a0&#8212; \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/p>\n<pre><code class=\"javascript\">hello((word) =&gt; {     return `hello ${word}`; }); <\/code><\/pre>\n<p>   <b><font color=\"#3AC1EF\"> \u2014 <\/font><\/b><b><font color=\"#3AC1EF\">ClassMethod<\/font><\/b>\u00a0&#8212; \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430<\/p>\n<pre><code class=\"javascript\">class Hello {     hello(word) {         return `hello ${word}`;     } }<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<b><font color=\"#3AC1EF\">Function<\/font><\/b>, \u043e\u043d \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.<\/p>\n<p>  \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/coderaiser\/putout\/tree\/master\/packages\/engine-runner#includer\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c<\/a>\u00a0\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li><b><font color=\"#3AC1EF\">include<\/font><\/b>, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c;<\/li>\n<li><b><font color=\"#3AC1EF\">fix<\/font><\/b>, \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430;<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<pre><code class=\"javascript\">module.exports.include = () =&gt; [     'Function', ];<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0437\u043b\u044b \u0431\u0443\u0434\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<a href=\"https:\/\/babeljs.io\/docs\/en\/babel-template\">@babel\/template<\/a>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"javascript\">const {template} = require('putout'); \/\/ \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0437\u0435\u043b const buildLog = template(`console.log('NAME', arguments)`);  module.exports.fix = (path) =&gt; {     const {body} = path.node.body;     const NAME = path.node.id.name;          \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u00abconsole.log\u00bb     body.unshift(buildLog({         NAME,     })); };<\/code><\/pre>\n<p>  \u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438, \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0432 \u0440\u0430\u0437\u0431\u043e\u0440 \u0438\u043c\u0435\u043d\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0430\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">const {template} = require('putout'); \/\/ \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0437\u0435\u043b const buildLog = template(`console.log('NAME', arguments)`);  \/\/ \u0443\u0437\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0449\u0435\u043c module.exports.include = () =&gt; [     'Function', ];  module.exports.fix = (path) =&gt; {     const {body} = path.node.body;     const NAME = getName(path);          \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &quot;console.log&quot;     body.unshift(buildLog({         NAME,     })); };  \/\/ \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043c\u044f \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043b\u043e\u0433\u0430\u0445 function getName(path) {     if (path.isClassMethod())         return path.node.key.name;          if (path.isFunctionDeclaration())         return path.node.id.name;          return '&lt;undetermined&gt;'; }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <u>\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0430\u044f):<\/u><\/p>\n<p>  <a href=\"https:\/\/user-images.githubusercontent.com\/1573141\/121025899-51782f80-c7ae-11eb-900a-d54c50843116.png\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b2a\/c25\/dad\/b2ac25dad5090e90d4024581365a994a.png\"><\/div>\n<p><\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u258d\u0412\u043d\u043e\u0441\u0438\u043c\u00a0<s>\u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0443<\/s>\u00a0\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f<\/font><\/h2>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u0417\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0435\u043d\u043e\u0439 \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u043d\u0435\u0441\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0443\u0442\u0432\u0430\u0440\u044c, \u0434\u0435\u0440\u0436\u0430 \u0435\u0451 \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u0438\u0434\u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0442\u0435\u043d\u044b; \u043f\u0440\u043e\u043d\u043e\u0441\u044f\u0442 \u043e\u043d\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0438, \u0438 \u0432\u0441\u044f\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0436\u0438\u0432\u044b\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043c\u043d\u044f \u0438 \u0434\u0435\u0440\u0435\u0432\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u043e\u0434\u043d\u0438 \u0438\u0437 \u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e\u0442, \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u043b\u0447\u0430\u0442.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<blockquote><p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e!  <\/p>\n<hr>\n<p><b><font color=\"#3AC1EF\">\u2752 <\/font><\/b>\u0415\u0449\u0435 \u044f \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043d\u0435\u0435, \u043c\u0435\u043d\u044f\u044f:<\/p>\n<pre><code class=\"javascript\">function X() {   console.log('hello') }<\/code><\/pre>\n<p>  \u043d\u0430<\/p>\n<pre><code class=\"javascript\">function X() {  console.log('enter X')  try {    console.log('hello')  } finally {    console.log('exit X')  } }<\/code><\/pre>\n<p>  <b><font color=\"#3AC1EF\">\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043f\u043e\u043c\u043e\u0449\u0438.<\/font><\/b><\/p>\n<hr>\n<p>  <\/p><\/blockquote>\n<p>  \u0414\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0440\u043e\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">const enterLog = buildLogEvent(name, '&#128163;'); \/\/ \u0432\u0445\u043e\u0434 const exitLog = buildLogEvent(name, '&#128165;');  \/\/ \u0432\u044b\u0445\u043e\u0434 const errorLog = buildLogEvent(name, '&#10060;'); \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 <\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0437\u0435\u043b\u00a0<b><font color=\"#3AC1EF\">try-catch<\/font><\/b>:<\/p>\n<pre><code class=\"javascript\">const buildTryCatch = template(`try {         BLOCK;     } catch(error) {         CATCH;     } finally {         FINALLY;     } `);      \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 try-catch const bodyPath = path.get('body'); replaceWith(bodyPath, BlockStatement([buildTryCatch({     BLOCK: path.node.body.body,     CATCH: errorLog,     FINALLY: exitLog, })]));<\/code><\/pre>\n<p>  \u0421\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u043e\u0433 \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Functions\/arguments\">\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u043d\u0435 \u043e\u0431\u044a\u0435\u043a\u0442<\/a>:<\/p>\n<pre><code class=\"javascript\">const buildLog = template('console.log(`${\u00abTYPE\u00bb} ${\u00abNAME\u00bb}`, Array.from(arguments));');<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">const {template, types, operator} = require('putout'); const {replaceWith} = operator; const {BlockStatement} = types;  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u0437\u043b\u044b const buildLog = template('console.log(`${&quot;TYPE&quot;} ${&quot;NAME&quot;}`, Array.from(arguments));');  const buildTryCatch = template(`try {         BLOCK;     } catch(error) {         CATCH;     } finally {         FINALLY;     } `);  \/\/ \u0443\u0437\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0449\u0435\u043c module.exports.include = () =&gt; [     'Function', ];  module.exports.fix = (path) =&gt; {     const name = getName(path);          \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c 3 \u0432\u0438\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439     const enterLog = buildLogEvent(name, '&#128163;');     const exitLog = buildLogEvent(name, '&#128165;');     const errorLog = buildLogEvent(name, '&#10060;');              \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 try-catch     const bodyPath = path.get('body');     replaceWith(bodyPath, BlockStatement([buildTryCatch({         BLOCK: path.node.body.body,         CATCH: errorLog,         FINALLY: exitLog,     })]));          \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &quot;console.log&quot; \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c &quot;enter&quot;     bodyPath.node.body.unshift(enterLog); };   \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043b\u043e\u0433\u0430\u0445 function getName(path) {     if (path.isClassMethod())         return path.node.key.name;          if (path.isFunctionDeclaration())         return path.node.id.name;          return '&lt;undetermined&gt;'; }  \/\/ \u0441\u0442\u0440\u043e\u0438\u043c \u043b\u043e\u0433\u0435\u0440 function buildLogEvent(name, type) {         return buildLog({         NAME: name,         TYPE: type,     }); }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <u>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0430\u044f):<\/u><\/p>\n<p>  <a href=\"https:\/\/user-images.githubusercontent.com\/1573141\/122596829-207fe080-d073-11eb-90b6-9bd21d8fa6fb.png\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/195\/120\/054\/195120054ff11f5b8a737b8ba8f1c0f8.png\"><\/div>\n<p>  <\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u258dCatch \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/font><\/h2>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0435 \u0442\u044b \u0434\u0443\u043c\u0430\u0435\u0448\u044c, \u0447\u0442\u043e, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043b\u044e\u0434\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0438\u0434\u044f\u0442, \u0441\u0432\u043e\u0451 \u043b\u0438 \u0438\u043b\u0438 \u0447\u0443\u0436\u043e\u0435, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043d\u0435\u0439, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u0433\u043d\u0451\u043c \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0441\u0442\u0435\u043d\u0443 \u043f\u0435\u0449\u0435\u0440\u044b?<br \/>  \u2014 \u041a\u0430\u043a \u0436\u0435 \u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u043e\u0435, \u0440\u0430\u0437 \u0432\u0441\u044e \u0441\u0432\u043e\u044e \u0436\u0438\u0437\u043d\u044c \u043e\u043d\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e?<br \/>  \u2014 \u0410 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043d\u043e\u0441\u044f\u0442 \u0442\u0430\u043c, \u0437\u0430 \u0441\u0442\u0435\u043d\u043e\u0439? \u041d\u0435 \u0442\u043e \u0436\u0435 \u043b\u0438 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u0441 \u043d\u0438\u043c\u0438?<br \/>  \u2014 \u0422\u043e \u0435\u0441\u0442\u044c?<br \/>  \u2014 \u0415\u0441\u043b\u0438 \u0431\u044b \u0443\u0437\u043d\u0438\u043a\u0438 \u0431\u044b\u043b\u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0437\u0432\u0435, \u0434\u0443\u043c\u0430\u0435\u0448\u044c \u0442\u044b, \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0431\u044b \u043e\u043d\u0438, \u0447\u0442\u043e \u0434\u0430\u044e\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u0438\u0434\u044f\u0442?<br \/>  \u2014 \u041d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<blockquote><p><b><font color=\"#3AC1EF\">\u2752 Catch <\/font><\/b>\u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<br \/>  \u0410 \u0435\u0449\u0435 \u0443 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u0442 \u0438\u043c\u0435\u043d, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435?<\/p><\/blockquote>\n<p>  \u0414\u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430\u00a0<b><font color=\"#3AC1EF\">path<\/font><\/b>\u00a0\u0435\u0441\u0442\u044c\u00a0<b><font color=\"#3AC1EF\">node<\/font><\/b>, \u0430 \u0443 \u043d\u0435\u0433\u043e\u00a0<b><font color=\"#3AC1EF\">loc<\/font><\/b>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u00a0<b><font color=\"#3AC1EF\">start<\/font><\/b>. \u0418\u0437\u00a0<b><font color=\"#3AC1EF\">start<\/font><\/b>\u00a0\u0434\u043e\u0441\u0442\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438\u00a0<b><font color=\"#3AC1EF\"> line<\/font><\/b>:<\/p>\n<pre><code class=\"javascript\">function getName(path) {      const {line} = path.node.loc.start;     return `&lt;anonymous:${line}&gt;`; }<\/code><\/pre>\n<p>  \u0410 \u0435\u0449\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 <b><font color=\"#3AC1EF\"> \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/font><\/b> + <b><font color=\"#3AC1EF\"> \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/b>:<\/p>\n<pre><code class=\"javascript\"> const buildLogException = template('console.log(`${\u00abTYPE\u00bb} ${\u00abNAME\u00bb}: ${traceError.message}`); throw traceError');  function buildLogExceptionEvent(name) {         return buildLogException({         NAME: name,         TYPE: '',     }); } <\/code><\/pre>\n<p>  \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0430\u0435\u043c <b><font color=\"#3AC1EF\"> buildLog<\/font><\/b> \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c:<\/p>\n<pre><code class=\"javascript\">const buildLog = template('console.log(`${&quot;TYPE&quot;} ${&quot;NAME&quot;}`)');<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">const {template, types, operator} = require('putout'); const {replaceWith} = operator; const {BlockStatement} = types;  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u0437\u043b\u044b const buildLog = template('console.log(`${&quot;TYPE&quot;} ${&quot;NAME&quot;}`)'); const buildLogEnter = template('console.log(`'&#128163;' ${&quot;NAME&quot;}`, Array.from(arguments));'); const buildLogException = template('console.log(`${&quot;TYPE&quot;} ${&quot;NAME&quot;}: ${traceError.message}`); throw traceError');  const buildTryCatch = template(`try {         BLOCK;     } catch(traceError) {         CATCH;     } finally {         FINALLY;     } `);  \/\/ \u0443\u0437\u043b\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0449\u0435\u043c module.exports.include = () =&gt; [     'Function', ];  \/\/ \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c module.exports.fix = (path) =&gt; {     const name = getFunctionName(path);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c 3 \u0432\u0438\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439     const enterLog = buildLogEnter({         NAME: name,     });     const exitLog = buildLogEvent(name, '&#128165;');     const errorLog = buildLogExceptionEvent(name);      \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 try-catch     const bodyPath = path.get('body');     replaceWith(bodyPath, BlockStatement([buildTryCatch({         BLOCK: path.node.body.body,         CATCH: errorLog,         FINALLY: exitLog,     })]));      \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043b\u043e\u0433 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438     bodyPath.node.body.unshift(enterLog); };   function getFunctionName(path) {     if (path.isClassMethod())         return path.node.key.name;      if (path.isFunctionDeclaration())         return path.node.id.name;      const {line} = path.node.loc.start;     return `&lt;anonymous:${line}&gt;`; }  function buildLogEvent(name, type) {         return buildLog({         NAME: name,         TYPE: type,     }); }  function buildLogExceptionEvent(name) {         return buildLogException({         NAME: name,         TYPE: '&#10060;'',     }); }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <u>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0430\u044f):<\/u><\/p>\n<p>  <a href=\"https:\/\/user-images.githubusercontent.com\/1573141\/122597847-a4869800-d074-11eb-9e17-71e9979f6843.png\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/069\/756\/682\/06975668213e175684232b228e74fd15.png\"><\/div>\n<p>  <\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u258d\u0412\u044b\u0434\u043e\u0445<\/font><\/h2>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u041a\u043e\u0433\u0434\u0430 \u0441 \u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437 \u043d\u0438\u0445 \u0441\u043d\u0438\u043c\u0443\u0442 \u043e\u043a\u043e\u0432\u044b, \u0437\u0430\u0441\u0442\u0430\u0432\u044f\u0442 \u0435\u0433\u043e \u0432\u0434\u0440\u0443\u0433 \u0432\u0441\u0442\u0430\u0442\u044c, \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0448\u0435\u044e, \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c, \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445 \u2014 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u0432\u0435\u0442\u0430, \u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043c\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e, \u043e\u043d \u043d\u0435 \u0432 \u0441\u0438\u043b\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438 \u044f\u0440\u043a\u043e\u043c \u0441\u0438\u044f\u043d\u0438\u0438 \u043d\u0430 \u0442\u0435 \u0432\u0435\u0449\u0438, \u0442\u0435\u043d\u044c \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d \u0432\u0438\u0434\u0435\u043b \u0440\u0430\u043d\u044c\u0448\u0435. \u0418 \u043a\u0430\u043a \u0442\u044b \u0434\u0443\u043c\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043a\u0430\u0436\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0435\u043c\u0443 \u043d\u0430\u0447\u043d\u0443\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u043d \u0432\u0438\u0434\u0435\u043b \u043f\u0443\u0441\u0442\u044f\u043a\u0438, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0432\u0448\u0438\u0441\u044c \u043a \u0431\u044b\u0442\u0438\u044e \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u043c\u0443, \u043e\u043d \u043c\u043e\u0433 \u0431\u044b \u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434? \u0414\u0430 \u0435\u0449\u0451 \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c \u0432\u0435\u0449\u044c \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u044f\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435? \u041d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0448\u044c \u043b\u0438 \u0442\u044b, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0435\u0433\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442 \u0438 \u043e\u043d \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u0442, \u0431\u0443\u0434\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0430\u0432\u0434\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0432\u0438\u0434\u0435\u043b \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c?<br \/>  \u2014 \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043d \u0442\u0430\u043a \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u0442.<br \/>  \u2014 \u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u0441\u0432\u0435\u0442, \u0440\u0430\u0437\u0432\u0435 \u043d\u0435 \u0437\u0430\u0431\u043e\u043b\u044f\u0442 \u0443 \u043d\u0435\u0433\u043e \u0433\u043b\u0430\u0437\u0430, \u0438 \u043d\u0435 \u043e\u0442\u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u043e\u043d \u043f\u043e\u0441\u043f\u0435\u0448\u043d\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u0432 \u0441\u0438\u043b\u0430\u0445 \u0432\u0438\u0434\u0435\u0442\u044c, \u0441\u0447\u0438\u0442\u0430\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u0435\u0435 \u0442\u0435\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442?<br \/>  \u2014 \u0414\u0430, \u044d\u0442\u043e \u0442\u0430\u043a.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<p>\u041f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b\u00a0\u043a\u043e\u0434\u043c\u043e\u0434\u044b\u00a0\u0438 \u0441\u0442\u0430\u0442\u044c\u044e, \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0434\u0435\u044e \u0442\u0440\u0435\u0439\u0441\u0435\u0440\u0430 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0442\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u00a0<a href=\"https:\/\/github.com\/coderaiser\/estrace\">ESTrace<\/a>. \u041e\u043d \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00a0<a href=\"https:\/\/github.com\/ValYouW\/njsTrace\">njsTrace<\/a>\u00a0\u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0<a href=\"https:\/\/nodejs.org\/api\/esm.html\">EcmaScript \u041c\u043e\u0434\u0443\u043b\u044f\u043c\u0438<\/a>\u00a0\u0438 \u043d\u0430 100% \u043f\u043e\u043a\u0440\u044b\u0442 \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f:<\/p>\n<pre><code class=\"bash\">npm i estrace<\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442:\u00a0<b><font color=\"#3AC1EF\">ESTrace<\/font><\/b>\u00a0\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0432\u043e\u043a\u0440\u0443\u0433\u00a0<a href=\"https:\/\/nodejs.org\/api\/esm.html#esm_loaders\">\u0445\u0443\u043a\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/a>, \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u044f \u0443\u0436\u0435 \u0441 \u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u0430\u043d\u0430\u043b\u043e\u0433\u00a0<a href=\"https:\/\/www.npmjs.com\/package\/mock-require\">mock-require<\/a>\u00a0\u0442\u043e\u043b\u044c\u043a\u043e\u00a0<a href=\"https:\/\/www.npmjs.com\/package\/mock-import\">\u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432<\/a>\u00a0\u0438 \u0432\u0441\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u043e \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441 <b><font color=\"#3AC1EF\">EcmaScript \u041c\u043e\u0434\u0443\u043b\u044f\u043c\u0438<\/font><\/b>.  <\/p>\n<blockquote><p>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043b\u043e\u0430\u0434\u0435\u0440\u044b?<\/p><\/blockquote>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043b\u043e\u0430\u0434\u0435\u0440 <a href=\"https:\/\/nodejs.org\/api\/esm.html#esm_transformsource_source_context_defaulttransformsource\">transformSource<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043b\u0435\u0442\u0443 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">export async function transformSource(source, context) {     const {url} = context;          \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u043b\u0435\u0436\u043a\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430     const code = await trace({         source: source.toString(),         url,     });          \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u0434     return {         source: code,     }; }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0410 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ESTrace \u043a\u0430\u043a \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f Putout?<\/p><\/blockquote>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, <b><font color=\"#3AC1EF\">ESTrace<\/font><\/b> \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 <a href=\"https:\/\/github.com\/coderaiser\/putout\">putout<\/a> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:<\/p>\n<pre><code class=\"javascript\">import putout from 'putout'; import estracePlugin from 'estrace\/plugin';  const source = `     const fn = (a) =&gt; a; `;  const {code} = putout(source, {     plugins: [         ['estrace', estracePlugin],     ], });  console.log(code); <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u00a0<a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/562226\/\">\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a>, \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0444\u0430\u0439\u043b\u00a0<b><font color=\"#3AC1EF\">lint.js<\/font><\/b>:<\/p>\n<pre><code class=\"javascript\">const processFile = (a) =&gt; a; process([]);  function process(runners) {     const files = getFiles(runners);     const linted = lintFiles(files);          return linted; }  function getFiles(runners) {     const files = [];          for (const run of runners) {         files.push(...run());     }          return files; }  function lintFiles(files) {     const linted = [];          for (const file of files) {         linted.push(processFile(file));     }         return linted; }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ib\/zk\/rl\/ibzkrl_29jelaqtue8qc4lbvahu.png\"><\/div>\n<blockquote><p>\u042d\u0442\u043e \u0441\u0443\u043f\u0435\u0440 \u043a\u0440\u0443\u0442\u043e! \u0423 \u043c\u0435\u043d\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u0442\u0430\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u043e\u0433\u043e\u0432.  <\/p><\/blockquote>\n<p>  <b><font color=\"#3AC1EF\">\u2752 \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438:<\/font><\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/coderaiser\/putout\/issues\/61\">\u0438\u0448\u044c\u044e<\/a><\/li>\n<li><a href=\"https:\/\/www.redbubble.com\/i\/sticker\/pixel-kitteh-by-skramzgirl\/56511620.EJUG5\">\u043a\u043e\u0442<\/a><\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/ruvds.com\/news\/read\/142?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=mn3m0n1c_3n3m1&amp;utm_content=kogda_kod_eto_dannye\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" width=\"100%\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fd2\/b54\/bc3\/fd2b54bc3722efda2cfd8dc052376907.jpg\"><\/div>\n<p><\/a><br \/>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=mn3m0n1c_3n3m1&amp;utm_content=kogda_kod_eto_dannye\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"><\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/563568\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/563568\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/563568\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tf\/3w\/ms\/tf3wmseehxw3r2srqx3jypde49e.png\"><\/div>\n<p><\/a><\/p>\n<blockquote><p><i>\u00ab\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c, \u0447\u0442\u043e \u043b\u044e\u0434\u0438 \u043a\u0430\u043a \u0431\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u0437\u0435\u043c\u043d\u043e\u043c \u0436\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043f\u0435\u0449\u0435\u0440\u044b, \u0433\u0434\u0435 \u0432\u043e \u0432\u0441\u044e \u0435\u0451 \u0434\u043b\u0438\u043d\u0443 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u043f\u0440\u043e\u0441\u0432\u0435\u0442. \u0421 \u043c\u0430\u043b\u044b\u0445 \u043b\u0435\u0442 \u0443 \u043d\u0438\u0445 \u043d\u0430 \u043d\u043e\u0433\u0430\u0445 \u0438 \u043d\u0430 \u0448\u0435\u0435 \u043e\u043a\u043e\u0432\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0434\u044f\u043c \u043d\u0435 \u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430, \u0438 \u0432\u0438\u0434\u044f\u0442 \u043e\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438, \u0438\u0431\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u043d\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437-\u0437\u0430 \u044d\u0442\u0438\u0445 \u043e\u043a\u043e\u0432.\u00bb<\/p>\n<p>  &copy; \u041f\u043b\u0430\u0442\u043e\u043d \u00ab\u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e\u00bb, \u043a\u043d\u0438\u0433\u0430 7: \u041c\u0438\u0444 \u041e \u041f\u0435\u0449\u0435\u0440\u0435<\/i><\/p><\/blockquote>\n<p>\u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043d\u0435 \u043f\u0438\u0448\u0443\u0442 \u0441 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u043e\u0434 (\u0434\u0430\u043b\u0435\u0435\u00a0<b><font color=\"#3AC1EF\">\u043a\u043e\u0434\u043c\u043e\u0434<\/font><\/b>, \u043e\u0442 \u0441\u043b\u043e\u0432\u00a0<b><font color=\"#3AC1EF\">\u043a\u043e\u0434<\/font><\/b>\u00a0\u0438\u00a0<b><font color=\"#3AC1EF\">\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/font><\/b><i>\u00a0&#8212;\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/i>) \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u0445\u0438\u0442\u0440\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432 \u043d\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u043c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B8%D1%84_%D0%BE_%D0%BF%D0%B5%D1%89%D0%B5%D1%80%D0%B5\">\u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u041f\u043b\u0430\u0442\u043e\u043d\u0430<\/a>, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043a\u043e \u043c\u043d\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/504594\/\">\u043b\u0438\u043d\u0442\u0435\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f<\/a>, \u0438 \u043c\u043e\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b.<\/p>\n<p>  \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u00a0<a href=\"https:\/\/nodejs.org\/api\/esm.html#esm_loaders\">loader<\/a>\u00a0<a href=\"https:\/\/github.com\/coderaiser\/estrace\">ESTrace<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ib\/zk\/rl\/ibzkrl_29jelaqtue8qc4lbvahu.png\"><\/div>\n<p>  \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441:<\/p>\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-325320","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325320","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=325320"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325320\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=325320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=325320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=325320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}