RequireJS - не знаете, как правильно скомпилировать в один файл

Я пытаюсь скомпилировать два файла js --- main.js и cookies.js -- в один файл.

    -/
     |-main.js
     |-cookie.js
     |-require.js
     |-main-built.js
     |-build.js

main.js содержит логику скрипта и зависит/требует cookie.js.

Без require.js, если я сначала загружаю cookie.js, а затем main.js, все работает отлично. то есть:

    <script src="cookie.js"></script>
    <script src="main.js"></script>

Это отлично работает для разработки, но мне нужен один окончательный файл js для производства.

Я начал использовать require.js (http://requirejs.org/)

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

где main-built.js — результат работы одного файла:

    node r.js -o build.js

Мой файл сборки настроен следующим образом:

    ({
      include: ["cookiejs","requirejs"],
      baseUrl: '.',
      paths: {
      'cookiejs': 'cookie',
      'requirejs': 'require'
    },
      name:"main",
      out: "main-built.js",
    })

«main» из файла сборки извлекает main.js, «require» извлекает из require.js, «cookie» извлекает из cookie.js.

Проблема При выполнении окончательного скомпилированного файла функции cookie не определены. В частности, поскольку cookie.js обрабатывает взаимодействие с файлами cookie, возникает ошибка:

    "Uncaught ReferenceError: cookie is not defined"

Я вижу, что код cookie.js на самом деле копируется в main-built.js, поэтому я думаю, что вопрос в том, как сообщить require.js, что main.js зависит от cookie.js, и заставить компилятор переупорядочить выполнение кода. в финальном файле основной сборки, но на самом деле я хватаюсь за соломинку, как сообщить require.js, как это сделать.

Что я пробовал

  • Включая и исключая require.js в файле сборки и не видел никакой разницы.

  • Использование "deps" вместо "include" в файле сборки --- разницы не заметил

  • Различные варианты сборки uglify


person Don F    schedule 07.08.2015    source источник
comment
Получите добычу в конфигурации shim   -  person Vishwanath    schedule 07.08.2015
comment
Спасибо, Вишванат - файл cookie.js, который является зависимостью, настроен на использование загрузчика AMD, если он присутствует, похоже, что конфигурация прокладки предназначена для старых сценариев, которые не используют define() для объявления модульного значения. Это определяется как файл cookie.   -  person Don F    schedule 07.08.2015
comment
Вы пропустили использование прокладки для конфигурации зависимостей. Я добавлю это в ответ.   -  person Vishwanath    schedule 07.08.2015


Ответы (1)


Поскольку ваш main зависит от файла cookiejs. Вы должны определить эту связь через конфигурации requirejs. В идеале эти зависимости должны быть определены в зависимом файле, как показано ниже.

main.js

define(['cookie'], function(){
});

Вы также можете определить эту зависимость с файлами, которыми вы не будете управлять (здесь это не так), с помощью shim.

({
      include: ["cookiejs","requirejs"],
      baseUrl: '.',
      paths: {
      'cookiejs': 'cookie',
      'requirejs': 'require'
    },
      name:"main",
      out: "main-built.js",
      shim : {
         "main" : ["cookiejs"] //This means main depends on cookie
      }
    })
person Vishwanath    schedule 07.08.2015
comment
Спасибо за вашу помощь, Вишванат. Я на самом деле попробовал это точное добавление прокладки после вашего первого комментария и безуспешно пробовал несколько вариантов. так как происходит та же ошибка браузера. куки не определен - person Don F; 07.08.2015
comment
Вы перезапускали оптимизатор, очищали кеш браузера? - person Vishwanath; 07.08.2015
comment
Да, сэр - удалил встроенные файлы - очистил кеш браузера (хотя он настроен не кешировать при открытой консоли) - пересобрал файл, перезагрузил в браузере, и все та же ошибка... - person Don F; 07.08.2015
comment
Извините, что обращаюсь с вами как с нубом. Не видел никаких других проблем, поэтому спросил вас, находимся ли мы на одной полосе. Можете ли вы сохранить uglify : none и проверить содержимое встроенного файла. Порядок, в котором файлы объединяются. - person Vishwanath; 07.08.2015
comment
Не беспокойтесь — я новичок в require.js — и постоянно учусь. Я установил uglify : none, но кажется, что он все еще объединяется, кажется, что построенный файл начинается с файла main.js, затем вставляется cookie.js, а затем заканчивается оставшимся файлом main.js. - person Don F; 07.08.2015