Почему мой RequireJS игнорирует код в моем оптимизированном main.js?

В последнее время я немного работал с RequireJS, но я новичок в оптимизаторе и пытаюсь добавить его в свои этапы сборки, но столкнулся с проблемой. После того, как он запускает и объединяет мои JS-файлы в один, тело моего "main" больше не выполняется (до оптимизации работало нормально). Вся зависимость JS загружается правильно, но фактический код внутри моего main define() не загружается (хотя я вижу это в конечном выходном файле. Вот что я имею в виду:

Предполагая упрощенную версию моего main.js:

console.log("This statement outputs to console");
define(["jquery", "modernizr", "jquery.joyride"], function($) {
    console.log("This statement does not");
}

Как я уже упоминал, в выходном файле я вижу встроенные операторы jquery, modernizer, joyride и console.log(), поэтому я считаю, что он генерируется правильно. Я предполагаю, что это связано с моим требованием конфигурации:

Это упрощенная версия моего app.js:

requirejs.config({
    "baseUrl": "/assets/js",
    "paths": {
        "jquery": "jquery"
    },
    "shim": {
        "jquery.joyride": ["jquery"]
    }
});

requirejs(["app/main"]);

Я предполагаю, что второй вызов requirejs() не выполняется. Это возможно? Что могло бы вызвать это и как это исправить?

По сути, моя оптимизированная версия main.js выглядит примерно так:

(function(e,t){ ..jquery code.. };

define("jquery.joyride", function(){});
(function(a){ ...code here... });

console.log("This statement outputs to console");
define('main',["jquery", "modernizr", "jquery.joyride"], function($) {
    console.log("This statement does not");
};

Вот конфиг сборки:

({
    appDir: '../../',
    baseUrl: "assets/js",
    mainConfigFile: '../../assets/js/app.js',
    dir: '../../../BUILD/',
    optimizeCss: 'default',
    modules: [
        {
            name: "main"
        }
    ],
    removeCombined: true,
    preserveLicenseComments: false,
    optimize: 'none' // I Disabled this to help me try and debug
})

Также это помогает, это строка, которую я использую, чтобы включить мой JS (та же самая строка boht до и после того, как я оптимизирую файл):

<script data-main="/assets/js/app" src="/assets/js/require.js"></script>

1 ответ

Поэтому, присмотревшись к коду, который вы поделились выше... проблема в том, что оптимизированная версия main.js не добавляет правильное имя модуля (define("main"[ должно быть define("app/main"[, Я подозреваю, что это связано с одной из двух вещей:

  1. неверное имя модуля в конфигурационном файле r.js
  2. неправильная ссылка на модуль в вашем app.js

во-первых, чтобы проверить / подтвердить мое предположение: вручную отредактируйте оптимизированную версию main.js в соответствии с тем, что я упомянул выше ("app/main" вместо просто "main"). если это работает, то попробуйте эти вещи (по одному, а не одновременно):

  1. для адресации #1, в вашем конфигурационном файле r.js... изменить name:"main" в name:"app/main"
  2. для #2, в вашем app.js, измените requirejs(["app/main"]); в requirejs(["main"]);
Другие вопросы по тегам