Сделайте так, чтобы скрипт хорошо работал с браузером и узлом (npm) - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть библиотека javascript, в основном это так:

var Ns = (function(){
  var that = {};

  // add stuff to 'that'

  return that;
})();

//use Ns.foo() and Ns.bar()

Дело в том, что теперь я хотел, чтобы одна и та же библиотека была доступна с node и npm. Пока это то, что я мог придумать:

this.Ns = (function(){ //same as previous snippet })()

//use Ns.foo() and Ns.bar()

Проблема в том, что, хотя это работает в браузере, в узле мне нужно сделать следующее:

var Ns = require('ns').Ns

Проблема: Я бы хотел иметь возможность сделать var Ns = require('ns'), но для этого мне нужно экспортировать this.foo и this.bar, что нарушит включение браузера. Идеи?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011
// create local scope.
(function () {

  var myModule = ...

  // check for node module loader
  if (typeof module !== "undefined" && typeof require !== "undefined") {
    module.exports = myModule;
  } else {
    window["name"] = myModule;
  }

})();
0 голосов
/ 02 мая 2013

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

вместоиз

var x = require('x');

запись

var x = (typeof require !== "undefined") ? require('x') : window;

и, аналогично, перед добавлением в экспорт проверьте, существует ли этот объект:

if (typeof exports !== "undefined)
  exports.my_func = my_func;

Последствия этого, однако,в версии браузера все сбрасывается в глобальную область видимости.Также предполагается, что версия браузера загружает на страницу необходимые скрипты.Легко начать работать в небольшом масштабе ... но я предполагаю, что это не будет хорошо масштабироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...