Определение глобальной переменной для Browserify

Я использую SpineJS (который экспортирует модуль commonjs), и он должен быть доступен глобально, потому что я использую его везде, но похоже, что мне нужно сделать Spine = require('spine') для каждого файла, который использует Spine, чтобы все заработало.

Есть ли способ определить Spine один раз, чтобы сделать его глобально доступным?

PS: Я использую Spine в качестве примера, но мне вообще интересно, как это сделать с любой другой библиотекой.


person sebastiannm    schedule 05.05.2014    source источник


Ответы (2)


Написание Spine = require('spine') в каждом файле - правильный способ сделать это.

Тем не менее, есть несколько возможностей использования объекта global или window (browserify устанавливает для объекта global значение window, которое является глобальным пространством имен):

  • в spin.js: global.Spine = module.exports
  • в любом другом файле .js, связанном с браузером: global.Spine = require('spine')
  • в теге script или файле .js, на который ссылается файл .html, после файлаpine.js: window.Spine = require('spine')
person David Bonnet    schedule 06.05.2014
comment
С такими общими зависимостями, как jQuery и lodash/underscore, становится раздражающим загромождать половину ваших файлов шаблонным шаблоном, когда вы работаете над большими проектами. Рада, что есть альтернативы - person CheapSteaks; 29.01.2015
comment
Идея, однако, заключается в том, что каждый из этих файлов является полностью определенной единицей, так что теоретически вы можете взять его из одного проекта и поместить в другой, и все равно будет ясно, каковы его зависимости и (иногда) даже где их найти. Очевидно, что вы все еще можете обойти это, если вы просто хотите получить абсолютно наименьшие возможные файлы, но это помогает думать об этом как о документации, а не о беспорядке как таковом. - person Dtipson; 30.06.2015

Во-первых, для вашего примера Дэвид прав. Включите все зависимости в каждый модуль, в котором они вам нужны. Это очень многословно, но не происходит магии времени компиляции, которая устраняет всевозможные анти-шаблоны и потенциальные проблемы в будущем.

Настоящий ответ.

Это не всегда практично. Browserify принимает опцию под названием insertGlobalVars. При сборке каждый потоковый файл сканируется на наличие идентификаторов, соответствующих предоставленным именам ключей, и помещает модуль в IIFE, содержащий аргументы, разрешающие каждый идентификатор, не назначенный в модуле. Все это происходит до того, как дерево зависимостей будет завершено, что позволит вам использовать require для разрешения зависимости.

TLDR

Используйте опцию insertGlobalVars в Browserify.

browserify({
  insertGlobalVars: {
    spine: function(file, dir) {
      return 'require("spine")';
    }
  }
});

Для каждого просканированного файла, если существует идентификатор spine, который не назначен, разрешается как require("spine").

person Brenden    schedule 22.12.2015