Ошибка LABjs: скрипты всегда выполняли последовательность загрузки с использованием.script()

Когда я сделал несколько тестовых случаев с LABjs, я столкнулся с некоторыми проблемами, вот код:

$LAB.script('http://code.jquery.com/jquery-1.8.0.min.js')
    .script('http://id.qq.com/js/10001/simple.js');

в соответствии с описанием API, нет гарантий для порядка исполнения jquery-1.8.0.min.js и simple.js. Я заблокировал jquery-1.8.0.min.js с помощью fiddler, что я и назвал boserverd:

  1. В IE8 все работает нормально, когда simple.js заканчивает загрузку, сразу оправдывается.
  2. В chrome 20 файл simple.js никогда не использовался до тех пор, пока jquery-1.8.0.min.js не завершил загрузку и не оправдался.

Это ошибка?

Затем я сделал еще один тест в Chrome 20, вот код:

var script = document.createElement('script');
script.type = 'text/cache';
script.src = 'http://code.jquery.com/jquery-1.8.0.min.js';
document.head.appendChild(script);

jquery-1.8.0.min.js не начал загрузку, когда я запустил этот код, это проблема?

Вот описание API: http://labjs.com/documentation.php

1 ответ

Решение

У вас есть два вопроса, поэтому позвольте мне взять их отдельно:

  1. Почему "simple.js" не запускается, если "jquery.js" заблокирован в Chrome 20, но работает так, как ожидается в IE8?

    Хмммм, я не совсем понимаю, почему это так. Это, вероятно, не ошибка в LABjs, но это может быть причудой Chrome. Он должен, согласно спецификации, работать в порядке ASAP, что означает, что "simple.js" не должен ждать "jquery.js". Единственное другое объяснение, кроме того, что браузер имеет причуду / ошибку, было бы, если где-то в вашем коде вы установили $LAB.setGlobalDefaults({AlwaysPreserveOrder:true}), так как это вызовет поведение блокировки, как если бы был wait() между двумя.

    Просто чтобы исключить это, вы можете изменить фрагмент $LAB.setOptions({AlwaysPreserveOrder:false}).script(...)... явно отключить этот автоматический wait() поведение, на всякий случай?

  2. Webkit (примерно Chrome 11'ish) перестал извлекать элементы скрипта, если их type Атрибут не был распознанным допустимым типом. Поэтому "текст / кэш" следует игнорировать и не начинать загрузку в Chrome 20 (и во всех остальных браузерах, кроме IE <= 9), потому что это то, что в спецификации сказано делать. Там, где вы видите эту технику в исходном коде LABjs, она фактически используется в качестве запасного варианта в последнем случае, где она применяется ТОЛЬКО к тем действительно старым / устаревшим браузерам webkit, потому что она работала тогда.

Другие вопросы по тегам