Оптимизатор Require.js неправильно упорядочивает зависимости прокладок

У меня есть веб-приложение, которое использует Require для загрузки зависимостей. У меня есть набор библиотек JS, которые включаются с помощью объекта Require config.shim.

Две такие примерные библиотеки:

require.config({
  shim: {
    "libs/leaflet": {
        exports: "L"
    }  
    "libs/leaflet-dvf": {
        deps: ["libs/leaflet"],
        exports: "L"
    }
}

Вторая библиотека, leaflet-dvf, требует первой, leaflet. Второй — это плагин к первому, который зависит от переменной глобальной области видимости L, которую определяет первая библиотека.

Когда я обычно запускаю приложение с помощью Require, все работает нормально. Я могу включить любую библиотеку из прокладки, и все отлично работает. Нет проблем.

Проблема возникает, когда я запускаю этот код через оптимизатор Require r.js. Оптимизатор, когда он создает один оптимизированный файл JS, неправильно упорядочивает зависимости. В созданном файле код leaflet-dvf будет стоять перед кодом leaflet. Это вызывает ошибку времени выполнения JS, поскольку зависимый подключаемый модуль не может найти требуемую переменную глобальной области видимости L.

Моя конфигурация сборки выглядит так:

({
  baseUrl: "../js",
  paths: {
    "requireLib": "../js/libs/require"
  },
  include: ["requireLib"],
  name: "Main",
  out: "bin/Main-built.js",
  optimize: "none",
  wrapShim: true
})

Когда я запускаю оптимизатор с помощью Rhino, он создает мой выходной файл. В файле Main-built.js код плагина будет стоять перед необходимой библиотекой. Это вызывает ошибку L undefined error.

Как заставить оптимизатор соблюдать порядок зависимостей моих прокладок, чтобы правильно упорядочить файлы библиотеки в моем оптимизированном JS-файле?


person Patrick D    schedule 10.07.2014    source источник
comment
возможный дубликат requireJS последовательного выполнения для js-файлов, отличных от AMD   -  person Paul Sweatte    schedule 26.12.2014
comment
Это немного поздно, но если вы еще не решили эту проблему, вам также нужно использовать прокладку внутри вашей конфигурации r.js. это должно исправить.   -  person Vishwanath    schedule 16.01.2015


Ответы (1)


У меня была аналогичная проблема некоторое время назад с нокаутными расширениями, и прокладка работала неправильно. Вот как мы это решили.

Создайте модуль с именем: leafletLib

define(["libs/leaflet","libs/leadleft-dvf"],function(leftlet,dvf){

    return leaflet;
});

В LeafletLib есть основная библиотека и все расширения. В модулях, у которых есть leaflet или leaflet-dvf в качестве зависимости, вы вызываете leafletLib. Это немного хакерски, но это может сработать для вас.

define(["leafletLib"],function(leafletLib){});
person GrayTower    schedule 06.04.2016