2014-10-06 4 views
2

Я пытаюсь понять преимущества популярного r.js.Что действительно делает r.js?

Кажется ...

  • конкатенации список вручную выбранных файлов JavaScript
  • уродовать/минимизировать этот комбинированный код
  • сделать некоторые аналогичные вещи для файлов CSS (объединить их)

Кроме того, (), что он отличает его от общих средств объединения/минимизации) it кажется, ...

  • новообращенного Node стиле require() модули на модули типа AMD
  • имени анонимных модулей (например. define(['dependency'], function(){...})
  • предлагает некоторую поддержку плагинов загрузчика, например. встроенный CSS файлы

Это не, кажется ...

  • анализировать и автоматически разрешать зависимости, найденные в файлах (как, включаемый файл foo.js в пакет только потому, что r.js находит define(["foo"], ...)

Является ли это правильно, или я что-то пропустил?

+0

У меня было неправильное редактирование, и вы действительно подразумевали, что он должен «включать файл' foo.js' в пакет только потому, что r.js находит ** 'define ([" foo "],. ..) '***"? Если код уже существует ('foo' определен), я не понимаю, почему вы хотите загрузить файл' foo.js'. – Bergi

+0

[RequireJS/Optimization] (http://requirejs.org/docs/optimization.html): «[r.js] Объединяет связанные скрипты вместе в строковые слои и их минимизирует». Сам граф зависимостей * все еще разрешен во время выполнения *, все модули просто были сдвинуты вместе и поэтому не требуют отдельных выборок ресурсов. – user2864740

+0

@Bergi: Не знаю о вашем редактировании, но да, я хочу убедиться, что правильно, что r.js автоматически не разрешает какие-либо зависимости. Я не говорю, что это должно быть сделано. Мне просто кажется, что r.js выполняет некоторые синтаксические разбор/обработку JavaScript и хочет, чтобы я понял все шаги в этом процессе. –

ответ

4

Вы не правы, потому что r.js автоматически определяет зависимости. Если у вас есть main.js файл с этим:

define(["foo"], function (foo) { 
}); 

Тогда, если вы попросите r.js создать произвести оптимизированный модуль из main.js, он будет включать код для модуля foo в сборке.

Некоторые предостережений:

  1. Можно сказать r.js исключить модули. Поэтому, если модуль, который, по вашему мнению, должен быть в оптимизированном пакете, отсутствует, возможно, он исключен. (Вы знаете, как вы используете r.js, но если вы используете пакет, полученный с помощью кого-то и вам интересно, то это может быть ответом:. Они исключены зависимость от сборки)

  2. r.js не находит Вложенные зависимостей, если вы не сообщите об этом. Например:

    define(function() { 
        require(["foo"], function (foo) { 
        }); 
    }); 
    

    r.js не обнаружит, что foo требуется, если вы установите findNestedDepencencies в true в вашей сборки конфигурации.

  3. r.js можно найти только зависимость, которые указаны в виде списка струны, помещенный в виде литерала в том месте, где require и define вызовов ожидают зависимости. Так что если вы делаете:

    define(function() { 
        var deps = ["foo"]; 
        require(deps, function (foo) { 
        }); 
    }); 
    

    Тогда r.js не будет знать, что foo является зависимость, потому что в require(deps, ... ваши зависимости появляются в качестве ссылки символа, а не в виде списка строк. Вам нужно будет указать foo в качестве зависимости вручную в конфигурации сборки. Нет никакого флага, чтобы включить, чтобы сделать r.js найти эти случаи.

+0

Спасибо. Теперь все ясно. –

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