Ответ
В Node.js существует две основные системы модулей: CommonJS (стандартная, историческая) и ES Modules (современная). Способ подключения зависит от используемой системы.
1. CommonJS (использует require()):
Это классический способ, используемый по умолчанию в файлах с расширением .js или .cjs.
// Подключение встроенного (core) модуля
const fs = require('fs');
// Подключение стороннего модуля из node_modules
const express = require('express');
const { Model } = require('sequelize'); // Деструктуризация
// Подключение локального файла
const myUtility = require('./utils/myUtility');
const config = require('../config'); // Ищет config.js или config/index.js
2. ES Modules (использует import/export):
Чтобы использовать ES Modules, нужно либо указать "type": "module" в package.json, либо использовать расширение .mjs для файлов.
// package.json: { "type": "module" }
// Подключение встроенного модуля (может потребовать префикс 'node:')
import fs from 'fs/promises';
import { createServer } from 'node:http';
// Подключение стороннего модуля
import express from 'express';
import { Router } from 'express';
// Подключение локального файла
import { helperFunc } from './lib/helpers.js'; // Расширение .js обязательно
В одном проекте можно использовать обе системы, но для этого требуется аккуратная настройка и понимание различий в разрешении путей.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Сидишь ты такой, пишешь код, и тут — бац! — нужно модуль какой-то подключить. А способов-то, оказывается, не один, а целых два, и они друг друга, мягко говоря, не очень любят. Как будто два кота в одном мешке, только один с винтом.
1. CommonJS (старый добрый require()):
Это, бля, классика жанра. Как дедовский москвич — громыхает, бензина жрёт дохуя, но зато едет и все его понимают. Работает в обычных .js файлах по умолчанию. Всё просто: хочешь что-то — require() его в рот мне чих-пых.
// Берёшь встроенную фигню из коробки
const fs = require('fs');
// Тянешь какую-то левую библиотеку из node_modules
const express = require('express');
const { Model } = require('sequelize'); // Вытащил только нужную часть — хитрая жопа!
// Или свой, родной, файлик рядом
const myUtility = require('./utils/myUtility');
const config = require('../config'); // Он сам догадается найти config.js или залезть в index.js
Вот и вся магия. Никаких танцев с бубном.
2. ES Modules (модный import/export):
А это уже новое веяние, современное. Чтобы это чудо заработало, надо либо в package.json прописать "type": "module", либо файлы называть .mjs. Иначе Node.js на тебя посмотрит как на идиота и скажет «чё?».
// Предположим, в package.json уже стоит "type": "module"
// Берёшь встроенный модуль (иногда лучше с префиксом 'node:' писать, чтоб наверняка)
import fs from 'fs/promises';
import { createServer } from 'node:http';
// Тащишь стороннюю библиотеку
import express from 'express';
import { Router } from 'express';
// Подключаешь свой файл (и тут ОБЯЗАТЕЛЬНО расширение .js указывай, иначе овердохуища ошибок будет!)
import { helperFunc } from './lib/helpers.js';
Самое весёлое начинается, когда ты пытаешься смешать это всё в одном проекте. Тут уже доверия ебать ноль. Одна система другую не понимает, пути разрешаются по-разному — в общем, пиздец, а не разработка. Так что, чувак, лучше определись сразу, на чём будешь ехать, а то получится мартышлюшка с гранатой.