{"id":481322,"date":"2026-05-27T22:35:58","date_gmt":"2026-05-27T22:35:58","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481322"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481322","title":{"rendered":"\u041a\u0430\u043a \u044f 8 \u0434\u043d\u0435\u0439 \u043b\u043e\u0432\u0438\u043b \u0443\u0442\u0435\u0447\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 Nuxt 3 SSR, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u043b"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a 8 \u0434\u043d\u0435\u0439 \u043b\u043e\u0432\u0438\u043b \u0443\u0442\u0435\u0447\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u043b, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0448\u0438\u0431\u0430\u043b\u0441\u044f. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0438\u043a\u0441 \u0431\u044b\u043b \u043d\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435, \u0430 \u0432 \u043f\u0430\u0442\u0447\u0435 Vue, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u0430\u043f\u0441\u0442\u0440\u0438\u043c \u043e\u0442\u043a\u0430\u0442\u0438\u043b \u043a\u0430\u043a \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0442\u0447-\u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u043a\u0438; \u043e\u0431\u044b\u0447\u043d\u044b\u0439 minor\/patch update \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0430\u0448 \u0441\u0442\u0435\u043a: Nuxt 3.18 + Vue 3.5.x + TypeScript, SSR, Pinia, PM2 cluster, nginx \u043f\u0435\u0440\u0435\u0434 Node. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043e\u0442\u0435\u043b\u0435\u0439 \u0441 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 SEO-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432\u0438\u0434\u0430<code> \/oteli-v-{\u0433\u043e\u0440\u043e\u0434}\/{\u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430}<\/code>.<\/p>\n<h3>\u0412\u043a\u0440\u0430\u0442\u0446\u0435<\/h3>\n<ol>\n<li>\n<p>\u0412 \u043e\u0442\u0447\u0435\u0442\u0435 Ahrefs \u0442\u044b\u0441\u044f\u0447\u0438 502 \u0443 \u0431\u043e\u0442\u043e\u0432, \u0443 \u0436\u0438\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 502, \u0438\u0437\u043d\u0443\u0442\u0440\u0438 200 \u2014 \u0441\u043c\u0435\u0440\u0442\u044c \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430: SIGABRT \u043e\u0442 V8 \u043f\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u043c\u0443 &#8212;max-old-space-size \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041b\u0438\u043c\u0438\u0442 \u043f\u043e\u0434\u043d\u044f\u043b\u0438, \u043a\u0440\u0430\u0448\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c, \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0430 \u0442\u0435\u0447\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0444\u0444 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043b: \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0432\u044f\u0437\u043a\u0435 Nuxt 3.18 + Vue 3.5.x watch() \u0432 setup() \u043d\u0430 SSR \u043e\u0441\u0435\u0434\u0430\u0435\u0442 \u0432 heap \u0431\u0435\u0437 \u043e\u0447\u0438\u0441\u0442\u043a\u0438. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u043f\u0441\u0442\u0440\u0438\u043c-issue Vue\/Nuxt \u2014 \u0437\u0430\u0434\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u0441\u043e\u0432\u043f\u0430\u043b\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0435\u0440\u043d\u0443\u043b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 <code>watch<\/code> \u0432 <code>if (import.meta.client)<\/code>. \u041e\u0448\u0438\u0431\u043a\u0438 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u0438\u0441\u0447\u0435\u0437\u043b\u0438, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439. \u0412\u043e\u0442\u0447\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c GC-\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u043e\u0441\u0442 RSS.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043e\u043c Vue \u0434\u043e 3.5.31 (\u0430\u043f\u0441\u0442\u0440\u0438\u043c-\u0444\u0438\u043a\u0441 SSR scope cleanup) \u0438 \u0441\u043d\u044f\u0442\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 <code>useFetch\/useMediaQuery<\/code> \u0432\u043e\u0442\u0447\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0412 Vue 3.5.32 \u0444\u0438\u043a\u0441 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u043a\u0430\u043a \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439. \u0421\u0438\u0434\u0438\u043c \u043d\u0430 3.5.31; \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u043f\u0433\u0440\u0435\u0439\u0434 Vue \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0414\u043e \u0438 \u043f\u043e\u0441\u043b\u0435<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u0414\u043e, \u043f\u0438\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u0441\u043b\u0435, \u043f\u0440\u043e\u0448\u043b\u043e 2 \u043d\u0435\u0434\u0435\u043b\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">502 \u0432 \u0447\u0430\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">2444<\/p>\n<\/td>\n<td>\n<p align=\"left\">0-1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">502\/504 \u0437\u0430 \u0434\u0435\u043d\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">50 000 \u0437\u0430 3-4 \u0434\u043d\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">RSS \u0432\u043e\u0440\u043a\u0435\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u043e 2907 \u041c\u0411, \u0440\u043e\u0442\u0430\u0446\u0438\u044f ~50 \u043c\u0438\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043b\u043e\u0441\u043a\u0438\u0435 350 \u043c\u0431, \u0430\u043f\u0442\u0430\u0439\u043c 14+ \u0447<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">\u0420\u043e\u0441\u0442 RSS<\/p>\n<\/td>\n<td>\n<p align=\"left\">65 \u043c\u0431\/\u043c\u0438\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0438\u043b\u0430 GC, \u0434\u0440\u0435\u0439\u0444 \u00b12 \u043c\u0431\/\u043c\u0438\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"174\" width=\"174\">\n<p align=\"left\">CPU \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">27% (GC \u0442\u0440\u0435\u0448\u0438\u043d\u0433)<\/p>\n<\/td>\n<td>\n<p align=\"left\">2%<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0427\u0442\u043e \u0432\u0438\u0434\u044f\u0442 \u0431\u043e\u0442\u044b<\/h3>\n<p>\u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0441 \u043e\u0442\u0447\u0435\u0442\u0430 \u0432 Ahrefs: 1670 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0430\u0448 \u0441\u0430\u0439\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0430 502 Bad Gateway. \u0411\u043e\u0442\u044b \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e\u0442 \u0441\u0435\u0440\u0438\u044f\u043c\u0438 \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 5-10 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u0430; \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 200.<\/p>\n<h3>\u041c\u0430\u0441\u0448\u0442\u0430\u0431: 51 467 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0437\u0430\u0431\u044b\u0442\u044b\u0439 PM2-\u043a\u043e\u043d\u0444\u0438\u0433<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0442\u0435\u043e\u0440\u0438\u044f: \u0442\u0443\u043f\u043e \u043c\u0430\u043b\u043e RAM. \u0412 dmesg \u0437\u0430\u043f\u0438\u0441\u044c OOM-\u043a\u0438\u043b\u043b\u0435\u0440\u0430:<\/p>\n<pre><code>Killed process 1364988 (node) total-vm:36643296kB, anon-rss:1395632kB<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442 ~1 \u0433\u0431 RSS, \u0434\u0432\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 + nginx + \u0441\u0438\u0441\u0442\u0435\u043c\u0430 = \u043f\u043e\u0442\u043e\u043b\u043e\u043a. \u041d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e instances: 1 \u0438 max_memory_restart: 900M, \u0437\u0430\u043a\u0430\u0437\u0430\u043b \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043d\u0443\u043b\u0438 \u0434\u043e 4 CPU \/ 8 \u0433\u0431 RAM. \u0421\u0435\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0434 \u0437\u0430\u043d\u043e\u0432\u043e \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c. \u0412 nginx access.log: 51 467 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 HTTP 502 \u0437\u0430 3-4 \u0434\u043d\u044f, \u043e\u043a\u043e\u043b\u043e 2100 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0447\u0430\u0441. \u0422\u043e\u043f URL \u2014 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JS-\u0447\u0430\u043d\u043a \/_nuxt\/Bwfv1ZSS.js (1835 \u0445\u0438\u0442\u043e\u0432), \/favicon.ico (490), \/ (485). \u0421\u0442\u0430\u0442\u0438\u043a\u0430 \/_nuxt\/ \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0447\u0435\u0440\u0435\u0437 Node, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0434\u0438\u0441\u043a\u0430. \u041f\u0430\u0434\u0430\u0435\u0442 Node \u2014 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0430.<\/p>\n<p><code>pm2 describe<\/code> \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0442\u0435\u043a \u043f\u0430\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>node::OOMErrorHandler  \u2192 v8::Utils::ReportOOMFailure  \u2192 v8::internal::V8::FatalProcessOutOfMemory  \u2192 Heap::PerformGarbageCollection  \u2192 Runtime_StringBuilderConcat<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u043c\u0438\u0440\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e <code>SIGABRT<\/code>: V8 \u0432 FatalProcessOutOfMemory \u043f\u043e &#8212;max-old-space-size. \u041d\u0435 <code>SIGKILL<\/code> \u043e\u0442 \u044f\u0434\u0440\u0430 (\u0432 dmesg\/journalctl \u043f\u0443\u0441\u0442\u043e), \u043d\u0435 <code>SIGTERM<\/code> \u043e\u0442 PM2.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e <code>ecosystem.config.cjs<\/code>: \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043d\u0443\u043b\u0438, \u0430 PM2-\u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043e\u0442 2-\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u044d\u043f\u043e\u0445\u0438. \u041f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0441\u0442 ~800 \u043c\u0431, \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u044b \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f ~400 \u2014 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043a\u043e\u043d\u0447\u0430\u044e\u0442\u0441\u044f. max_memory_restart: 1700M \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u043b, V8 \u0443\u043c\u0438\u0440\u0430\u043b \u043f\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u043b\u0438\u043c\u0438\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n<p>\u0424\u0438\u043a\u0441 \u0437\u0430\u043d\u044f\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442:<\/p>\n<pre><code>instances: 2,max_memory_restart: '4G',node_args: [  '--max-old-space-size=5120',                \/\/ 1200 \u2192 5120 (\u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0434\u0430\u043b\u044c\u0448\u0435)  '--heapsnapshot-signal=SIGUSR2',  '--env-file=\/var\/www\/website\/shared\/.env',],<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043b\u044e\u0441 \/_nuxt\/ \u0432 nginx \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b \u043d\u0430 \u043e\u0442\u0434\u0430\u0447\u0443 \u0441 \u0434\u0438\u0441\u043a\u0430. \u0417\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 URL \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043b\u0438 \u043a\u0440\u0430\u0448 \u0447\u0435\u0440\u0435\u0437 proxy_cache_use_stale, \u0441\u0442\u0440\u0430\u0434\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439-\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u2014 \u0430 \u0438\u0445 \u0443 \u0431\u043e\u0442\u043e\u0432 \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u044b\u0441\u044f\u0447\u0438.<\/p>\n<p>SIGABRT-\u043a\u0440\u0430\u0448\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c. 502\/\u0447\u0430\u0441 \u0443\u043f\u0430\u043b \u0434\u043e 0-1. \u041f\u043e\u0431\u0435\u0434\u0430?<\/p>\n<h3>\u041f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u0442\u0435\u0447\u0435\u0442<\/h3>\n<p>\u0421\u043d\u044f\u043b \u0431\u0435\u0439\u0441\u043b\u0430\u0439\u043d \u0447\u0435\u0440\u0435\u0437 37 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430 \u2014 64 \u043c\u0431. \u0427\u0435\u0440\u0435\u0437 3.5 \u0447\u0430\u0441\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0434\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0434\u043e RSS 1.7 \u0433\u0431 \/ heap_used 1.25 \u0433\u0431. \u0423\u0442\u0435\u0447\u043a\u0430 \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 400 \u043c\u0431\/\u0447\u0430\u0441 \u043d\u0430 \u0432\u043e\u0440\u043a\u0435\u0440. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 + \u043f\u043e\u0434\u043d\u044f\u0442\u044b\u0439 \u043b\u0438\u043c\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u0440\u0430\u0448 \u043a\u0430\u0436\u0434\u044b\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0432 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u2014 \u0441\u0438\u043c\u043f\u0442\u043e\u043c \u0441\u043f\u0440\u044f\u0442\u0430\u043d, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0420\u0435\u0448\u0438\u043b \u0441\u043d\u044f\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0434\u043b\u044f \u0434\u0438\u0444\u0444\u0430. kill -SIGUSR2 &lt;pid&gt; \u2014 \u0438 \u043e\u0431\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u043f\u0430\u0434\u0430\u044e\u0442 \u043f\u043e SIGABRT \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043c\u043f\u0430 (RSS 1.7 \u2192 3.5 \u0433\u0431 \u2192 OOM). \u041f\u043e <a href=\"https:\/\/v8.dev\/blog\/speeding-up-v8-heap-snapshots\" rel=\"noopener noreferrer nofollow\">V8-\u0431\u043b\u043e\u0433\u0443<\/a> \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~2\u0445 \u043e\u0442 heap. \u0423 \u043c\u0435\u043d\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 (Node 20, Nuxt SSR, heap_used \u2248 1.25 \u0433\u0431) \u043f\u0438\u043a\u043e\u0432\u044b\u0439 RSS \u0443\u0445\u043e\u0434\u0438\u043b \u0432 4.63 \u0433\u0431 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c ~3.7-5\u0445.<\/p>\n<blockquote>\n<p>\u041f\u043e \u043c\u043e\u0438\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043c\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0440\u0438 heap_used \u2264 15% \u043e\u0442 \u043b\u0438\u043c\u0438\u0442\u0430 (\u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 heap-\u0444\u043e\u0440\u043c\u0430\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 &#8212;max-old-space-size \u0438 \u043f\u043e\u0434\u043d\u044f\u0442 \u0441 1200 \u0434\u043e 5120.<\/p>\n<\/blockquote>\n<p>\u0414\u0430\u043c\u043f\u044b \u0448\u043b\u0438 \u043f\u043e 50-600 \u043c\u0431, Chrome DevTools \u0442\u0430\u043a\u0438\u0435 \u043d\u0435 \u0432\u044b\u0432\u043e\u0437\u0438\u0442 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u0432\u0430 Node-\u0441\u043a\u0440\u0438\u043f\u0442\u0430: <code>diff-heap.mjs<\/code> (\u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0434\u044b \u043f\u043e constructor name) \u0438 <code>who-retains.mjs<\/code> (\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u044b 4).<\/p>\n<h3>\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0443\u0442\u0435\u0447\u043a\u0438 \u0438 retainer chains<\/h3>\n<pre><code>=== TOP GROWERS BY constructor (delta_size desc) ===delta_size   delta_count   key +12.83 MB   +152,919      object\/Dep  +4.59 MB    +37,605      object\/ComputedRefImpl  +2.01 MB    +32,850      object\/RefImpl+760032 B      +7,917      object\/EffectScope+448800 B       +5,100     object\/ReactiveEffect+285600 B       +5,100     closure\/watchHandle<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 3 \u0434\u0430\u0442\u0430\u043f\u043e\u0438\u043d\u0442\u0430\u0445 (64 \u2192 154 \u2192 234 \u043c\u0431) \u0441\u0447\u0438\u0442\u0430\u044e \u043d\u0435 \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u044b, \u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u043e\u043a\u043d\u0430\u0445 0-15 \u0438 15-40 \u043c\u0438\u043d \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u2014 \u043d\u043e\u0440\u043c\u0438\u0440\u0443\u044e \u043d\u0430 \u00ab\u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u00bb (\u043e\u0434\u0438\u043d \u0443\u0442\u0435\u043a\u0448\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0430\u0431\u043b\/\u0441\u0442\u043e\u0440 \u0441 2 \u0432\u043e\u0442\u0447\u0430\u043c\u0438):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">\u0421\u0447\u0435\u0442\u0447\u0438\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043d\u0430 1 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">watchHandle<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">ReactiveEffect<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">RefImpl<\/p>\n<\/td>\n<td>\n<p align=\"left\">~4.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">ComputedRefImpl<\/p>\n<\/td>\n<td>\n<p align=\"left\">~3.4<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">EffectScope<\/p>\n<\/td>\n<td>\n<p align=\"left\">~0.55<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"310\" width=\"310\">\n<p align=\"left\">Dep<\/p>\n<\/td>\n<td>\n<p align=\"left\">~11.6<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f = \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0448\u0442\u0430\u043c\u043f\u0443\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u042d\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue \u2014 <code>watch()<\/code> \u0431\u0435\u0437 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 scope. \u042d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430, \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u044b.<\/p>\n<p>who-retains.mjs \u0434\u043b\u044f object\/EffectScope (3318 \u043d\u043e\u0434): 49% \u0447\u0435\u0440\u0435\u0437 <code>Object.scope &lt;- Object.component<\/code> (Vue-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435 \u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u0430), 15% \u0447\u0435\u0440\u0435\u0437 <code>EffectScope.prevScope<\/code> chain, 5% \u0447\u0435\u0440\u0435\u0437 <code>nuxtApp.ssrContext.__watcherHandles<\/code>.<\/p>\n<h4>\u0414\u0438\u0430\u0433\u043d\u043e\u0437<\/h4>\n<blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0432\u044f\u0437\u043a\u0435 Nuxt 3.18 + Vue 3.5.x SSR-teardown \u043d\u0435 \u0434\u0438\u0441\u043f\u043e\u0437\u0438\u0442 EffectScope: \u0432\u043e\u0442\u0447\u0438 \u0432 setup() \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \/ composable \/ Pinia-\u0441\u0442\u043e\u0440\u0430 \u043e\u0441\u0435\u0434\u0430\u044e\u0442 \u0432 heap. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435\u0442 \u00ab\u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00bb \u2014 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043b\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e watch \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0433\u043e \u0436\u0438\u0432\u044b\u043c. \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0439 Vue 3 + Nuxt 3-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0442\u043e\u0438\u0442 heap \u0434\u0438\u0444\u0444\u043e\u043c.<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043f\u0441\u0442\u0440\u0438\u043c-\u0431\u0430\u0433: <a href=\"https:\/\/github.com\/nuxt\/nuxt\/issues\/33705\" rel=\"noopener noreferrer nofollow\">nuxt#33705<\/a> (\u0446\u0438\u0444\u0440\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438, heap \u0441 80 \u0434\u043e 600 \u043c\u0431 \u0437\u0430 4 \u0447 \u043f\u0440\u0438 60 rpm), <a href=\"https:\/\/github.com\/vuejs\/core\/issues\/5208\" rel=\"noopener noreferrer nofollow\">vuejs\/core#5208<\/a> \u0438 \u0434\u0440. \u043f\u043e \u0442\u0435\u043c\u0435.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0431\u043e\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0431\u044b\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u044c\u044e \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u043c \u0443\u0442\u0435\u0447\u043a\u0438: \u0442\u044b\u0441\u044f\u0447\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 URL (\u0442\u0438\u043f\u0430 <a href=\"https:\/\/moyabron.ru\/oteli-v-sochi\" rel=\"noopener noreferrer nofollow\">\/oteli-v-sochi<\/a>) = \u0442\u044b\u0441\u044f\u0447\u0438 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u043e\u0432 = \u0442\u044b\u0441\u044f\u0447\u0438 \u043d\u0435\u0443\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0442\u0447\u0435\u0439.<\/p>\n<h3>\u0428\u0430\u0431\u043b\u043e\u043d \u0444\u0438\u043a\u0441\u0430 \u0438 6 \u0432\u043e\u043b\u043d \u043f\u0440\u0430\u0432\u043e\u043a<\/h3>\n<pre><code class=\"typescript\">\/\/ \u0411\u044b\u043b\u043e:watch(source, handler);\/\/ \u0421\u0442\u0430\u043b\u043e:if (import.meta.client) {  watch(source, handler);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0431\u0430\u043d\u0434\u043b\u0435 \u0432\u043e\u0442\u0447\u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 (\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430, \u0441\u043a\u0440\u043e\u043b\u043b, document.title, login\/logout).<\/p>\n<h3>\u0423\u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u0432\u043e\u0442\u0447\u0438 \u2014 \u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u0435\u0447\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435<\/h3>\n<p>\u0414\u0435\u043f\u043b\u043e\u044e \u043d\u043e\u0432\u044b\u0439 \u0444\u0438\u043a\u0441, \u0441\u043d\u0438\u043c\u0430\u044e \u0437\u0430\u043c\u0435\u0440\u044b. \u041f\u0438\u043a 502\/504 \u0432 \u0447\u0430\u0441 \u2014 \u0441 2444 \u0434\u043e ~5. CPU \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u2014 \u0441 26-29% \u0434\u043e 1.8-2.3%. SSR-\u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438 heap 95% \u2014 \u0440\u0430\u043d\u044c\u0448\u0435 \u0443\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u0432 60-\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u0442\u0435\u043f\u0435\u0440\u044c 4.3 \u0441. \u0418 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435 \u043b\u043e\u043c\u0430\u0435\u0442: <strong>\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u043e\u0441\u0442\u0430 RSS \u2014 \u0431\u044b\u043b\u0430 65 \u043c\u0431\/\u043c\u0438\u043d, \u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c 65 \u043c\u0431\/\u043c\u0438\u043d.<\/strong><\/p>\n<p>\u041e\u0448\u0438\u0431\u043e\u043a \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u043b\u043e \u0432 ~500 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, <strong>\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c<\/strong>. \u0412\u043e\u0442\u0447\u0438 \u0431\u044b\u043b\u0438 \u043d\u0435 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c GC-\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f: \u0442\u044b\u0441\u044f\u0447\u0438 \u0436\u0438\u0432\u044b\u0445 <code>ReactiveEffect\/Dep<\/code> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 V8 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c minor-GC \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0433\u0440\u0430\u0444, 27% CPU \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u0443\u0441\u043e\u0440\u0430, \u0438 \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c SSR-\u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0432 60-\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 nginx -&gt; 504. \u0423\u0431\u0440\u0430\u043b \u0432\u043e\u0442\u0447\u0438 -&gt; \u0433\u0440\u0430\u0444 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 -&gt; CPU 2% -&gt; SSR \u0432 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0435. \u0410 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0442\u0435\u043a\u043b\u0430: \u044f \u0437\u0430\u043a\u0440\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443.<\/p>\n<hr\/>\n<h3>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u043e\u0442\u0447\u0435\u0440\u044b \u0438 \u0444\u0438\u043a\u0441 \u0432 Vue 3.5.31<\/h3>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0434\u0438\u0444\u0444 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u043b\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f. \u0422\u043e\u043f \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u2014 \u043d\u0435 watchHandle, \u0430:<\/p>\n<pre><code>+70.66 MB   array\/+34.05 MB   string+12.83 MB   object\/Dep+10.19 MB   object\/Link          &lt;- \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue 3.5 +7.25 MB   object\/system \/ Context   &lt;- SSR async context<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Dep\/Link \u2014 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f doubly-linked-list \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue 3.5, system \/ Context \u2014 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 SSR. \u041f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u0427\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b:<\/p>\n<p><strong>1. useMediaQuery \u0438\u0437 VueUse<\/strong> \u043d\u0430 SSR \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 shallowRef \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437 user-agent.<\/p>\n<p><strong>2. useApi \u0431\u0435\u0437 useFetch.<\/strong> \u0412 asyncData.js:123 \u0432\u0438\u0434\u043d\u043e: useFetch \u0441\u0442\u0440\u043e\u0438\u0442 key = computed(&#8230;) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 watch: [&#8230;watchSources, _fetchOptions] \u0432 useAsyncData, \u043f\u043b\u044e\u0441 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d watch(key, setImmediate, &#8230;). \u041a\u0430\u0436\u0434\u044b\u0439 useFetch \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 = \u043e\u0434\u0438\u043d-\u0434\u0432\u0430 \u0432\u043e\u0442\u0447\u0430 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u0443\u0442\u0435\u0447\u043a\u0438. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0445\u043e\u0436\u0443 \u0432 API \u0440\u0443\u043a\u0430\u043c\u0438: \u043d\u0430\u043f\u0438\u0441\u0430\u043b createServerManualApi \u0441 \u0440\u0443\u0447\u043d\u044b\u043c $fetch \u0438 shallowRef.<\/p>\n<p><strong>3. \u0411\u0430\u043c\u043f Vue \u0434\u043e 3.5.31.<\/strong> \u0412 \u043f\u0430\u0442\u0447\u043d\u043e\u0443\u0442\u0435 \u0444\u0438\u043a\u0441 <strong>PR #14548<\/strong>: \u00abfix(server-renderer): cleanup component effect scopes after SSR render\u00bb. \u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f: scopes \u00abskip the normal unmount path\u00bb, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u00abscope-bound effects and cleanup callbacks persist beyond the request lifetime\u00bb. \u0421\u043b\u043e\u0432\u043e \u0432 \u0441\u043b\u043e\u0432\u043e \u043c\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0437. \u0411\u0430\u043c\u043f\u043d\u0443\u043b \u2014 \u0443\u0442\u0435\u0447\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u043b\u0430\u0441\u044c. \u0422\u043e\u0447\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 (3.5.31 \/ useApi \/ useMedia) \u044f \u043d\u0435 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u043b: \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442: \u0432 Vue 3.5.32 \u044d\u0442\u043e\u0442 \u0444\u0438\u043a\u0441 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 (<a href=\"https:\/\/github.com\/vuejs\/core\/pull\/14674\" rel=\"noopener noreferrer nofollow\">PR #14674<\/a>). #14548 \u0437\u0432\u0430\u043b scope.stop() \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c EffectScope \u043f\u043e\u0441\u043b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u0430 \u0442\u043e\u0442 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 onScopeDispose()-\u043a\u043e\u043b\u0431\u044d\u043a\u0438. \u0412 Vue \u0435\u0441\u0442\u044c \u043d\u0435\u0433\u043b\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u00ab\u043d\u0430 SSR onScopeDispose \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00bb, \u043f\u043e\u0434 \u043d\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0443\u0447\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0430\u0431\u043b\u043e\u0432 \u2014 \u043f\u043e\u0441\u043b\u0435 3.5.31 \u043a\u043b\u0438\u043d\u0430\u043f \u0445\u0443\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0423\u0437\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 <code>unwatch context.__watcherHandles<\/code> \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0418 \u043d\u044e\u0430\u043d\u0441 \u043f\u043e\u0434 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439: \u0447\u0435\u0440\u0435\u0437 <code>__watcherHandles<\/code> \u0434\u0435\u0440\u0436\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e 5% \u0443\u0442\u0435\u0447\u043a\u0438, <strong>\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c (49%)<\/strong> \u0447\u0435\u0440\u0435\u0437 <code>Object.scope &lt;- Object.component<\/code>. \u0423\u0437\u043a\u0438\u0439 \u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u043d\u0430\u0441 \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u043c\u0430\u043b\u0443\u044e \u0434\u043e\u043b\u044e. \u041d\u0430\u0441 \u0441\u043f\u0430\u0441\u0430\u043b\u0430 \u0440\u043e\u0432\u043d\u043e \u00ab\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u0443\u0431\u0430\u044f\u00bb #14548. \u0420\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u0442: \u0441\u0432\u043e\u0435\u0433\u043e <code>onScopeDispose<\/code> \u043d\u0435\u0442, VueUse-composables \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043b\u0438\u0431\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441, \u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0449\u0435\u043d\u044b \u0440\u0443\u043a\u0430\u043c\u0438. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u0438 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0435\u0434\u0435: \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 3.5.31, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 teardown \u0432 Nuxt-\u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u0439 \u0430\u043f\u0441\u0442\u0440\u0438\u043c \u0444\u0438\u043a\u0441 \u0441 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043f\u0440\u043e \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0442\u0443 \u0434\u043b\u044f \u0446\u0435\u043f\u043e\u0447\u0435\u043a <code>Object.scope &lt;- Object.component<\/code>.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 2 \u043d\u0435\u0434\u0435\u043b\u0438<\/h3>\n<p>\u0423\u0442\u0435\u0447\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430, \u043f\u0440\u043e\u0434 \u0441\u043f\u0443\u0441\u0442\u044f 2 \u043d\u0435\u0434\u0435\u043b\u0438: \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043f\u043e 14 \u0447\u0430\u0441\u043e\u0432 \u0430\u043f\u0442\u0430\u0439\u043c\u0430 \u043f\u0440\u0438 ~350 \u043c\u0431 RSS, \u0440\u043e\u0441\u0442 \u0437\u0430 60 \u0441\u0435\u043a\u0443\u043d\u0434 +5.9\/\u22121.5 \u043c\u0431 (\u043f\u0438\u043b\u0430 GC), 502\/504 \u0437\u0430 \u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c \u2014 6. \u0411\u0443\u0434\u044c \u0442\u0430\u043c \u0443\u0442\u0435\u0447\u043a\u0430 \u0445\u043e\u0442\u044c \u043d\u0430 30 \u043c\u0431\/\u043c\u0438\u043d, \u0434\u0430\u0432\u043d\u043e \u0443\u043f\u0435\u0440\u0441\u044f \u0431\u044b \u0432 max_memory_restart: 4G. \u0421 2100 \u043e\u0448\u0438\u0431\u043e\u043a 502\/\u0447\u0430\u0441 \u0434\u043e 6 \u0437\u0430 \u0434\u0435\u043d\u044c.<\/p>\n<h3>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435<\/h3>\n<ol>\n<li>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0432\u044f\u0437\u043a\u0435 Nuxt 3.18 + Vue 3.5.x watch() \u0432 setup() SSR-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0432 heap. \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0432\u043e\u0442\u0447\u0438 \u043b\u0443\u0447\u0448\u0435 \u044f\u0432\u043d\u043e \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440-\u0431\u0430\u043d\u0434\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 <code>if (import.meta.client)<\/code>. <code>useFetch<\/code> \u0438 <code>useMediaQuery<\/code> \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u0442\u0447\u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u0435\u0441\u043b\u0438 heap diff \u0432\u0435\u0434\u0435\u0442 \u0442\u0443\u0434\u0430, \u0437\u0430\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0439 <code>$fetch<\/code> \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 SSR-\u0432\u0435\u0442\u043a\u0438 \u0431\u0435\u0437 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>Heap \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435 ~2x \u043e\u0442 heap \u043a\u0430\u043a \u0432 \u0434\u043e\u043a\u0435, \u0430 5x \u2014 \u0441\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u043f\u0440\u0438 heap_used \u2264 ~15% \u043e\u0442 \u043b\u0438\u043c\u0438\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 heap-diff + retainer chain, \u043f\u043e\u0442\u043e\u043c \u043a\u043e\u0434. \u0413\u0430\u0434\u0430\u0442\u044c \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u2014 \u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/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\/articles\/1040346\/\">https:\/\/habr.com\/ru\/articles\/1040346\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0435\u043b\u0435\u0439. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a 8 \u0434\u043d\u0435\u0439 \u043b\u043e\u0432\u0438\u043b \u0443\u0442\u0435\u0447\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u043b, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0448\u0438\u0431\u0430\u043b\u0441\u044f. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0438\u043a\u0441 \u0431\u044b\u043b \u043d\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435, \u0430 \u0432 \u043f\u0430\u0442\u0447\u0435 Vue, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u0430\u043f\u0441\u0442\u0440\u0438\u043c \u043e\u0442\u043a\u0430\u0442\u0438\u043b \u043a\u0430\u043a \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0442\u0447-\u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u043a\u0438; \u043e\u0431\u044b\u0447\u043d\u044b\u0439 minor\/patch update \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430\u043c\u0438.\u041d\u0430\u0448 \u0441\u0442\u0435\u043a: Nuxt 3.18 + Vue 3.5.x + TypeScript, SSR, Pinia, PM2 cluster, nginx \u043f\u0435\u0440\u0435\u0434 Node. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043e\u0442\u0435\u043b\u0435\u0439 \u0441 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 SEO-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432\u0438\u0434\u0430 \/oteli-v-{\u0433\u043e\u0440\u043e\u0434}\/{\u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430}.\u0412\u043a\u0440\u0430\u0442\u0446\u0435\u0412 \u043e\u0442\u0447\u0435\u0442\u0435 Ahrefs \u0442\u044b\u0441\u044f\u0447\u0438 502 \u0443 \u0431\u043e\u0442\u043e\u0432, \u0443 \u0436\u0438\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 502, \u0438\u0437\u043d\u0443\u0442\u0440\u0438 200 \u2014 \u0441\u043c\u0435\u0440\u0442\u044c \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430: SIGABRT \u043e\u0442 V8 \u043f\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u043c\u0443 &#8212;max-old-space-size \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041b\u0438\u043c\u0438\u0442 \u043f\u043e\u0434\u043d\u044f\u043b\u0438, \u043a\u0440\u0430\u0448\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c, \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0430 \u0442\u0435\u0447\u044c.\u0414\u0438\u0444\u0444 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043b: \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0432\u044f\u0437\u043a\u0435 Nuxt 3.18 + Vue 3.5.x watch() \u0432 setup() \u043d\u0430 SSR \u043e\u0441\u0435\u0434\u0430\u0435\u0442 \u0432 heap \u0431\u0435\u0437 \u043e\u0447\u0438\u0441\u0442\u043a\u0438. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u043f\u0441\u0442\u0440\u0438\u043c-issue Vue\/Nuxt \u2014 \u0437\u0430\u0434\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u0441\u043e\u0432\u043f\u0430\u043b\u043e.\u041e\u0431\u0435\u0440\u043d\u0443\u043b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 watch \u0432 if (import.meta.client). \u041e\u0448\u0438\u0431\u043a\u0438 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u0438\u0441\u0447\u0435\u0437\u043b\u0438, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439. \u0412\u043e\u0442\u0447\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c GC-\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u043e\u0441\u0442 RSS.\u0417\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043e\u043c Vue \u0434\u043e 3.5.31 (\u0430\u043f\u0441\u0442\u0440\u0438\u043c-\u0444\u0438\u043a\u0441 SSR scope cleanup) \u0438 \u0441\u043d\u044f\u0442\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 useFetch\/useMediaQuery \u0432\u043e\u0442\u0447\u0435\u0440\u043e\u0432.\u0412 Vue 3.5.32 \u0444\u0438\u043a\u0441 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u043a\u0430\u043a \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439. \u0421\u0438\u0434\u0438\u043c \u043d\u0430 3.5.31; \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u043f\u0433\u0440\u0435\u0439\u0434 Vue \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 heap-\u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430\u043c\u0438.\u0414\u043e \u0438 \u043f\u043e\u0441\u043b\u0435\u0414\u043e, \u043f\u0438\u043a\u041f\u043e\u0441\u043b\u0435, \u043f\u0440\u043e\u0448\u043b\u043e 2 \u043d\u0435\u0434\u0435\u043b\u0438502 \u0432 \u0447\u0430\u044124440-1502\/504 \u0437\u0430 \u0434\u0435\u043d\u044c50 000 \u0437\u0430 3-4 \u0434\u043d\u044f6RSS \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0434\u043e 2907 \u041c\u0411, \u0440\u043e\u0442\u0430\u0446\u0438\u044f ~50 \u043c\u0438\u043d\u043f\u043b\u043e\u0441\u043a\u0438\u0435 350 \u043c\u0431, \u0430\u043f\u0442\u0430\u0439\u043c 14+ \u0447\u0420\u043e\u0441\u0442 RSS65 \u043c\u0431\/\u043c\u0438\u043d\u043f\u0438\u043b\u0430 GC, \u0434\u0440\u0435\u0439\u0444 \u00b12 \u043c\u0431\/\u043c\u0438\u043dCPU \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043527% (GC \u0442\u0440\u0435\u0448\u0438\u043d\u0433)2%\u0427\u0442\u043e \u0432\u0438\u0434\u044f\u0442 \u0431\u043e\u0442\u044b\u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0441 \u043e\u0442\u0447\u0435\u0442\u0430 \u0432 Ahrefs: 1670 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0430\u0448 \u0441\u0430\u0439\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0430 502 Bad Gateway. \u0411\u043e\u0442\u044b \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e\u0442 \u0441\u0435\u0440\u0438\u044f\u043c\u0438 \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 5-10 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u0430; \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 200.\u041c\u0430\u0441\u0448\u0442\u0430\u0431: 51 467 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0437\u0430\u0431\u044b\u0442\u044b\u0439 PM2-\u043a\u043e\u043d\u0444\u0438\u0433\u041f\u0435\u0440\u0432\u0430\u044f \u0442\u0435\u043e\u0440\u0438\u044f: \u0442\u0443\u043f\u043e \u043c\u0430\u043b\u043e RAM. \u0412 dmesg \u0437\u0430\u043f\u0438\u0441\u044c OOM-\u043a\u0438\u043b\u043b\u0435\u0440\u0430:Killed process 1364988 (node) total-vm:36643296kB, anon-rss:1395632kB\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442 ~1 \u0433\u0431 RSS, \u0434\u0432\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 + nginx + \u0441\u0438\u0441\u0442\u0435\u043c\u0430 = \u043f\u043e\u0442\u043e\u043b\u043e\u043a. \u041d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e instances: 1 \u0438 max_memory_restart: 900M, \u0437\u0430\u043a\u0430\u0437\u0430\u043b \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043d\u0443\u043b\u0438 \u0434\u043e 4 CPU \/ 8 \u0433\u0431 RAM. \u0421\u0435\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0434 \u0437\u0430\u043d\u043e\u0432\u043e \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c. \u0412 nginx access.log: 51 467 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 HTTP 502 \u0437\u0430 3-4 \u0434\u043d\u044f, \u043e\u043a\u043e\u043b\u043e 2100 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0447\u0430\u0441. \u0422\u043e\u043f URL \u2014 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JS-\u0447\u0430\u043d\u043a \/_nuxt\/Bwfv1ZSS.js (1835 \u0445\u0438\u0442\u043e\u0432), \/favicon.ico (490), \/ (485). \u0421\u0442\u0430\u0442\u0438\u043a\u0430 \/_nuxt\/ \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0447\u0435\u0440\u0435\u0437 Node, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0434\u0438\u0441\u043a\u0430. \u041f\u0430\u0434\u0430\u0435\u0442 Node \u2014 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0430.pm2 describe \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0442\u0435\u043a \u043f\u0430\u0434\u0435\u043d\u0438\u044f:node::OOMErrorHandler  \u2192 v8::Utils::ReportOOMFailure  \u2192 v8::internal::V8::FatalProcessOutOfMemory  \u2192 Heap::PerformGarbageCollection  \u2192 Runtime_StringBuilderConcat\u0423\u043c\u0438\u0440\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e SIGABRT: V8 \u0432 FatalProcessOutOfMemory \u043f\u043e &#8212;max-old-space-size. \u041d\u0435 SIGKILL \u043e\u0442 \u044f\u0434\u0440\u0430 (\u0432 dmesg\/journalctl \u043f\u0443\u0441\u0442\u043e), \u043d\u0435 SIGTERM \u043e\u0442 PM2.\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e ecosystem.config.cjs: \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u043d\u0443\u043b\u0438, \u0430 PM2-\u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043e\u0442 2-\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u044d\u043f\u043e\u0445\u0438. \u041f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0441\u0442 ~800 \u043c\u0431, \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u044b \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f ~400 \u2014 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043a\u043e\u043d\u0447\u0430\u044e\u0442\u0441\u044f. max_memory_restart: 1700M \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u043b, V8 \u0443\u043c\u0438\u0440\u0430\u043b \u043f\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u043b\u0438\u043c\u0438\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435.\u0424\u0438\u043a\u0441 \u0437\u0430\u043d\u044f\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442:instances: 2,max_memory_restart: &#8216;4G&#8217;,node_args: [  &#8216;&#8212;max-old-space-size=5120&#8217;,                \/\/ 1200 \u2192 5120 (\u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u2014 \u0434\u0430\u043b\u044c\u0448\u0435)  &#8216;&#8212;heapsnapshot-signal=SIGUSR2&#8217;,  &#8216;&#8212;env-file=\/var\/www\/website\/shared\/.env&#8217;,],\u041f\u043b\u044e\u0441 \/_nuxt\/ \u0432 nginx \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b \u043d\u0430 \u043e\u0442\u0434\u0430\u0447\u0443 \u0441 \u0434\u0438\u0441\u043a\u0430. \u0417\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 URL \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043b\u0438 \u043a\u0440\u0430\u0448 \u0447\u0435\u0440\u0435\u0437 proxy_cache_use_stale, \u0441\u0442\u0440\u0430\u0434\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439-\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u2014 \u0430 \u0438\u0445 \u0443 \u0431\u043e\u0442\u043e\u0432 \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u044b\u0441\u044f\u0447\u0438.SIGABRT-\u043a\u0440\u0430\u0448\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c. 502\/\u0447\u0430\u0441 \u0443\u043f\u0430\u043b \u0434\u043e 0-1. \u041f\u043e\u0431\u0435\u0434\u0430?\u041f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u0442\u0435\u0447\u0435\u0442\u0421\u043d\u044f\u043b \u0431\u0435\u0439\u0441\u043b\u0430\u0439\u043d \u0447\u0435\u0440\u0435\u0437 37 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430 \u2014 64 \u043c\u0431. \u0427\u0435\u0440\u0435\u0437 3.5 \u0447\u0430\u0441\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0434\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0434\u043e RSS 1.7 \u0433\u0431 \/ heap_used 1.25 \u0433\u0431. \u0423\u0442\u0435\u0447\u043a\u0430 \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 400 \u043c\u0431\/\u0447\u0430\u0441 \u043d\u0430 \u0432\u043e\u0440\u043a\u0435\u0440. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 + \u043f\u043e\u0434\u043d\u044f\u0442\u044b\u0439 \u043b\u0438\u043c\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u0440\u0430\u0448 \u043a\u0430\u0436\u0434\u044b\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0432 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u2014 \u0441\u0438\u043c\u043f\u0442\u043e\u043c \u0441\u043f\u0440\u044f\u0442\u0430\u043d, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c.\u0420\u0435\u0448\u0438\u043b \u0441\u043d\u044f\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0434\u043b\u044f \u0434\u0438\u0444\u0444\u0430. kill -SIGUSR2 &lt;pid&gt; \u2014 \u0438 \u043e\u0431\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u043f\u0430\u0434\u0430\u044e\u0442 \u043f\u043e SIGABRT \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043c\u043f\u0430 (RSS 1.7 \u2192 3.5 \u0433\u0431 \u2192 OOM). \u041f\u043e V8-\u0431\u043b\u043e\u0433\u0443 \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~2\u0445 \u043e\u0442 heap. \u0423 \u043c\u0435\u043d\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 (Node 20, Nuxt SSR, heap_used \u2248 1.25 \u0433\u0431) \u043f\u0438\u043a\u043e\u0432\u044b\u0439 RSS \u0443\u0445\u043e\u0434\u0438\u043b \u0432 4.63 \u0433\u0431 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c ~3.7-5\u0445.\u041f\u043e \u043c\u043e\u0438\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043c\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0440\u0438 heap_used \u2264 15% \u043e\u0442 \u043b\u0438\u043c\u0438\u0442\u0430 (\u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 heap-\u0444\u043e\u0440\u043c\u0430\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 &#8212;max-old-space-size \u0438 \u043f\u043e\u0434\u043d\u044f\u0442 \u0441 1200 \u0434\u043e 5120.\u0414\u0430\u043c\u043f\u044b \u0448\u043b\u0438 \u043f\u043e 50-600 \u043c\u0431, Chrome DevTools \u0442\u0430\u043a\u0438\u0435 \u043d\u0435 \u0432\u044b\u0432\u043e\u0437\u0438\u0442 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u0432\u0430 Node-\u0441\u043a\u0440\u0438\u043f\u0442\u0430: diff-heap.mjs (\u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0434\u044b \u043f\u043e constructor name) \u0438 who-retains.mjs (\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u044b 4).\u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0443\u0442\u0435\u0447\u043a\u0438 \u0438 retainer chains=== TOP GROWERS BY constructor (delta_size desc) ===delta_size   delta_count   key +12.83 MB   +152,919      object\/Dep  +4.59 MB    +37,605      object\/ComputedRefImpl  +2.01 MB    +32,850      object\/RefImpl+760032 B      +7,917      object\/EffectScope+448800 B       +5,100     object\/ReactiveEffect+285600 B       +5,100     closure\/watchHandle\u041d\u0430 3 \u0434\u0430\u0442\u0430\u043f\u043e\u0438\u043d\u0442\u0430\u0445 (64 \u2192 154 \u2192 234 \u043c\u0431) \u0441\u0447\u0438\u0442\u0430\u044e \u043d\u0435 \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u044b, \u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u043e\u043a\u043d\u0430\u0445 0-15 \u0438 15-40 \u043c\u0438\u043d \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u2014 \u043d\u043e\u0440\u043c\u0438\u0440\u0443\u044e \u043d\u0430 \u00ab\u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u00bb (\u043e\u0434\u0438\u043d \u0443\u0442\u0435\u043a\u0448\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0430\u0431\u043b\/\u0441\u0442\u043e\u0440 \u0441 2 \u0432\u043e\u0442\u0447\u0430\u043c\u0438):\u0421\u0447\u0435\u0442\u0447\u0438\u043a\u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043d\u0430 1 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430watchHandle2ReactiveEffect2RefImpl~4.2ComputedRefImpl~3.4EffectScope~0.55Dep~11.6\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f = \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0448\u0442\u0430\u043c\u043f\u0443\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u042d\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue \u2014 watch() \u0431\u0435\u0437 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 scope. \u042d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430, \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u044b.who-retains.mjs \u0434\u043b\u044f object\/EffectScope (3318 \u043d\u043e\u0434): 49% \u0447\u0435\u0440\u0435\u0437 Object.scope &lt;- Object.component (Vue-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u0435 \u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u0430), 15% \u0447\u0435\u0440\u0435\u0437 EffectScope.prevScope chain, 5% \u0447\u0435\u0440\u0435\u0437 nuxtApp.ssrContext.__watcherHandles.\u0414\u0438\u0430\u0433\u043d\u043e\u0437\u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0432\u044f\u0437\u043a\u0435 Nuxt 3.18 + Vue 3.5.x SSR-teardown \u043d\u0435 \u0434\u0438\u0441\u043f\u043e\u0437\u0438\u0442 EffectScope: \u0432\u043e\u0442\u0447\u0438 \u0432 setup() \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \/ composable \/ Pinia-\u0441\u0442\u043e\u0440\u0430 \u043e\u0441\u0435\u0434\u0430\u044e\u0442 \u0432 heap. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435\u0442 \u00ab\u0440\u0430\u0437\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u00bb \u2014 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043b\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e watch \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0433\u043e \u0436\u0438\u0432\u044b\u043c. \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0439 Vue 3 + Nuxt 3-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0442\u043e\u0438\u0442 heap \u0434\u0438\u0444\u0444\u043e\u043c.\u042d\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043f\u0441\u0442\u0440\u0438\u043c-\u0431\u0430\u0433: nuxt#33705 (\u0446\u0438\u0444\u0440\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438, heap \u0441 80 \u0434\u043e 600 \u043c\u0431 \u0437\u0430 4 \u0447 \u043f\u0440\u0438 60 rpm), vuejs\/core#5208 \u0438 \u0434\u0440. \u043f\u043e \u0442\u0435\u043c\u0435.\u0418 \u0442\u0443\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0431\u043e\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0431\u044b\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u044c\u044e \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u043c \u0443\u0442\u0435\u0447\u043a\u0438: \u0442\u044b\u0441\u044f\u0447\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 URL (\u0442\u0438\u043f\u0430 \/oteli-v-sochi) = \u0442\u044b\u0441\u044f\u0447\u0438 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u043e\u0432 = \u0442\u044b\u0441\u044f\u0447\u0438 \u043d\u0435\u0443\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0442\u0447\u0435\u0439.\u0428\u0430\u0431\u043b\u043e\u043d \u0444\u0438\u043a\u0441\u0430 \u0438 6 \u0432\u043e\u043b\u043d \u043f\u0440\u0430\u0432\u043e\u043a\/\/ \u0411\u044b\u043b\u043e:watch(source, handler);\/\/ \u0421\u0442\u0430\u043b\u043e:if (import.meta.client) {  watch(source, handler);}\u0412 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u043c \u0431\u0430\u043d\u0434\u043b\u0435 \u0432\u043e\u0442\u0447\u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 (\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430, \u0441\u043a\u0440\u043e\u043b\u043b, document.title, login\/logout).\u0423\u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u0432\u043e\u0442\u0447\u0438 \u2014 \u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u0435\u0447\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435\u0414\u0435\u043f\u043b\u043e\u044e \u043d\u043e\u0432\u044b\u0439 \u0444\u0438\u043a\u0441, \u0441\u043d\u0438\u043c\u0430\u044e \u0437\u0430\u043c\u0435\u0440\u044b. \u041f\u0438\u043a 502\/504 \u0432 \u0447\u0430\u0441 \u2014 \u0441 2444 \u0434\u043e ~5. CPU \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u2014 \u0441 26-29% \u0434\u043e 1.8-2.3%. SSR-\u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438 heap 95% \u2014 \u0440\u0430\u043d\u044c\u0448\u0435 \u0443\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u0432 60-\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u0442\u0435\u043f\u0435\u0440\u044c 4.3 \u0441. \u0418 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435 \u043b\u043e\u043c\u0430\u0435\u0442: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u043e\u0441\u0442\u0430 RSS \u2014 \u0431\u044b\u043b\u0430 65 \u043c\u0431\/\u043c\u0438\u043d, \u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c 65 \u043c\u0431\/\u043c\u0438\u043d.\u041e\u0448\u0438\u0431\u043e\u043a \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u043b\u043e \u0432 ~500 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c. \u0412\u043e\u0442\u0447\u0438 \u0431\u044b\u043b\u0438 \u043d\u0435 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c GC-\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f: \u0442\u044b\u0441\u044f\u0447\u0438 \u0436\u0438\u0432\u044b\u0445 ReactiveEffect\/Dep \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 V8 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c minor-GC \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0433\u0440\u0430\u0444, 27% CPU \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u0443\u0441\u043e\u0440\u0430, \u0438 \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c SSR-\u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0432 60-\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 nginx -&gt; 504. \u0423\u0431\u0440\u0430\u043b \u0432\u043e\u0442\u0447\u0438 -&gt; \u0433\u0440\u0430\u0444 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 -&gt; CPU 2% -&gt; SSR \u0432 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0435. \u0410 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0442\u0435\u043a\u043b\u0430: \u044f \u0437\u0430\u043a\u0440\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443.\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u043e\u0442\u0447\u0435\u0440\u044b \u0438 \u0444\u0438\u043a\u0441 \u0432 Vue 3.5.31\u041d\u043e\u0432\u044b\u0439 \u0434\u0438\u0444\u0444 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u043b\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f. \u0422\u043e\u043f \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u2014 \u043d\u0435 watchHandle, \u0430:+70.66 MB   array\/+34.05 MB   string+12.83 MB   object\/Dep+10.19 MB   object\/Link          &lt;- \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue 3.5 +7.25 MB   object\/system \/ Context   &lt;- SSR async contextDep\/Link \u2014 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f doubly-linked-list \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 Vue 3.5, system \/ Context \u2014 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 SSR. \u041f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u0427\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b:1. useMediaQuery \u0438\u0437 VueUse \u043d\u0430 SSR \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 shallowRef \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437 user-agent.2. useApi \u0431\u0435\u0437 useFetch. \u0412 asyncData.js:123 \u0432\u0438\u0434\u043d\u043e: useFetch \u0441\u0442\u0440\u043e\u0438\u0442 key = computed(&#8230;) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 watch: [&#8230;watchSources, _fetchOptions] \u0432 useAsyncData, \u043f\u043b\u044e\u0441 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d watch(key, setImmediate, &#8230;). \u041a\u0430\u0436\u0434\u044b\u0439 useFetch \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 = \u043e\u0434\u0438\u043d-\u0434\u0432\u0430 \u0432\u043e\u0442\u0447\u0430 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u0443\u0442\u0435\u0447\u043a\u0438. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0445\u043e\u0436\u0443 \u0432 API \u0440\u0443\u043a\u0430\u043c\u0438: \u043d\u0430\u043f\u0438\u0441\u0430\u043b createServerManualApi \u0441 \u0440\u0443\u0447\u043d\u044b\u043c $fetch \u0438 shallowRef.3. \u0411\u0430\u043c\u043f Vue \u0434\u043e 3.5.31. \u0412 \u043f\u0430\u0442\u0447\u043d\u043e\u0443\u0442\u0435 \u0444\u0438\u043a\u0441 PR #14548: \u00abfix(server-renderer): cleanup component effect scopes after SSR render\u00bb. \u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f: scopes \u00abskip the normal unmount path\u00bb, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u00abscope-bound effects and cleanup callbacks persist beyond the request lifetime\u00bb. \u0421\u043b\u043e\u0432\u043e \u0432 \u0441\u043b\u043e\u0432\u043e \u043c\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0437. \u0411\u0430\u043c\u043f\u043d\u0443\u043b \u2014 \u0443\u0442\u0435\u0447\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u043b\u0430\u0441\u044c. \u0422\u043e\u0447\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 (3.5.31 \/ useApi \/ useMedia) \u044f \u043d\u0435 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u043b: \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b.\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442: \u0432 Vue 3.5.32 \u044d\u0442\u043e\u0442 \u0444\u0438\u043a\u0441 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 (PR #14674). #14548 \u0437\u0432\u0430\u043b scope.stop() \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c EffectScope \u043f\u043e\u0441\u043b\u0435 SSR-\u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u0430 \u0442\u043e\u0442 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 onScopeDispose()-\u043a\u043e\u043b\u0431\u044d\u043a\u0438. \u0412 Vue \u0435\u0441\u0442\u044c \u043d\u0435\u0433\u043b\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u00ab\u043d\u0430 SSR onScopeDispose \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00bb, \u043f\u043e\u0434 \u043d\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0443\u0447\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0430\u0431\u043b\u043e\u0432 \u2014 \u043f\u043e\u0441\u043b\u0435 3.5.31 \u043a\u043b\u0438\u043d\u0430\u043f \u0445\u0443\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0423\u0437\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 unwatch context.__watcherHandles \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c.\u0418 \u043d\u044e\u0430\u043d\u0441 \u043f\u043e\u0434 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439: \u0447\u0435\u0440\u0435\u0437 __watcherHandles \u0434\u0435\u0440\u0436\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e 5% \u0443\u0442\u0435\u0447\u043a\u0438, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c (49%) \u0447\u0435\u0440\u0435\u0437 Object.scope &lt;- Object.component. \u0423\u0437\u043a\u0438\u0439 \u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u043d\u0430\u0441 \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u043c\u0430\u043b\u0443\u044e \u0434\u043e\u043b\u044e. \u041d\u0430\u0441 \u0441\u043f\u0430\u0441\u0430\u043b\u0430 \u0440\u043e\u0432\u043d\u043e \u00ab\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u0443\u0431\u0430\u044f\u00bb #14548. \u0420\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u0442: \u0441\u0432\u043e\u0435\u0433\u043e onScopeDispose \u043d\u0435\u0442, VueUse-composables \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043b\u0438\u0431\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0440\u0435\u0441\u0443\u0440\u0441, \u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0449\u0435\u043d\u044b \u0440\u0443\u043a\u0430\u043c\u0438. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u0438&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481322","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481322","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=481322"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481322\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}