В экосистеме Node.js и TypeScriptмодули позволяют разбивать код на изолированные части и переиспользовать их. npm — стандартный менеджер пакетов, который устанавливает внешние библиотеки, управляет зависимостями и публикует ваши собственные пакеты.
import/export — интерфейс модульности в ES-модулях (ESM).
require/module.exports — интерфейс модульности в CommonJS (CJS).
index.ts — «баррель» (barrel), агрегирующий экспорт из нескольких файлов.
npm — установка, обновление, публикация пакетов и управление версиями.
Базовая настройка ESM/TS
Чтобы import/export работали предсказуемо, согласуйте настройки package.json и tsconfig.json.
// src/math/add.ts
export function add(a: number, b: number): number {
return a + b;
}
// src/main.ts
// в ESM относительные пути должны включать расширение .js после компиляции
console.log(add(2, 3)); // 5
index.ts собирает и переэкспортирует сущности из подпакетов, упрощая импорт в потребителях.
// src/math/index.ts
export * from "./add.js";
export * from "./mul.js";
// src/main.ts
import {add, mul} from "./math";
// или короче:
import {add, mul} from "./math";
CommonJS кратко (для легаси)
// add.cjs
function add(a, b) {
return a + b;
}
module.exports = {add};
// main.cjs
const {add} = require("./add.cjs");
console.log(add(2, 3)); // 5
# сборка
npm run build
# локальная ссылка
npm link
# в другом проекте:
npm link @scope/my-lib
# альтернатива без link:
npm pack # создаст архив .tgz
npm install ./@scope-my-lib-1.0.0.tgz
Публикация пакета в npm
Добавьте README, LICENSE, корректные поля name, version, exports, types, files.
Проверьте, что приватные файлы не попадут в публикацию: настройте .npmignore или поле files.
npm login, затем npm publish (для scoped пакетов по умолчанию — как приватные; для публичной публикации используйте npm publish --access public).
Поддерживайте SemVer и ченджлог.
Лучшие практики и подводные камни
Единый стиль модулей: выбирайте ESM или CJS в проекте. Смешение — источник ошибок.
Явные публичные API: в index.ts экспортируйте только то, что обещаете пользователю.
Минимум побочных эффектов: не выполняйте код на верхнем уровне модуля, который что-то мутирует при импорте.
Жёсткие версии в проде: фиксируйте версии ключевых зависимостей и используйте npm ci.
Типы — часть контракта: актуальные .d.ts повышают DX и уменьшают баги у потребителей.
Проверка на циклы: используйте анализаторы (madge и др.) для выявления циклических импортов.