2016-04-22 10 views
2

У меня есть следующий в моем package.json файл:Browserify прокладка не кажется прикрепить Tether к объекту окна

"browserify": { 
    "transform": [ 
    "browserify-shim" 
    ] 
}, 
"browser": { 
    "jquery": "./node_modules/jquery/dist/jquery.js", 
    "tether": "./node_modules/tether/dist/tether.js" 
}, 
"browserify-shim": { 
    "jquery": "$", 
    "tether": "Tether" 
} 

и тогда это в одном из моих JS модулей:

const $ = require('jquery'); 
const Tether = require('tether'); 

затем я получаю следующее сообщение об ошибке в браузере:

tether.min.js:1 Uncaught TypeError: Cannot set property 'Tether' of undefined

Однако, если я не пытаюсь Призонной шайба Tether и просто использовать window.Tether в модуль, который его требует, он отлично работает.

const $ = require('jquery'); 
window.Tether = require('tether'); 

Кто-нибудь знает, почему браузер-прокладка не будет работать для Tether таким образом?

+0

Кстати, вам не нужно использовать директиву 'browser' для любого из этих файлов, потому что путь устанавливается директивой' main' в соответствующих файлах 'package.json'. – YPCrumble

+0

Да, я знал, что могу потребовать от них прямо из node_modules (через свои собственные файлы пакетов, как вы говорите). Причина, по которой я использовал прокладку для них, заключалась в том, что я думал, что разоблачил их в глобальном «окне». – davidpauljunior

+1

Директива 'browser' предназначена только для предоставления псевдонима для переопределения файла Browserify, см. Https://github.com/substack/node-browserify#browser-field, это часть ядра Browserify. Я думаю, что ваш метод использования 'window.Tether' верен, если вы хотите, чтобы« Tether »был доступен для остальной части вашего приложения по всему миру. Другой вариант - вытащить Tether через CDN, если это доступно, и использовать параметр ['global'] (https://github.com/thlorenz/browserify-shim#a-expose-global-variables-via-global), чтобы извлечь из существующего «окна», а не повторного включения кода в ваш пакет. – YPCrumble

ответ

2

Вы правы - вам нужно вручную указать объект window из вашего пакета.

Я не уверен на 100%, но я понимаю, что this part of the documentation, когда он говорит

x exports window.$

на самом деле означает, что $ доступен для всех модулей в пучке как $ - это не значит, window объект вашего webapp.

См., Например, this issue.

Проблема в том разделе документации, где кажется, что люди считают, что объект должен быть частью window - может быть хорошей идеей изменить формулировку этого.

+0

Я нахожу, что документы действительно не дают понять, что они подразумевают под «окном». Это, по-видимому, является причиной всех проблем. Полагаю, я хотел, чтобы мои требования из модулей не отображали, что они были прикреплены к окну. Возможно, это может быть сделано в конфиге. Благодаря! – davidpauljunior

+0

Да, просто добавлено [вопрос] (https://github.com/thlorenz/browserify-shim/issues/210) будет рассмотрен вопрос об улучшении документации для этой части. – YPCrumble