RequireJS baseUrl и несколько оптимизированных файлов

Я отделил свои сторонние библиотеки от кода своего приложения и сгруппировал их все вместе в файл vendor.js для извлечения requirejs. В моем файле build.js я использую синтаксис modules для оптимизации моего основного приложения, исключая сценарии поставщиков. , и оптимизировать файл vendor.js. Единственная проблема, с которой я сталкиваюсь, это когда мой скомпилированный модуль main запрашивает vendor, он получает baseUrl из файла конфигурации и поэтому не загружает оптимизированный файл vendor.js. Мой файл build.js выглядит так:

({
    baseUrl: "js",
    dir: "build",
    mainConfigFile: "js/main.js",
    removeCombined: true,
    findNestedDependencies: true,
    skipDirOptimize: true,
    inlineText: true,
    useStrict: true,
    wrap: true,
    keepBuildDir: false,
    optimize: "uglify2",
    modules: [
        {
            name: "vendor"
        },
        {
            name: "main",
            exclude: ["vendor"]
        }
    ]
})

И мой файл main.js выглядит так:

requirejs.config({
    baseUrl: "js",
    paths: {
        jquery: 'vendor/jquery/jquery-2.1.3.min',
        bootstrap: 'vendor/bootstrap/bootstrap.min',
        handlebars: 'vendor/handlebars/handlebars-v2.0.0',
        backbone: 'vendor/backbone/backbone-min',
        underscore: 'vendor/lodash/lodash.underscore',
        marionette: 'vendor/marionette/backbone.marionette.min',
        models: 'common/models',
        collections: 'common/collections'
    }
});

define(['module', 'vendor'], function(module) {
    var configPath = "config/config." + module.config().env;
    require([configPath, 'app', 'jquery'], function(config, Application, $) {
        $(function() {
            // Kick off the app
            Application.start(config);
        });
    });
});

Вся разработка ведется в папке js, а мой файл build.js находится вне этой папки. Оптимизированные файлы заканчиваются в build, родственном js, но когда я включаю свой основной файл следующим образом:

<script data-main="build/main" src="js/vendor/require/require.max.js"></script>

В итоге загружается js/vendor.js для этого вызова define(). Что мне здесь не хватает? Как я могу указать оптимизированному файлу main вместо этого загружать build/vendor.js, но разрешить неоптимизированной версии загружать js/vendor.js?


person ken.dunnington    schedule 11.02.2015    source источник


Ответы (1)


Хорошо, я понял это. Это было просто, на самом деле, просто случай слишком большой конфигурации. Когда вы загружаете свой скрипт с помощью data-main, baseUrl устанавливается относительно этого файла. Итак, если бы я указал js/main, baseUrl было бы js. Но, поскольку я явно указал baseUrl в блоке конфигурации main.js, это переопределяется как в разработке, так и в производстве. Удалив baseUrl: "js" из main.js, все работает как положено. Сборка разработки загружает все относительно js, а производственная сборка загружает все (vendor.js) относительно build, когда я меняю data-main на build/main. Надеюсь, это поможет кому-то еще когда-нибудь.

requirejs.config({
    paths: {
        jquery: 'vendor/jquery/jquery-2.1.3.min',
        ...
    }
});

// 'vendor' is loaded relative to whatever directory main.js is in
define(['module', 'vendor'], function(module) {
    ...
});
person ken.dunnington    schedule 12.02.2015