2014-06-03 2 views
0

Я хочу использовать браузер для объединения интерфейсных библиотек. Поэтому мне нужно, чтобы в качестве зависимостей требовались магистрали и jquery. Но это не работает, если я просто требую их. Я явно установить Backbone $ в JQuery:.В чем разница между использованием базового блока, jquery как модуля commonjs в узле и использованием их в теге скрипта?

var _ = require('underscore'); 
var $ = require('jquery'); 
var Backbone = require('backbone'); 
Backbone.$ = $; 

И какую-нить говорит, что для JQuery, чтобы правильно работать, мне нужно явно передать объект окна:

var $ = require('jquery')(window); 

Но на самом деле я не необходимо сделать это, и он все еще работает:

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

ответ

1

Использование тегов сценариев работает отлично, вплоть до точки. Когда вы добавляете новые интерфейсные библиотеки и новый код приложения, управление зависимостями между ними становится очень сложным. Когда вы используете только теги скриптов, да, вам просто нужно поставить их в правильном порядке, и он просто сработает ». Это нормально, если у вас всего несколько сценариев, но получение этого права по мере роста вашего проекта является более сложным, чем вы думаете (я говорю это по опыту).

Как вы отметили, использование модулей CommonJS исправляет это. Зависимости четко обозначаются синтаксисом require и экспортируются с module.exports, и вы можете забыть об управлении зависимостями и позволить загрузчику сценариев сделать это. Сначала это может показаться накладными, но это позволит вашему проекту масштабироваться. Первоначальная стоимость получения модульной системы, настроенной для вашего JS-кода, будет стоить того, что стоит в будущем.

Использование модульной системы, такой как CommonJS, также способствует хорошему инкапсуляции, что поможет вам написать более многократно используемые компоненты кода, которые легче поддерживать.

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

Одно предостережение в том, что может хорошая идея, чтобы включить действительно популярные библиотеки (например, JQuery) на странице с тегом скрипта (используя копию CDN), если вы думаете, это может быть кэшируются браузером пользователя.

+0

Привет, Райан, спасибо за хорошее объяснение различий в использовании тега script и commonjs. Но это не совсем то, что я задал, поэтому мой вопрос заключается в том, почему мне нужно настроить Backbone. $ Явно в commonjs, а не на то, что он позаботится о себе при использовании в теге скрипта. –

+1

Извините, что не ответил на ваш реальный вопрос. Это связано с тем, что когда вы загружаете jQuery через тег script, он устанавливает глобальную переменную 'window. $' Как объект jQuery. Библиотеки, зависящие от jQuery, такие как Backbone и Underscore, ожидают найти эту глобальную переменную. Одно из огромных преимуществ CommonJS заключается в том, что вы не смешиваете глобальное пространство имен с переменными. Единственный способ получить объект jQuery - это вызов 'require ('jquery')'; переменная 'window. $' не определена. Таким образом, строка 'Backbone. $ = $;' Сообщает Backbone, как получить jQuery, не требуя его захвата из объекта 'window'. –