Какие знаешь механизмы модулей в JavaScript

Ответ

В JavaScript есть несколько механизмов модулей:

  1. CommonJS - используется в Node.js. Синтаксис require() и module.exports:
// module.js
module.exports = { foo: 'bar' };

// app.js
const module = require('./module.js');
  1. ES Modules (ESM) - стандарт ECMAScript. Использует import/export:
// module.js
export const foo = 'bar';

// app.js
import { foo } from './module.js';
  1. AMD (Asynchronous Module Definition) - для браузеров, асинхронная загрузка через define():
define(['dependency'], function(dependency) {
  return { foo: 'bar' };
});
  1. 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. Логично, чё. Но знать про остальных тоже надо, а то вдруг влезешь в какой-нибудь старый проект, а там... Пизда с ушами, одним словом.