<?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: Cannot use import statement outside a module — как исправить ошибку]]></title><description><![CDATA[<p dir="auto">В Node.js часто возникает ошибка <strong>Cannot use import statement outside a module</strong>. Она появляется, когда вы пытаетесь использовать современный синтаксис <code>import</code> в проекте, который по умолчанию работает на CommonJS. Эта проблема тормозит разработку, но её легко ��справить несколькими способами.</p>
<p dir="auto">Понимание причины поможет избежать повторений. Мы разберём, почему Node.js не понимает <code>import</code>, и покажем проверенные решения. Вы узнаете, как настроить проект под ES6-модули, перейти на CommonJS или использовать флаги. После этого код заработает без лишних хлопот.</p>
<h2>Почему возникает ошибка и что такое модули в Node.js</h2>
<p dir="auto">Node.js по умолчанию использует систему <strong>CommonJS</strong> с <code>require()</code> и <code>module.exports</code>. Это старый стандарт, который не понимает <code>import</code>/<code>export</code> из ES6. Когда вы пишете <code>import { func } from './module.js'</code>, движок думает, что файл — это обычный скрипт, а не модуль.</p>
<p dir="auto">Проблема типична для новых проектов на <strong>ES6-модулях</strong>, где хочется tree-shaking и статического анализа. Представьте: вы копируете код из браузерного примера в серверный скрипт — и бац, ошибка. Node.js с версии 12+ поддерживает ES6, но требует явной активации. Без неё парсер ругается на неподдерживаемый синтаксис.</p>
<p dir="auto">Это подводит к первым шагам исправления. Давайте разберём варианты по шагам.</p>
<ul>
<li><strong>Проверьте версию Node.js</strong>: Запустите <code>node -v</code>. ES6-модули стабильно работают с v14+. Если версия старая, обновите.</li>
<li><strong>Анализ package.json</strong>: Отсутствие поля <code>"type": "module"</code> — частая причина. Node.js интерпретирует <code>.js</code> как CommonJS.</li>
<li><strong>Расширение файлов</strong>: <code>.js</code> по умолчанию — CommonJS, <code>.mjs</code> — ES-модуль. Простая переименование решает 30% случаев.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Система модулей</th>
<th>Синтаксис импорта</th>
<th>Требования Node.js</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CommonJS</strong></td>
<td><code>require()</code></td>
<td>По умолчанию</td>
</tr>
<tr>
<td><strong>ES6</strong></td>
<td><code>import</code></td>
<td><code>"type": "module"</code> или <code>.mjs</code></td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: В ES6 всегда указывайте расширения в путях, типа <code>./module.js</code>, иначе ошибка persists.</p>
<h2>Решение 1: Активация ES6-модулей через package.json</h2>
<p dir="auto">Самый удобный способ для ц��лого проекта — добавить настройку в <strong>package.json</strong>. Это говорит Node.js: “Все <code>.js</code>-файлы здесь — ES-модули”. Откройте файл и вставьте строку <code>"type": "module"</code>.</p>
<p dir="auto">После этого <code>import</code> заработает везде. Но учтите: весь проект перейдёт на ES6, так что <code>require()</code> сломается. Если в коде есть legacy-библиотеки, это вызовет новые проблемы. Пример: простой сервер на Express с импортами.</p>
<pre><code class="language-javascript">// package.json
{
  "type": "module",
  "dependencies": { "express": "^4.18.0" }
}

// app.js
import express from 'express';
const app = express();
app.get('/', (req, res) =&gt; res.send('Hello!'));
app.listen(3000);
</code></pre>
<p dir="auto">Запуск: <code>node app.js</code> — и вуаля, без ошибок. Это решение масштабируется для больших приложений.</p>
<ol>
<li>Создайте или отредактируйте <code>package.json</code>.</li>
<li>Добавьте <code>"type": "module"</code> на верхний уровень.</li>
<li>Укажите расширения в импортах: <code>import './file.js'</code>.</li>
<li>Перезапустите скрипт.</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Просто</strong> для всего проекта</td>
<td>Требует рефакторинга CommonJS</td>
</tr>
<tr>
<td>Поддержка tree-shaking</td>
<td>Не для микс-проектов</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Нюанс</em>: Если проект на TypeScript, настройте <code>tsconfig.json</code> с <code>"module": "ESNext"</code>.</p>
<h2>Решение 2: Переход на CommonJS или использование .mjs</h2>
<p dir="auto">Если не хотите менять весь проект, вернитесь к <strong>CommonJS</strong>. Замените <code>import</code> на <code>require()</code>, <code>export</code> на <code>module.exports</code>. Это быстро, но теряет преимущества ES6, вроде статических импортов.</p>
<p dir="auto">Пример трансформации:</p>
<pre><code class="language-javascript">// Было (ES6)
export const sum = (a, b) =&gt; a + b;

// Стало (CommonJS)
const sum = (a, b) =&gt; a + b;
module.exports = { sum };

// Импорт
// Было: import { sum } from './utils.js';
// Стало: const { sum } = require('./utils');
</code></pre>
<p dir="auto">Альтернатива — переименуйте файл в <code>app.mjs</code>. Node.js сразу поймёт это как ES-модуль, без package.json. Идеально для тестов или скриптов.</p>
<ul>
<li><strong>Для отдельных файлов</strong>: <code>mv app.js app.mjs</code>, затем <code>node app.mjs</code>.</li>
<li><strong>Destructuring работает</strong>: <code>const { func } = require('./mod')</code>.</li>
<li><strong>Бандлеры спасут</strong>: Webpack или Babel транслируют ES6 в CommonJS автоматически.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Когда использовать</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CommonJS</strong></td>
<td>Legacy-код, простые скрипты</td>
</tr>
<tr>
<td><strong>.mjs</strong></td>
<td>Быстрые тесты, прототипы</td>
</tr>
<tr>
<td><strong>Babel</strong></td>
<td>Совместимость с IE/старым Node</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Совет</em>: В продакшене комбинируйте с bundler’ами для оптимизации.</p>
<h2>Дополнительные инструменты и подводные камни</h2>
<p dir="auto">Иногда базовые способы не помогают — из-за bundler’ов или браузера. В <strong>браузере</strong> добавьте <code>type="module"</code> в <code>&lt;script&gt;</code>. Node.js флаг <code>--experimental-modules</code> устарел, используйте современные версии.</p>
<p dir="auto">Проверьте пути: относительные <code>./</code> обязательны в ES6. Абсолютные или без расширений — ошибка. Для TypeScript компилируйте с <code>tsc --module esnext</code>.</p>
<pre><code class="language-html">&lt;!-- Браузер --&gt;
&lt;script type="module" src="app.js"&gt;&lt;/script&gt;
</code></pre>
<ol>
<li><strong>Webpack/Vite</strong>: Настройте <code>output.library.type: 'module'</code>.</li>
<li><strong>Babel</strong>: <code>.babelrc</code> с <code>@babel/preset-env</code>.</li>
<li><strong>Dynamic import</strong>: <code>const mod = await import('./file.js')</code> — асинхронно.</li>
<li><strong>npm/yarn</strong>: <code>npx</code> для разовых скриптов.</li>
</ol>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Инструмент</th>
<th>Преимущества</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Vite</strong></td>
<td>Быстрая HMR, ES6 из коробки</td>
</tr>
<tr>
<td><strong>Webpack</strong></td>
<td>Бандлинг + polyfill’y</td>
</tr>
<tr>
<td><strong>esbuild</strong></td>
<td>Суперскорость</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Предупреждение</em>: Микс CommonJS/ES6 в одном проекте — источник багов.</p>
<h2>Когда выбрать каждый подход под вашу задачу</h2>
<p dir="auto">Ошибку можно исправить по-разному, в зависимости от проекта. Для серверов на чистом Node.js берите <code>package.json</code> с <code>type: module</code>. Маленькие скрипты — <code>.mjs</code> или CommonJS. Большие apps требуют bundler’ов вроде Vite.</p>
<p dir="auto">Оставшиеся нюансы: динамические импорты, CJS-библиотеки в ESM (используйте <code>createRequire</code>). Подумайте о миграции на ESM полностью — будущее за ним. В новых версиях Node.js CommonJS потихоньку уходит.</p>
<p dir="auto">Это базовые инструменты для стабильного кода. Дальше экспериментируйте с top-level await в ESM — там ещё фишки ждут.</p>
]]></description><link>https://forum.exlends.ru/topic/591/node.js-cannot-use-import-statement-outside-a-module-kak-ispravit-oshibku</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:11:53 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/591.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Feb 2026 06:11:54 GMT</pubDate><ttl>60</ttl></channel></rss>