2015-03-20 3 views
1

Я пытаюсь использовать/загрузить UnderscoreJS1.7.0 с RequireJS2.1.14-3. При запуске моего приложения UnderscoreJS хорошо загружен, но он «неопределен». Смотрите подробности ниже:Использование UnderscoreJS с RequireJS

main.js

define(function() { 
    // Configuration of RequireJS 
    requirejs.config({ 
     enforceDefine : true, 

     map : { 
      '*': { 
       ... 
       'underscore' : 'webjars/underscorejs/1.7.0/underscore' 
      }, 
     }, 

     // The base URL is just the top-level directory where the files are stored 
     baseUrl : './', 

     // Kick-start the application by loading these files 
     deps : [ 'MyPanel' ], 
    }); 
}); 

модуль, используя его:

define(['ractive', 
    'underscore', 
    ...], 
    function(Ractive, 
      _, 
      ...){ 
var Foo = Ractive.extend({ 
    ... 

    oninit: function(){ 
     var anArray = [1, 2, 3] 
     _.each(anArray, function(item){ 
       ... 
     }) 
    } 
} 

И результат в консоли браузера: Browser result

Файл underscoreJS загружаемого браузер:

Module loaded

Это должно быть подробно, но мне удалось мои Javascript зависимости с maven и webjars

Так почему же мой _undefined?

ответ

1

Если вы посмотрите на source из Underscore 1.7.0, вы видите, он регистрирует себя как это:

if (typeof define === 'function' && define.amd) { 
    define('underscore', [], function() { 
     return _; 
    }); 
} 

Обратите внимание на первый аргумент в define. Это жестко задает имя модуля как 'underscore'.

Проблема в том, что вы используете конфигурацию map, которая несовместима с этим жестко обозначенным именем. То, что вы делаете, это сказать RequireJS "во всех модулях ("*"), когда модулю требуется модуль с именем 'underscore', тогда, пожалуйста, верните вместо этого модуль с именем 'webjars/underscorejs/1.7.0/underscore'". Поэтому, когда вам требуется 'underscore':

  1. RequireJS ищет модуль с именем 'webjars/underscorejs/1.7.0/underscore' вместо этого.

  2. Он использует путь по умолчанию для такого имени модуля и находит файл в этом месте. Он загружает файл и выполняет его.

  3. Однако файл содержит define звонки, которые определяют 'underscore', а не 'webjars/underscorejs/1.7.0/underscore'. Поэтому RequireJS не в состоянии выполнить запрос.

Вместо map, вы должны использовать конфигурацию paths для подчёркивания. Что-то вроде:

paths : { 
    'underscore' : 'webjars/underscorejs/1.7.0/underscore' 
} 

Это говорит RequireJS что-то вроде «вы найдете модуль с именем 'underscore' на месте 'webjars/underscorejs/1.7.0/underscore'». Когда вы используете это, имя запрошенного модуля и имя соответствующего модуля совпадают.

+0

Это должно быть исправлено в версии 1.7.7-1 или более новой версии WebJar. См. Https://github.com/webjars/underscorejs/issues/12 –

+0

@JamesWard Как патч, связанный с этой проблемой, с которой вы ссылаетесь, имеет какое-либо отношение к 'map'? – Louis

+0

Ну, это зависит от того, использует ли @ rémi-doolaeghe функцию RequireJS WebJars. Если это так, конфигурация RequireJS автоматически создается из файла 'pom.xml'. Если нет, тогда вы правы - это не имеет никакого отношения к проблеме. –