2014-01-17 3 views
1

Я хотел бы разделить мои библиотеки и код приложения в отдельных пакетах, чтобы я мог вставлять теги скриптов для каждого отдельно, так как я не хочу jQuery, Backbone и Underscore, которые будут добавлены в каждый из моих пакетов приложений.Browserify отдельных libs.js и app.js вызывает Backbone, чтобы не найти jQuery

Однако, я попытался несколько способов сделать это, и каждый раз, когда я получаю сообщение об ошибке от Backbone говоря:

Uncaught TypeError: Cannot read property 'ajax' of undefined 

Я компиляции libs.js файл, который выглядит следующим образом:

global.$ = require('./jquery') 
global._ = require('underscore') 
global.Backbone = require('backbone') 

Мне пришлось вручную загрузить jQuery и загрузить его в папку my/src/vendor, потому что по какой-то причине nom install jquery просто не работает.

У меня также есть некоторый простой тестовый код приложения, который собирает в app.js:

// User.js 
var Backbone = require('backbone') 
module.exports = User = Backbone.Model.extend({ 
    url : '/user' 
}); 

// app.js 
var User = require('./user'); 
var u = new User() 

u.on('change', function(e){ 
    $('h1').append('Updated!') 
}); 

u.fetch() 

В моем HTML тег сценария libs.js предшествующее что из app.js.

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

+0

Вы пробовали магистраль. $ = $? –

+0

Да, не работает @ – nordhagen

ответ

2

Я прочитал дополнительную информацию об экстернализации, наложения и обрезки в Browserify. Я наконец-то смог собрать gruntfile конфигурацию CoffeeScript, которая работает:

browserify: 
    libs: 
    src: ['src/vendor/jquery.js', 'underscore', 'backbone'], 
    dest: 'public/js/libs.min.js' 
    options: 
     alias: ['backbone:', 'underscore:'] 
     shim: 
     jQuery: 
      path: 'src/vendor/jquery' 
      exports: '$' 
    home: 
    src: ['src/js/main-home.js'] 
    dest: 'public/js/main-home.min.js' 
    options: 
     external: ['backbone', 'underscore'] 

В главном-home.js я теперь в состоянии сделать var Backbone = require('backbone') и затем Backbone.$ = $ и все работает.

+0

Я использую очень похожую настройку, но я замечаю, что Backbone входит в комплект libs и домашний пакет. Вы когда-нибудь сталкивались с той же проблемой? –

0

Похоже, что jQuery загружен неправильно, эта ошибка, вероятно, связана с тем, что вы пытаетесь вызвать $.ajax, но $ не определено.

Возможно, другая причина может быть потому, что вы пытаетесь загрузить jQuery до Backbone. Попробуйте сделать обратный путь, добавив вместо этого Backbone до jQuery.

+0

Я бы подумал, что загрузка jQuery перед Backbone предпочтительнее, но я попробовал ваше предложение. Это не помогло. Я думаю, что это может быть связано с некоторыми мерами предотвращения утечки окна в браузере. – nordhagen