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

У меня есть веб-приложение, которое использует 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,

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

1 ответ

Некоторое время назад у меня была похожая проблема с нокаутирующими расширениями, и шим не работал правильно. Вот как мы это решили.

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

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

    return leaflet;
});

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

define(["leafletLib"],function(leafletLib){});
Другие вопросы по тегам