Ошибка рендеринга: RangeError: превышен максимальный размер стека вызовов

Я получаю следующую ошибку, сгенерированную из моего макета default.html.eco, когда я пытаюсь отобразить:

RangeError: превышен максимальный размер стека вызовов

Моя версия docpad: v6.54.2, и конкретная строка, вызывающая это, такова:

<%- @getBlock('scripts').add(['/vendor/foundation.min.js',
'/vendor/audiolib.js','/vendor/freqfinder.js','/vendor/modernizr.js']).toHTML() %>

Если я уберу это, я получу чистую сборку.

Обратите внимание, что блок стилей над ним отлично отображается:

<%- @getBlock("styles").add(['/vendor/foundation.css']).toHTML() %>

Поэтому я решил попробовать урезать этот список в блоке сценариев, и это сработало:

<%- @getBlock("scripts").add(['/vendor/foundation.min.js']).toHTML() %>

Любые идеи о том, как обойти это? Я отправлю сообщение об ошибке, если я не делаю что-то не так - новичок в docpad.


person mcauth    schedule 31.10.2013    source источник
comment
Я бы зарегистрировал проблему на github для этого. Я не вижу ни одного места, где вы принципиально делаете что-то не так со своим кодом.   -  person Erv Walter    schedule 31.10.2013
comment
Из любопытства, это разбито на две строки в вашем фактическом исходном коде? Вы пробовали это в одной строке?   -  person Erv Walter    schedule 31.10.2013
comment
Отличный улов: все в одной строке работает. Я проведу еще немного тестов, спасибо Эрв.   -  person mcauth    schedule 01.11.2013
comment
Однако мне совершенно не очевидно, почему это вызывает эту ошибку. Наверное странность эко.   -  person Erv Walter    schedule 01.11.2013


Ответы (1)


У вас есть разрыв строки в вашем коде? У меня не получается, когда я копирую и вставляю отсюда в свой файл макета, но если я удаляю разрыв строки между '/vendor/foundation.min.js', и '/vendor/audiolib.js', он компилируется, как и ожидалось.

В качестве альтернативы вы также можете использовать строку из .add() команд, например:

<%- @getBlock('scripts').add('/vendor/foundation.min.js').add( '/vendor/audiolib.js').add('/vendor/freqfinder.js').add('/vendor/modernizr.js').toHTML() %>

Это также хорошо компилируется для меня.

И соответствующее примечание на случай, если кто-то еще столкнется с этой ошибкой, но не имеет разрывов строк: collection.add(null) теперь вызывает то же сообщение об ошибке. Итак, если вы делаете что-то вроде этого:

<%- @getBlock("scripts").add( @getDocument().get('scripts') ).toHTML() %>

Он умрет, если у вас нет поля метаданных scripts на каждой странице.

Однако исправить это довольно просто:

<%- @getBlock("scripts").add( @getDocument().get('scripts') or [] ).toHTML() %>
person Nathan Friedly    schedule 01.11.2013