RequireJS для Modernizr

Я пытаюсь загрузить функцию Modernizr, динамически обнаруживая requireJS.
Поскольку Modernizr встроил поддержку AMD, это не должно быть проблемой.

Конфигурация my requireJS содержит пути к исходному каталогу Modernizr, а функция обнаруживает каталог:

requirejs.config({
  paths: {
    "modernizr" : "components/modernizr/src",
    "feature-detects": "components/modernizr/feature-detects"
  }
});

Предположим, что для одного из моих представлений потребуется svg-тест.
Мое определение представления может выглядеть как this

define(["feature-detects/svg"], function() { .. });

К сожалению, svg.js не может найти Modernizr.js, потому что все функции обнаружения и исходные файлы Modernizr загружают Modernizr без указания любого каталога: define(['Modernizr'], ...

Это приводит к очень уродливому require.config

requirejs.config({
  paths: {
    "Modernizr": "components/modernizr/src/Modernizr",
    "addTest": "components/modernizr/src/addTest",
    "ModernizrProto": "components/modernizr/src/ModernizrProto",
    "setClasses": "components/modernizr/src/setClasses",
    "hasOwnProp": "components/modernizr/src/hasOwnProp",
    "tests": "components/modernizr/src/tests",
    "is": "components/modernizr/src/is",
    "docElement": "components/modernizr/src/docElement",
    "feature-detects": "components/modernizr/feature-detects"
  }
});

Есть ли более чистый способ сказать requireJS искать в components/modernizr/src/ всякий раз, когда он не мог найти файл?

Обновление

Я создал проект gigaub , который включает в себя базовую установку и демонстрацию .

Ответ 1

Структура Modernizr AMD (сейчас) только для собственного внутреннего процесса сборки. Мы обсудили это, чтобы его можно было использовать, как вы пробовали, но пока не договорились об удобном способе сделать это. Плагин Modernizr для RequireJS может быть одним из вариантов.

Вы используете Bower? Если это так, стоит отметить, что Modernizr не подходит для использования с Bower еще.

Рекомендуемый способ привязки Modernizr к вашему процессу сборки в настоящий момент использует grunt-modernizr, который автоматически найдет ссылки на Modernizr в вашем коде (или вы могут явно определить их), тогда вы можете просто использовать полученную в результате версию Modernizr, как и любую другую зависимость от AMD, когда вам это нужно:

define(['path/to/built/modernizr.js'], function (Modernizr) {
    if (Modernizr.svg) {
        ...
    }
});

Ответ 2

Мое предложение было бы иметь прокладку

Config

paths: {
        'Modernizr': 'PATH TO MODERNIZR'
    }
shim: {
        'Modernizr': {
            exports: 'Modernizr'
        }
    }

=================

Вы можете использовать определение в своем script

define(['Modernizr'],function(Modernizr) {
    'use strict';

console.log(Modernizr)
// This should log the Modernizr function

//For Example
if(Modernizr.boxshadow){
  // Do something here
}

};

Ответ 3

Если я правильно понял ваш вопрос, не могли бы вы просто определить свою функцию следующим образом:

define([
    "modernizr",
    "feature-detects/svg"
 ], function(Modernizr) {
     Modernizr.addTest();
});

Таким образом, модернизация будет загружена до того, как будет запущен ваш код обнаружения функций.