Ответ
В JavaScript есть несколько механизмов модулей:
- CommonJS - используется в Node.js. Синтаксис
require()иmodule.exports:
// module.js
module.exports = { foo: 'bar' };
// app.js
const module = require('./module.js');
- ES Modules (ESM) - стандарт ECMAScript. Использует
import/export:
// module.js
export const foo = 'bar';
// app.js
import { foo } from './module.js';
- AMD (Asynchronous Module Definition) - для браузеров, асинхронная загрузка через
define():
define(['dependency'], function(dependency) {
return { foo: 'bar' };
});
- UMD (Universal Module Definition) - универсальный формат, совместимый с CommonJS, AMD и глобальными переменными.
ES Modules сейчас являются стандартом и поддерживаются современными браузерами и Node.js. Они обеспечивают статический анализ зависимостей и лучшее дерево встряхивания (tree-shaking).
Ответ 18+ 🔞
Так, слушай, про модули в JavaScript. Ну, это пиздец, как у нас тут развелось систем, аж четыре штуки, блядь. Каждая со своим лицом и со своим бзиком.
Первая — это CommonJS. Это типа наш, отечественный, из Node.js. Там всё просто, как три копейки: require() и module.exports. Захотел что-то отдать — пишешь module.exports. Захотел взять — орёшь require(). Делов-то.
// module.js
module.exports = { foo: 'bar' };
// app.js
const module = require('./module.js');
Но потом пришли эти умники из ECMAScript и говорят: "Так, блядь, не порядок! Надо по-европейски, с import и export!" И родились ES Modules (ESM). Теперь это типа стандарт, все должны кланяться. И вроде логично: чётко, статично, дерево встряхивать (tree-shaking) удобно. Но, конечно, пока всё устаканилось, мозги вынесли овердохуища.
// module.js
export const foo = 'bar';
// app.js
import { foo } from './module.js';
А для браузеров, когда интернет был медленный, как говно в ступе, придумали AMD. Чтоб асинхронно, не тормозя всё, модули подгружать. Там своя магия с define(). Выглядит, конечно, как заклинание древнего эльфа, но работало.
define(['dependency'], function(dependency) {
return { foo: 'bar' };
});
И наконец, хитрая жопа — UMD. Это типа универсальный солдат, который пытается угодить всем: и CommonJS, и AMD, и просто глобальным переменкам, если что. Код там получается такой, что в рот меня чих-пых, но работает везде, где ни копни.
Короче, ёпта, сейчас все в основном на ES Modules переходят. Они и в браузерах родные, и в Node.js. Логично, чё. Но знать про остальных тоже надо, а то вдруг влезешь в какой-нибудь старый проект, а там... Пизда с ушами, одним словом.