2013-04-23 2 views
36

Я рассматриваю возможность принятия browserify для некоторых моих проектов, но хочу, чтобы другие не использовали браузер, если они хотят использовать (в комплекте). Очевидный способ сделать это - разоблачить экспорт модулей через module.exports, а также через глобальный window.. Однако я бы предпочел не загрязнять глобальное пространство имен для тех, у кого есть сценарий require.Browserify: Используйте module.exports, если это необходимо, в противном случае выведите глобальный

Можно ли определить, является ли сценарий require? Если это так, то я мог бы сделать что-то вроде:

var mymodule = (function() { ... })(); 
if (isRequired()) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 

Обратите внимание, что независимо от того, что это не будет поставляться в комплекте заранее, поэтому var mymodule не будет подвергать глобальный. Кроме того, в настоящее время я использую revealing module pattern, но хотел бы перейти на что-то более подходящее для браузера.

Каков наилучший способ сделать модуль как require способен, так и <script src= способен? Лучше всего просто разоблачить глобальную ситуацию в обоих случаях?

ответ

2

Предполагая другую библиотеку не создала объект глобальной module.exports, вы можете просто проверить существование module.exports

var mymodule = (function() { ... })(); 
if (module && module.exports) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 
+0

Browserify make 'module',' module.exports' и 'require' доступны для всех связанных файлов. Таким образом, только мой комплект делает их доступными. Спасибо за ответ. –

18

Я имею дело с той же проблемой создания библиотеки и здесь есть грубое мнение. Я думаю, что нам нужно отделить сначала аудитории для библиотеки в нескольких категориях:

  1. тех, кто использует browserify и NPM
  2. тех, кто будет просто скачать mylib.min.js и использовать один из способов или другой
  3. AMD (с антенной?), может быть третьей категорией.

Таким образом, для - легко, вы будете иметь модуль вашего index.js:

module.exports = function() { /* code */ } 

и ваш package.json будет главный

"главный": "index.js"

Уведомление Я не добавляю никакого кода window.xx в index.js.

Для Я думаю, что лучшая идея заключается в том, чтобы создать standalone.js

var mylib = require('./index.js'); 
global.window.mylib = mylib; 

Это то, что browserify следует строить.

Для (если вам интересно) вы можете настроить автономный.JS следующим образом:

var mylib = require('./index.js'); 
if (typeof global.window.define == 'function' && global.window.define.amd) { 
    global.window.define('mylib', function() { return mylib; }); 
} else { 
    global.window.mylib = mylib; 
} 
0

Почему бы не просто оберните всю вещь закрытием и передайте exports в качестве параметра?

(function (exports) { 
    // code here 
    // ... 
    exports.foo = bar; 
})(exports || this); 

Таким образом, он также экспортирует его в область WebWorker и другие среды без окон.

 Смежные вопросы

  • Нет связанных вопросов^_^