Несоответствие анонимный определения (модуля)


Я получаю эту ошибку, когда я просматривать мой webapp впервые (обычно в браузере с отключенным кэшем).

ошибка: несоответствие анонимное определение () модуль: функция (требуется) {

HTML:

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

JS:

$(function () {
    define(function (require) {
        // do something
    });
});

в любом случае знаете, что именно означает эта ошибка и почему это происходит?

исходный файл, a короткое обсуждение об этом на странице вопросов github

6 97

6 ответов:

Как сказал AlienWebguy, согласно документам,требуют.js может взорваться Если

  • у вас есть анонимное определение ("модули, которые вызывают define () без идентификатора строки") в своем собственном теге скрипта (я предполагаю, что на самом деле они означают где угодно в глобальной области)
  • у вас есть модули, которые конфликтующие имена
  • вы используете Плагины загрузчика или анонимные модули, но не используете require.оптимизатор js для связывания их

У меня было это проблема при включении пакетов, построенных с помощью browserify, наряду с require.модули js. Решение было следующее:

загрузить А. не требуется.JS автономные пакеты в тегах скрипта до требуют.с JS загружается, или

B. загрузите их с помощью require.js (вместо тега скрипта)

У меня была эта ошибка, потому что я включил файл requirejs вместе с другими библиотеками, включенными непосредственно в тег скрипта. Эти библиотеки (например, lodash) использовали функцию define, которая противоречила определению require. Файл requirejs загружался асинхронно, поэтому я подозреваю, что определение require было определено после определения других библиотек, следовательно, конфликт.

чтобы избавиться от ошибки, включите все ваши другие файлы js с помощью requirejs.

на docs:

Если вы вручную кодируете тег скрипта в HTML для загрузки скрипта с помощью анонимный вызов define (), эта ошибка может произойти.

также видно, если вы код вручную тег script в HTML, чтобы загрузить скрипт, который имеет несколько именованные модули, но затем попробуйте загрузить анонимный модуль, который заканчивается имея то же имя, что и один из именованных модулей в загруженном скрипте вручную закодированным тегом скрипта.

наконец, если вы используете загрузчик плагины или анонимные модули (модули, которые вызывают define () без string ID), но не используйте оптимизатор RequireJS для объединения файлов вместе эта ошибка может произойти. Оптимизатор знает, как назвать анонимные модули правильно, чтобы их можно было комбинировать с другими модули в оптимизированном файле.

чтобы избежать ошибки:

  • обязательно загрузите все скрипты, которые вызывают define () через API RequireJS. Не кодируйте вручную теги сценариев в HTML для загрузки сценариев, которые имеют определите в них вызовы ().

  • Если вы вручную кодируете тег HTML-скрипта, будьте конечно, он включает только именованные модули и что анонимный модуль, который будет иметь то же имя, что и один из модулей в этом файле нет нагруженный.

  • Если проблема заключается в использовании плагинов загрузчика или анонимных модули, но оптимизатор RequireJS не используется для связывания файлов, используйте этот Помощью RequireJS оптимизатор.

в начале работы с reactjs я столкнулся с проблемой и как Новичок docs может быть также написано на греческом языке.

проблема, с которой я столкнулся, заключалась в том, что большинство начинающих примеров используют "анонимные определения", когда вы должны использовать "идентификатор строки".

anonymous определяет

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })


define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

определить строку с идентификатором

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

при использовании определить с идентификатором строки вы избежать этой ошибки при попытке использовать модули, вот так:

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});

имейте в виду, что некоторые расширения браузера могут добавлять код на страницы. В моем случае у меня был плагин" Emmet in all textareas", который испортил мой requireJs. Убедитесь, что в ваш документ не добавлен дополнительный код, проверив его в браузере.

существующие ответы хорошо объясняют проблему, но если включение ваших файлов сценариев с использованием или до requireJS не является простым вариантом из-за устаревшего кода, немного хаки обходной путь-удалить require из области окна перед тегом сценария, а затем восстановить его после слов. В нашем проекте это обернуто за вызовом функции на стороне сервера, но фактически браузер видит следующее:

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

Не самый аккуратный, но, кажется, работает и сохранил много преломление.