Неверный анонимный метод define()

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

Ошибка: Несоответствующий анонимный модуль define(): функция (требуется) {

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

Кто-нибудь точно знает, что означает эта ошибка и почему она происходит?

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

Ответ 1

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

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

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

а. загрузите автономные пакеты non-require.js в теги script перед загрузкой require.js или

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

Ответ 2

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

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

Ответ 3

В docs:

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

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

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

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

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

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

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

Ответ 4

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

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

аноним определяет

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!') } };
})

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

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

Ответ 5

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

Ответ 6

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

    <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>

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

Ответ 7

Этот способ работает для меня:

Включить другие javascipts до, включая require.js. Безопасный способ сделать это - включить require.js вне тега html:

<html>
   <body>
       <script src="other/library.js"></script>
       <script> console.log("Some init script"); </script>
   </body>

   <!-- require.js goes here -->
   <script data-main="main_app" src="path/to/require.js"></script>

</html>

Ответ 8

Или вы можете использовать этот подход.

  • Добавьте require.js в вашу кодовую базу
  • затем загрузите ваш скрипт через этот код

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

Что он будет делать, он загрузит ваш скрипт после загрузки require.js.