RequireJS условные зависимости - PullRequest
9 голосов
/ 08 декабря 2011

Я пытаюсь определить модуль с условными зависимостями (в зависимости от теста Modernizr). Я сделал кое-что, что работает, но чувствую себя счастливым.

Можете ли вы сказать мне, что вы думаете, и есть ли лучший способ сделать это? Спасибо.

var dependencies = ["jquery"];

require(["modernizr"], function() {
  if(Modernizr.canvas) dependencies.push("modernizr/excanvas");
});

define(dependencies, function($) {

  $(function() {
    // code here
  });

});

Ответы [ 3 ]

3 голосов
/ 10 декабря 2011

Вы пытаетесь просто загрузить этот файл, когда браузер не поддерживает что-то, загружаете больше javascript, чтобы заставить его работать как-то по сценарию типа?

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

Тем не менее, терпите меня здесь, я делаю предположения, и я не пробовал этоточно, но теория, возможно, имеет смысл:)

Возможно, что-то вроде

define("jquery","modernizr", function($) {
  $(function() {
    var functionMain = function() {
      // code here
    }

    var functionA = require(["modernizr/excanvas"], function() {
      functionMain()
    });    
    //require here not strictly necessary
    var functionB = require([""], function() {
      functionMain() 
    });    


    if(Modernizr.canvas)
      functionA();
    else
      functionB()
  }); 
});

Я не знаю, возможно, просто вопрос стиля или предпочтений, это просто другой способделать то же самое на самом деле, но без массива зависимостей, который я просто не любил (смеется), хотя на самом деле в этом нет ничего плохого, если все, что вы хотите сделать, это загрузить этот файл условно, а остальная часть кода будет такой же

Я стал больше думать о разделении реализаций на основе условий, а затемиметь разные условные требования для реализации, все еще его мнение, а?:)

1 голос
/ 25 июня 2012

На самом деле вы можете сделать две вещи, это зависит от того, хотите ли вы добавить глобальную переменную или нет.В любом случае вы создаете файл modernizr.js, и если вы хотите создать глобальную переменную

define( function() {
    /* Modernizr 2.5.3 (Custom Build) | MIT & BSD
     * Build: http://modernizr.com/download/#-touch-cssclasses-teststyles-prefixes-load
     */
    Modernizr = (function( window, document, undefined ) {
        // all your modernizr code

        return Modernizr;

    })(window, window.document);// Be careful to change this with window
} );// This closes the define call

, тогда вы можете просто

require( ['modernizr'], function() {
    // Here the script has loaded and since you  added a global variable, use that
    if(!Modernizr.borderradius){ 
});

, если вы не хотите добавлятьглобальная переменная, вы должны сделать

define( function() {
    /* Modernizr 2.5.3 (Custom Build) | MIT & BSD
     * Build: http://modernizr.com/download/#-touch-cssclasses-teststyles-prefixes-load
     */
    // Change the name of the variable so you don't have scope issues
    var modernizr = (function( window, document, undefined ) {
        // all your modernizr code

        return Modernizr;

    })(window, window.document);// Be careful to change this with window
    // Return your variable
    return modernizr;
} );// This closes the define call

, а затем

require( ['modernizr'], function( Mdzr ) {
    // Here the script has loaded and you assigned the return value of 
    // the script to the variable Mdzr so use that
    if(!Mdzr.borderradius){ 
});
1 голос
/ 22 мая 2012

Modernizr в настоящее время не заключен в функцию определения 'amd'.Чтобы заставить Modernizr загружаться как модуль для require.js, вам нужно взломать modernizr.js следующим образом:

FOR modernizr.js

CUT:

;window.Modernizr = function

ЗАМЕНИТЕ НА:

define('Modernizr',function(){
;Modernizr = function

ДОБАВИТЬ ЭТО В ДНО

return Modernizr;
});
...