\n\n```\n\n**Минусы:**\n- Глобальная загрязнение\n- Без истинной инкапсуляции\n\n### 5. YModules (Яндекс)\n\n**YModules** — специализированная система модульности от Яндекса:\n\n```javascript\nmodules.define(\"my-module\", [\"other-module\"], function(provide, OtherModule) {\n var MyModule = {\n someMethod: function() {\n return OtherModule.doSomething();\n }\n };\n provide(MyModule);\n});\n\nrequire([\"my-module\"], function(MyModule) {\n MyModule.someMethod();\n});\n```\n\n**Особенности:**\n- Асинхронная загрузка\n- Интеграция с сборщиком Bem tools\n\n### 6. Webpack/Rollup конфигурация как система модульности\n\nСборщики определяют, как организованы модули:\n\n```javascript\n// webpack.config.js\nmodule.exports = {\n entry: \"./src/index.js\",\n output: {\n filename: \"bundle.js\",\n libraryTarget: \"umd\" // Выходной формат UMD\n },\n module: {\n rules: [{\n test: /\\\\.js$/,\n use: \"babel-loader\"\n }]\n }\n};\n```\n\nСборщик преобразует ES6 модули в нужный формат.\n\n### 7. Web Components (Shadow DOM)\n\n**Web Components** — стандарт для создания переиспользуемых компонентов с инкапсуляцией:\n\n```javascript\nclass MyElement extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n connectedCallback() {\n this.shadowRoot.innerHTML = `\n \n

Hello from Web Component

\n `;\n }\n}\n\ncustomElements.define(\"my-element\", MyElement);\n```\n\n**Особенности:**\n- Инкапсуляция CSS и HTML\n- Работает во всех браузерах (с полифиллами)\n- Стандарт W3C\n\n## Сравнительная таблица\n\n| Система | Синтаксис | Область | Статус | Когда использовать |\n|---------|-----------|---------|--------|--------------------|\n| **ES6** | `import/export` | Universal | Стандарт | Всегда, современный код |\n| **CommonJS** | `require/module.exports` | Node.js | De facto | Node.js |\n| **AMD** | `define/require` | Браузер | Legacy | Старые проекты |\n| **UMD** | IIFE обёртка | Universal | Legacy | Кроссплатформные библиотеки |\n| **IIFE** | Паттерн | Браузер | Legacy | Инкапсуляция без модульности |\n\n## Историческая эволюция\n\n1. **Ранние 2010s** — AMD (RequireJS), IIFE\n2. **2014-2015** — CommonJS популяризирована Node.js\n3. **2015** — ES6 (ES2015) стандарт модулей\n4. **2020+** — ES6 модули почти везде\n\n## Рекомендация на практике\n\n**Используйте только ES6 модули:**\n```javascript\n// Правильно\nimport { Component } from \"./Component.js\";\nexport default MyComponent;\n```\n\nОстальные системы нужны только для поддержки legacy-кода или специфических случаев (кроссплатформные библиотеки через UMD).","dateCreated":"2026-04-03T17:51:17.795365","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Какие знаешь системы модульности кроме ECMAScript и CommonJS?

1.2 Junior🔥 71 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Системы модульности в JavaScript

Кроме ES6 модулей и CommonJS существует несколько других подходов к организации кода.

1. AMD (Asynchronous Module Definition)

AMD — стандарт для асинхронной загрузки модулей в браузере. Основная библиотека — RequireJS.

// Определение модуля
define("myModule", ["dep1", "dep2"], function(dep1, dep2) {
  return {
    sayHello: function() {
      console.log("Hello from myModule");
    }
  };
});

// Использование модуля
require(["myModule"], function(myModule) {
  myModule.sayHello();
});

Особенности:

  • Асинхронная загрузка — модули загружаются параллельно
  • Зависимости передаются как массив строк
  • Используется в основном в наследии (legacy код)

Плюсы:

  • Подходит для браузеров
  • Параллельная загрузка модулей

Минусы:

  • Синтаксис громоздкий
  • Сложнее для понимания новичками
  • Практически вытеснена ES6 модулями

2. UMD (Universal Module Definition)

UMD — универсальный формат, работающий и в браузере, и в Node.js:

(function(root, factory) {
  if (typeof define === "function" && define.amd) {
    // AMD
    define(["dep1"], factory);
  } else if (typeof module === "object" && module.exports) {
    // CommonJS
    module.exports = factory(require("dep1"));
  } else {
    // Глобальная переменная
    root.myLib = factory(root.dep1);
  }
}(typeof self !== "undefined" ? self : this, function(dep1) {
  // Код модуля
  return {
    greet: function() { return "Hello"; }
  };
}));

Когда используется:

  • Библиотеки (jQuery, lodash исторически)
  • Необходимость поддержки разных окружений

Плюсы:

  • Работает везде
  • Обратная совместимость

Минусы:

  • Синтаксис очень громоздкий
  • Потребление памяти больше

3. IIFE (Immediately Invoked Function Expression)

IIFE — самовызывающаяся функция, создающая область видимости:

const app = (function() {
  // Приватные переменные
  const privateData = "secret";

  // Приватная функция
  function privateMethod() {
    console.log(privateData);
  }

  // Публичный интерфейс
  return {
    publicMethod: function() {
      privateMethod();
    }
  };
})();

app.publicMethod(); // Логирует: secret
console.log(app.privateData); // undefined (приватное)

Особенности:

  • Паттерн, а не стандарт
  • Создаёт область видимости через функцию
  • Используется для инкапсуляции

Применение:

  • Старый код jQuery
  • Плагины для браузера
  • Глобальная область видимости

4. Модули как неймспейсы

Проще всего — использовать объекты для группировки:

// myApp.js
const MyApp = {
  utils: {
    formatDate: function(date) {
      return date.toLocaleDateString();
    }
  },
  api: {
    fetchUsers: async function() {
      return fetch("/api/users").then(r => r.json());
    }
  }
};

// main.js
<script src="myApp.js"></script>
<script>
  MyApp.utils.formatDate(new Date());
  MyApp.api.fetchUsers();
</script>

Минусы:

  • Глобальная загрязнение
  • Без истинной инкапсуляции

5. YModules (Яндекс)

YModules — специализированная система модульности от Яндекса:

modules.define("my-module", ["other-module"], function(provide, OtherModule) {
  var MyModule = {
    someMethod: function() {
      return OtherModule.doSomething();
    }
  };
  provide(MyModule);
});

require(["my-module"], function(MyModule) {
  MyModule.someMethod();
});

Особенности:

  • Асинхронная загрузка
  • Интеграция с сборщиком Bem tools

6. Webpack/Rollup конфигурация как система модульности

Сборщики определяют, как организованы модули:

// webpack.config.js
module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "bundle.js",
    libraryTarget: "umd" // Выходной формат UMD
  },
  module: {
    rules: [{
      test: /\\.js$/,
      use: "babel-loader"
    }]
  }
};

Сборщик преобразует ES6 модули в нужный формат.

7. Web Components (Shadow DOM)

Web Components — стандарт для создания переиспользуемых компонентов с инкапсуляцией:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
  }

  connectedCallback() {
    this.shadowRoot.innerHTML = `
      <style>
        p { color: blue; } /* Не влияет на глобальные стили */
      </style>
      <p>Hello from Web Component</p>
    `;
  }
}

customElements.define("my-element", MyElement);

Особенности:

  • Инкапсуляция CSS и HTML
  • Работает во всех браузерах (с полифиллами)
  • Стандарт W3C

Сравнительная таблица

СистемаСинтаксисОбластьСтатусКогда использовать
ES6import/exportUniversalСтандартВсегда, современный код
CommonJSrequire/module.exportsNode.jsDe factoNode.js
AMDdefine/requireБраузерLegacyСтарые проекты
UMDIIFE обёрткаUniversalLegacyКроссплатформные библиотеки
IIFEПаттернБраузерLegacyИнкапсуляция без модульности

Историческая эволюция

  1. Ранние 2010s — AMD (RequireJS), IIFE
  2. 2014-2015 — CommonJS популяризирована Node.js
  3. 2015 — ES6 (ES2015) стандарт модулей
  4. 2020+ — ES6 модули почти везде

Рекомендация на практике

Используйте только ES6 модули:

// Правильно
import { Component } from "./Component.js";
export default MyComponent;

Остальные системы нужны только для поддержки legacy-кода или специфических случаев (кроссплатформные библиотеки через UMD).