<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Node.js 24: встроенный TypeScript и ESLint 10 для модерна]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/9b/ab/29/1774173248739-generated_1774173217397.webp" alt="Обложка: Node.js 24: Встроенный ESLint v10 с TypeScript для type-aware линтинга в ESM-модулях" class=" img-fluid img-markdown" /></p>
<p dir="auto">Экосистема Node.js сделала очередной рывок вперед. Node.js 24 привносит встроенную поддержку TypeScript прямо из коробки, а ESLint 10 переходит на плоский конфиг и наконец-то правильно работает с JSX. Если ты ещё не обновился - самое время разобраться, что изменилось и почему это важно.</p>
<p dir="auto">Включена поддержка ESM как стандарта для модульной разработки. Теперь можно писать код на современном JavaScript без лишних танцев с CommonJS. А если ты работаешь с TypeScript - вообще боль кончилась.</p>
<h2>TypeScript прямо в Node.js: без танцев с компилятором</h2>
<p dir="auto">До недавних пор запустить TypeScript-файл в Node.js означало либо предварительно компилировать его через <code>tsc</code>, либо использовать какой-нибудь бойлерплейт вроде <code>ts-node</code>. Это было раздражающе медленно и отнимало время на настройку.</p>
<p dir="auto">Node.js 24 поддерживает <strong>type stripping</strong> - механизм, который на лету стирает типы и запускает код. Это работает для erasable-синтаксиса: обычных type annotations, interfaces, type-алиасов. Просто пиши <code>node index.ts</code> и готово.</p>
<p dir="auto">Но есть важный нюанс: полная трансформация TypeScript-функционала (enum, декораторы, path aliases, namespace) по-прежнему требует честного компилятора. Node.js не будет генерировать JavaScript код для таких конструкций - выбросит ошибку. Если тебе нужна полная поддержка - используй <code>tsc</code> как и раньше. Это логично: встроенная поддержка - это не замена TypeScript-компилятору, а ускорение простого случая.</p>
<p dir="auto">Чтобы включить type stripping, просто добавь флаг при запуске или настрой <code>tsconfig.json</code> с опцией <code>erasableSyntaxOnly: true</code>. Вот что примерно должно быть в конфиге:</p>
<ul>
<li><code>"noEmit": true</code> - TypeScript не будет генерировать JS (это делает Node)</li>
<li><code>"target": "esnext"</code> - не опускай синтаксис на старые версии</li>
<li><code>"module": "nodenext"</code> - используй современные модули</li>
<li><code>"rewriteRelativeImportExtensions": true</code> - Node.js переписывает расширения импортов</li>
<li><code>"verbatimModuleSyntax": true</code> - точная запись того, что ты импортируешь</li>
</ul>
<p dir="auto">Преимущество очевидно: <strong>нет source maps, нет дополнительного процесса сборки, быстрее старт приложения</strong>. Идеально для скриптов, CLI-утилит и быстрого прототипирования.</p>
<h2>ESLint 10: плоский конфиг и наконец-то JSX</h2>
<p dir="auto">ESLint долгое время был болезненной точкой в экосистеме JavaScript. Конфигурация через <code>.eslintrc.json</code> или <code>.eslintrc.js</code> была запутанной, перегруженной вложенностью и магией. ESLint 10 переписал всё с нуля.</p>
<p dir="auto"><strong>Главное изменение</strong>: старый формат конфига больше не поддерживается. Теперь всё идет через <code>eslint.config.js</code> (или <code>eslint.config.mjs</code> для ESM). Конфиг теперь - это просто массив объектов конфигурации. Звучит просто, и это действительно просто.</p>
<p dir="auto">Второе большое изменение касается JSX. Раньше ESLint не трекил JSX-идентификаторы как полноценные ссылки в scope. Это приводило к странным false positives: линтер говорил, что переменная не используется, хотя ты явно используешь её в JSX-элементе. Теперь это работает корректно, и анализ scope соответствует тому, что разработчик ожидает.</p>
<p dir="auto">Переход на новый конфиг требует времени, но оно того стоит:</p>
<ul>
<li><strong>Плоский формат</strong> - легче читать и поддерживать</li>
<li><strong>ESM-native</strong> - используются <code>import</code>, а не <code>require</code></li>
<li><strong>Явное указание файлов</strong> - для каждого set конфигов ты точно знаешь, какие файлы попадают под правила</li>
<li><strong>Встроенные type definitions</strong> - Espree и ESLint Scope теперь поставляются с TypeScript-дефинициями (вместо Definitely Typed)</li>
</ul>
<p dir="auto">Вот пример минимального конфига для TypeScript-проекта:</p>
<pre><code class="language-javascript">import js from "@eslint/js";
import typescript from "typescript-eslint";
import globals from "globals";

export default typescript.config(
  js.configs.recommended,
  ...typescript.configs.recommendedTypeChecked,
  {
    languageOptions: {
      globals: globals.node,
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname,
      },
    },
  },
  {
    files: ["**/*.js", "**/*.mjs"],
    ...typescript.configs.disableTypeChecked,
  },
  {
    ignores: ["dist/**", "node_modules/**"],
  }
);
</code></pre>
<p dir="auto">Видишь? <strong>Нет магии, всё понятно</strong>. Для React + Next.js будет чуть больше конфигов, но логика та же - ты явно указываешь, что гдетится.</p>
<h2>TypeScript-aware линтинг без боли</h2>
<p dir="auto">Это килллер-фича для тех, кто работает с типами. <code>typescript-eslint</code> теперь неразрывно связана с ESLint 10, и type-aware правила работают наконец нормально.</p>
<p dir="auto">Типизированный линтинг - это когда ESLint не просто смотрит на синтаксис, а понимает семантику: какого типа переменная, безопасна ли операция, может ли быть undefined. Например, правило <code>no-unsafe-member-access</code> или <code>strict-void-return</code> работают корректно только если ESLint понимает типы.</p>
<p dir="auto">Прежде это было медленно и требовало костылей. Теперь с <code>typescript-eslint</code> 8.44+ и выше интеграция гладкая:</p>
<ul>
<li><strong>projectService: true</strong> - автоматически подхватывает <code>tsconfig.json</code></li>
<li><strong>type-aware rules</strong> включаются просто через спред конфига</li>
<li><strong>Performance</strong> - оптимизирована кеширование типов</li>
</ul>
<p dir="auto">Что даёт type-aware линтинг:</p>
<ul>
<li>Ловит ошибки, которые статический анализ просто не видит</li>
<li>Помогает с refactoring - если ты поменял тип, линтер скажет, где это сломалось</li>
<li>Предотвращает гвозди наподобие <code>any</code> в критичных местах</li>
<li>Работает с дженериками, conditional types, mapped types</li>
</ul>
<p dir="auto">Это особенно важно, если ты работаешь с большим кодбейсом. TypeScript ловит compile-time ошибки, линтер ловит runtime ошибки и код-смели - вместе они делают разработку предсказуемой.</p>
<h2>ESM везде: модули как надо</h2>
<p dir="auto">Node.js 24 делает ESM полноценным гражданином платформы. Раньше CommonJS и ESM сосуществовали в напряженном мире: нужно было помнить о расширениях файлов, о полях в <code>package.json</code>, о совместимости либ.</p>
<p dir="auto">Теперь достаточно добавить <code>"type": "module"</code> в <code>package.json</code> - и весь проект работает с ESM. Или используй расширение <code>.mjs</code> для явного обозначения.</p>
<p dir="auto">Преимущества ESM в Node.js 24:</p>
<ul>
<li><strong>Tree-shaking</strong> - bundler лучше понимает, что используется, убирает мёртвый код</li>
<li><strong>Статическая структура</strong> - импорты в топе файла, что проще для анализа и оптимизации</li>
<li><strong>Стандарт браузера</strong> - тот же синтаксис, что в браузере, меньше путаницы</li>
<li><strong>Асинхронная загрузка</strong> - модули грузятся параллельно, потенциально быстрее</li>
</ul>
<p dir="auto">Единое предупреждение: если ты используешь ESM с TypeScript и встроенной поддержкой Node.js, убедись, что в конфиге <code>module: "nodenext"</code> и <code>rewriteRelativeImportExtensions: true</code>. Это нужно, чтобы импорты содержали расширения файлов (<code>.js</code> вместо просто имени модуля).</p>
<h2>На что обратить внимание при миграции</h2>
<p dir="auto">Обновление Node.js и ESLint - это не просто скачал новую версию и забыл. Есть нюансы, которые сломают сборку или CI/CD.</p>
<p dir="auto">Сначала про Node.js 24 и TypeScript:</p>
<ul>
<li>Если в коде используются <strong>enum</strong> или <strong>декораторы</strong> - встроенная поддержка не поможет, нужен <code>tsc</code></li>
<li>Type-stripping работает только для erasable-синтаксиса - обычных типов и интерфейсов</li>
<li><code>import.meta.dirname</code> - новое API для получения текущей директории (аналог <code>__dirname</code> из CommonJS)</li>
<li>Убедись, что <code>tsconfig.json</code> содержит правильные опции для type-stripping</li>
</ul>
<p dir="auto">Далее про ESLint 10:</p>
<ul>
<li><strong>Старые <code>.eslintrc.*</code> файлы больше не работают</strong> - нужно переписать в <code>eslint.config.js</code></li>
<li>Требуется <strong>Node.js 20.19+</strong> (версии ниже просто не запустятся)</li>
<li>JSX-правила теперь более строгие - может появиться больше ошибок в коде с JSX</li>
<li>Плагины (react, vue, angular и т.д.) должны быть обновлены до версий, которые поддерживают ESLint 10</li>
</ul>
<p dir="auto">Таблица совместимости основных либ:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Либа</th>
<th>Требуемая версия</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td>typescript-eslint</td>
<td>8.0+</td>
<td>Type-aware линтинг</td>
</tr>
<tr>
<td>eslint-plugin-react</td>
<td>7.32+</td>
<td>Поддержка flat config</td>
</tr>
<tr>
<td>eslint-plugin-next</td>
<td>15+</td>
<td>Для Next.js проектов</td>
</tr>
<tr>
<td>eslint-plugin-vue</td>
<td>9+</td>
<td>Для Vue проектов</td>
</tr>
<tr>
<td>Node.js</td>
<td>20.19+ или 24+</td>
<td>Обязательное требование</td>
</tr>
</tbody>
</table>
<h2>Что осталось за кадром</h2>
<p dir="auto">Эти три фичи - TypeScript в Node.js, ESLint 10 с плоским конфигом и полноценный ESM - это фундамент современной разработки на JavaScript. Они делают экосистему более когерентной и убирают боль-точки, которые раздражали лет пять.</p>
<p dir="auto">Есть ещё мелочи: например, в ESLint 10.1.0 добавлена поддержка bulk suppressions через API (не только CLI), что полезно для IDE и LSP-сервисов. Или новые правила в typescript-eslint, которые ловят ещё более тонкие проблемы с типами. Но главное - стандартизация и упрощение. Та база, на которой разработчик теперь может строить без лишних конфигурационных танцев.</p>
]]></description><link>https://forum.exlends.ru/topic/1834/node.js-24-vstroennyj-typescript-i-eslint-10-dlya-moderna</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:53:18 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1834.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Mar 2026 09:54:09 GMT</pubDate><ttl>60</ttl></channel></rss>