2013-11-24 3 views
7

Итак, я начал изучать, как использовать requirejs и объединить его с некоторыми другими доступными библиотеками javascript. Насколько я понимаю, вам нужно закрепить все библиотеки, которые не являются Asynchronous module definition compatible (AMD), но помимо поиска в библиотечном коде для «требования» есть более простой способ выяснить, какие библиотеки поддерживают AMD, а какие нет? В качестве примера я знаю, что jquery поддерживает AMD, но jqueryui этого не делает, и я знаю это только потому, что «кто-то сказал мне».Как узнать, поддерживает ли библиотека javascript AMD

+0

Вы можете сказать людям, что, когда вы говорите о AMD, вы не говорите о полупроводниковой компании с процессором/видео, но я предполагаю, что вы говорите об [Асинхронном определении модуля] (http: // gregfranko. ком/блог/регистрации-The-jqueryui-виджет на заводе-изготовителе, как-ан-АМД-модуль /). – jfriend00

+1

@ jfriend00, [Asynchronous_module_definition] (http://en.wikipedia.org/wiki/Asynchronous_module_definition), вы знаете, что означает 'OP', не так ли? –

+2

Я НЕ знал, что они имели в виду. Я думал, что они спрашивают о совместимости видеокарт AMD. Только когда я искал в Google, я нашел то, что они имели в виду. Я сам отредактирую вопрос, чтобы убедиться, что это понятно для других читателей. – jfriend00

ответ

3

Так JQuery заявляет о своей AMD. Это всего лишь куча утверждений if. Если в библиотеках нет library.AMD === true, нет возможности проверить из самой библиотеки.

if (typeof module === "object" && module && typeof module.exports === "object") { 
    module.exports = jQuery; 
} else { 
    window.jQuery = window.$ = jQuery; 
    if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { return jQuery; }); 
    } 
} 

Однако есть возможность проверить уже загруженные модули. This answer заявляет, что вы можете проверить require.s.contexts._.defined, который представляет собой объект, содержащий сопоставление имен с уже загруженными модулями.

Например, если я загрузил jQuery (который по умолчанию имеет AMD) на страницу, которая также имеет RequireJS, свойство jquery будет существовать в этом объекте и содержать тот же объект jQuery, что и глобальный. Затем вы можете сравнить. Ниже будет возвращать true:

require.s.contexts._.defined.jquery === jQuery 
require.s.contexts._.defined.jquery === $ 

Однако, это предполагает, что вы знаете имя модуля и/или есть глобальный для сравнения. Это может не работать во всех случаях. Например, пользовательский интерфейс jQuery - это не просто один большой кусок кода. Это куча плагинов, размещенных под номером jquery-ui.js. Есть вероятность, что их можно назвать коллективно или модулем для каждого виджета. Пользовательский интерфейс jQuery даже не имеет глобального.

2

Вы будете искать AMD formatdefine() вызовов в источниках, где они обычно приходят в трех вариантах:

  • не определены модуль AMD, где вам придется настроить подкладку в RequireJS;
  • Дополнительная поддержка AMD, в которой обычно наблюдается некоторое обнюхивание для зависимости define() в глобальном масштабе внизу;
  • Первоклассный модуль AMD, где все обернуто в звонок по телефону define().

Хорошо отметить, что вы получите сообщение об ошибке, если вы пытаетесь Призонной шайба модуля AMD по ошибке, или загрузить скрипт как модуль AMD, который никогда не называет define() создать.

+1

Спасибо за разъяснение этого Филиппа.Просто ради любопытства я сделал быструю проверку на то, получу ли я ошибку, если бы я смонтировал совместимую с AMD библиотеку или наоборот, но насколько я вижу, я ничего не получаю в журнале консоли. У вас есть короткий пример, который показывает это? –

Смежные вопросы