Avatar ·

Как подключить один JavaScript файл внутри другого? Импорт и экспорт кода

Всем привет! Я только начал изучать JavaScript и пишу свой первый небольшой проект. У меня есть файл `utils.js`, где я храню вспомогательные функции, например, функцию для форматирования даты, и основной файл `script.js`, где я пишу логику страницы. Проблема в том, что я не знаю, как из `script.js` вызвать функцию, которая объявлена в `utils.js`. Я пробовал просто написать `` в HTML перед `` — это работает, но код становится грязным, особенно когда файлов много. Мне кажется, что должен быть способ сделать это прямо внутри JavaScript, как в других языках (например, `#include` в C или `import` в Python). Вот пример моего кода: **utils.js:** ```javascript function formatDate(date) { const options = { year: 'numeric', month: 'long', day: 'numeric' }; return date.toLocaleDateString('ru-RU', options); } ``` **script.js:** ```javascript // Как мне импортировать formatDate сюда? const today = new Date(); console.log(formatDate(today)); // Ошибка: formatDate is not defined ``` Я слышал про `require` в Node.js, про `import` и `export`, но не понимаю, что сейчас считается правильным способом, особенно для браузера. Подскажите, пожалуйста, как грамотно организовать код и подключать файлы друг к другу? Заранее спасибо! <<>>

Современный способ: ES-модули (import / export)

Начиная с ES6 (2015 год) в JavaScript появилась встроенная модульная система, которая работает и в браузерах, и в Node.js. Это самый правильный и рекомендуемый подход для организации кода.

Шаг 1. Экспортируйте функцию из utils.js

Добавьте ключевое слово export перед объявлением функции:

// utils.js
export function formatDate(date) {
  const options = { year: 'numeric', month: 'long', day: 'numeric' };
  return date.toLocaleDateString('ru-RU', options);
}

Вы также можете экспортировать несколько функций или переменных:

// utils.js
export function formatDate(date) { /* ... */ }
export const PI = 3.14159;
export function greet(name) { return `Привет, ${name}!`; }

Шаг 2. Импортируйте в script.js

// script.js
import { formatDate } from './utils.js';

const today = new Date();
console.log(formatDate(today)); // Работает!

Шаг 3. Подключите главный скрипт в HTML с атрибутом type="module"

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Модули в JS</title>
</head>
<body>
  <!-- Важно: type="module" -->
  <script type="module" src="script.js"></script>
</body>
</html>

Важные моменты про модули

  • Относительный путь: В импорте обязательно указывайте ./ (текущая папка) или ../ (родительская папка). Просто 'utils.js' не сработает.
  • Расширение файла: В браузере нужно указывать полное имя файла с расширением .js.
  • Строгий режим: Модули автоматически работают в strict mode. Переменные не попадают в глобальную область видимости.
  • Один раз выполняется: Если вы импортируете один и тот же модуль в нескольких файлах, его код выполнится только один раз.
  • Работа через сервер: Модули не работают с локальными файлами через file://. Используйте локальный сервер (например, npx serve, live-server в VS Code или просто откройте через Python: python -m http.server).

Альтернатива: экспорт по умолчанию (default export)

Если у вас в файле только одна главная функция или класс, удобно использовать экспорт по умолчанию:

// utils.js
export default function formatDate(date) {
  // ...
}

// script.js
import formatDate from './utils.js'; // без фигурных скобок

Смешанный экспорт

Можно комбинировать именованные экспорты и экспорт по умолчанию:

// utils.js
export default function formatDate(date) { /* ... */ }
export const PI = 3.14159;

// script.js
import formatDate, { PI } from './utils.js';

Используйте модули всегда, когда пишете современный JavaScript. Это делает код чистым, предсказуемым и удобным для поддержки.

<<>>

Классический способ через глобальные переменные (для старых проектов)

Если вы работаете с очень старым кодом или по каким-то причинам не можете использовать ES-модули, можно подключить файлы через HTML в правильном порядке:

<script src="utils.js"></script>
<script src="script.js"></script>

В utils.js все функции и переменные объявляются без export:

// utils.js
function formatDate(date) {
  // ...
}
// Всё, что объявлено так, становится глобальным

Недостатки этого подхода:

  • Все функции и переменные попадают в глобальную область видимости (window). Это может вызвать конфликты имён.
  • Порядок подключения критичен — если перепутать, код упадёт с ошибкой.
  • Сложно отследить зависимости между файлами.

Этот метод можно использовать только для маленьких проектов или для быстрого прототипирования. Для серьёзной разработки всегда выбирайте ES-модули.