Подтвердить что ты не робот

Промойте модуль в Require.js, который использует module.exports?

У меня есть модуль, который я хотел бы включить в цепочку Require.js. (Более конкретно: https://github.com/component/emitter)

В браузере я получаю: uncaught reference error: module is not defined

Для экспорта модуля он определяет: module.exports = Emitter;

Я предполагаю, что это называется способом AMD/ Node. PLease правильно, если неправильно.

в любом случае я бы хотел, чтобы require.js мог как-то быть в браузере. Я думал, что декларативные варианты shimming of Require.js могут мне помочь, но я все еще вижу вышеупомянутую ошибку.

Как это можно решить, не исправляя модуль вручную? (поскольку я хотел бы сохранить автоматизированный процесс сборки, который я настроил)

4b9b3361

Ответ 1

Компоненты - это модули CommonJS

Структура компонентов представляет собой набор, ну, компонентов, написанных в формате модуля CommonJS. Предполагаемое значение модуля просто присваивается "магическому свойству" под названием module.export, которое должно предоставляться средой выполнения JS.

Это не то, как работают веб-среды Web JS, так как модули CommonJS делают предположения для определенного рабочего процесса. Без возможности синхронной гарантии того, что файл загружен (или катастрофически терпит неудачу, когда он этого не делает), браузеры не могут поддерживать тот же рабочий процесс, что и автономные среды. Таким образом, все, что написано в формате CommonJS, должно быть обернуто, чтобы принять это во внимание.

Чтобы использовать модули CommonJS с загрузчиком модулей стиля AMD, например RequireJS, вы можете либо обмотать модули, которые вам нужны, либо использовать инструмент сборки r.js.

Ручная упаковка модуля CommonJS

define(function(require, exports, module) {
  //Put traditional CommonJS module content here
});

От: Примечания CommonJS

Автоматическая упаковка с помощью r.js

r.js -convert path/to/commonjs/modules path/to/converted/modules

Учитывая, что вы уже установили r.js с npm -g i requirejs.

Решение конкретной проблемы

Однако все это просто решает более общую проблему: "Как использовать модули CommonJS в асинхронном рабочем процессе?" Кажется, что вы на самом деле пытаетесь достичь - это просто возможность получить систему событий, не написав ее самостоятельно.

Поскольку вы загружаете это на стороне клиента, существует множество клиентских библиотек, которые уже предлагают эту функцию. Самая популярная библиотека, которая предлагает это, вероятно, Backbone.js Events. Потенциал использования базовых событий заключается в том, что Backbone хорошо поддерживается, хорошо документирован. Недостатком является то, что Backbone - это другая зависимость (включая собственную зависимость, Underscore), которую вам нужно будет загружать. Кроме того, Backbone экспортирует в глобальную переменную, поэтому вам нужно объявить конфигурацию shim RequireJS, чтобы иметь возможность require() it.

Действительно AMD

Святой Грааль будет библиотекой типа EventEmitter, совместимой с малым и AMD. Для этого вы можете попробовать использовать микробиблиотеку, например pubsub.js или nbd.js (Раскрытие информации: Я являюсь автором nbd.js).

Если вы используете nbd.js, он предлагает больше, чем просто возможности pubsub. Но вы можете специально require() просто модуль pubsub.

Если вы используете git для управления источником, проще всего использовать его в качестве подмодуля.

git submodule add [email protected]:behance/nbd.js.git path/to/nbd

Затем require модуль pubsub и сделайте то, что вы хотите!

require(['nbd/trait/pubsub'], function(pubsub) { /* do whatever */ });