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){});