requireJS с зависимостями от Backbone

Я создаю веб-сайт, используя requireJS.

это первый раз, когда я использую requireJS.

я настроил requireJS с путями в main.js:

require.config({
  paths: {
    'jquery': 'libs/jquery/1.7.2/jquery',
    'underscore': 'libs/underscore/1.3.3-amdjs/underscore', // AMD support
    'backbone': 'libs/backbone/0.9.2-amdjs/backbone', // AMD support
    'marionette': 'libs/marionette/0.9.3-amd/backbone.marionette', // AMD support
    'templates': '../templates'
}
});

и в моделях, представлениях, коллекциях, которые я использую;

define([    
'jquery',
'backbone'
], function ($) {
    var Geo = Backbone.Model.extend({});

    return Geo;
});

что мне непонятно, так это то, почему я должен продолжать определять jquery и основу как зависимость. я имею в виду, что этот проект и модели никогда не будут работать без jquery/backbone.

так почему бы не добавить jquery и backbone в index.html в качестве тегов script и сохранить ссылки на них во всех возможных объектах. я понимаю, что это загрязнит глобальное пространство имен, но разве это не разумно?

любые советы приветствуются.

ваше здоровье,


person Guy    schedule 15.07.2012    source источник


Ответы (4)


@Парень, определять их необязательно, но если ты хочешь быть последовательным, это лучше, чем ты. Это архитектура, которую предлагает Require.JS. Это не означает, что он будет пытаться загрузить jQuery или Backbone каждый раз, когда вы определяете их как deps.

Кроме того, в вашем примере вам не нужно использовать $ в аргументах обратного вызова function(). jQuery и $ уже будут в окне.

define([    
'jquery',
'backbone'
], function ($) {
    var Geo = Backbone.Model.extend({});

    return Geo;
});

Кроме того, в продакшене, потому что мы иногда используем много зависимостей, мы делаем это так: каждый раз, когда вы перечисляете require в зависимостях, а затем явно назначаете vars, потому что некоторые зависимости не имеют поддержки AMD и возвращают не то, что вы ожидаете:

define([    
  'require'
  'moduleA',
  'moduleB'
], function (require) {
    var moduleA = require('moduleA'),
        moduleB = require('moduleB');

    /* code */
    return;
});
person mvbl fst    schedule 15.07.2012

Я думаю, ваше понимание правильное, поскольку jQuery везде, будет использоваться в качестве глобальной ссылки на странице index.html полностью в моем проекте, я так и делаю.

person Justin wong    schedule 15.07.2012

Я думаю, что очень полезно добавлять все js-файлы в RequireJS, если вы используете r.js для оптимизации своего проекта.

person leon tsing    schedule 15.07.2012

Если вы создаете модули A и B и хотите поместить их в другой проект, зависимости явно объявляются. Что, если другой проект просто использует ExtJS без jQuery? Или что, если они используют zepto, а вам нужна библиотека jquery? Достаточно просто добавить конфигурацию для jquery... и jquery будет загружаться при необходимости.

Вы не можете полагаться на существование общих библиотек. Обертывание модуля в оболочку requirejs гарантирует, что зависимости библиотеки будут существовать. И это немного быстрее :) http://jsperf.com/requirejs-include-faster (ну видимо кроме т.е. разберись)

Кроме того, если вы на самом деле не используете jquery, вам не нужно это требовать. Зачем использовать в базовой модели? Даже в представлении вы можете использовать this.$el, который возвращает объект jquery для поиска - this.$el.find('.someclass')

person Stephen    schedule 15.07.2012