Как правильно выставить модуль requireJS в глобальном пространстве имен? - PullRequest
8 голосов
/ 20 марта 2012

Я хочу представить Javascript API в качестве отдельной библиотеки, не загрязняя их глобальное пространство имен.Я создал обертку, чтобы не загрязнять их собственные requireJS в соответствии с http://requirejs.org/docs/faq-advanced.html. Я упростил то, что у меня есть, как показано ниже, но я не уверен, что это правильный путь или яследует делать это другим способом.

var MyApi = MyApi || {};
var MyApiRequireJS = (function() {
  // require.js pasted here
  return {requirejs: requirejs, require: require, define: define};
})();

(function(require, define, requirejs) {
  require.config({
    baseUrl: 'js/scripts',
    waitSeconds: 30,
  });  

  define( 'myapi', ['jquery', 'underscore'],
    function($, _) {
      $.noConflict(true);
      _.noConflict();
      function api(method, args, callback) {
        // do stuff here
      }
      return {api: api};
    }
  );

  require( ['myapi'], function( myapi ) {
    MyApi = myapi;
  });
}(MyApiRequireJS.require, MyApiRequireJS.define, MyApiRequireJS.requirejs));

Сайты, использующие эту библиотеку, будут включать тег сценария, ссылающийся на приведенный выше код, а затем вызывать API с помощью

MyApi.api('some_remote_method', {foo: 'bar'}, function(result) {
  // handle the result
});

1 Ответ

0 голосов
/ 16 мая 2013

Я думаю, что вы пытаетесь предвидеть чужую проблему, делая ее своей проблемой, но я не думаю, что вы действительно можете сделать это разумно. Страница, на которую вы ссылаетесь, предназначена для того, чтобы люди, у которых уже есть глобальные переменные Javascript с именами "require" или "define", переименовывают глобальные переменные RequireJS в нечто иное. Он не предназначен для создания двух отдельных экземпляров RequireJS, которые независимо разрешают зависимости.

Тем не менее, если вы действительно пытаетесь свести к минимуму загрязнение пространства имен, то вам следует указать ровно одно имя - MyApi. Напишите одно закрытие монстра, которое включает вашу личную копию RequireJS, а также ваш код API, и пусть оно возвращает только методы, которые вы хотите выставить в своем API.

Вероятно, гораздо удобнее / проще доставить ваш API в двух версиях: одна, которая определяет модуль requireJS, и другая, которая не зависит от requireJS.

...