Можно ли загрузить Bootstrap асинхронно?

Я не использовал Bootstrap очень долго и не уверен, Нужно ли его загружать не асинхронно в <head> для создания страниц.

Google предлагает используя этот код для асинхронной загрузки JS-файлов:

<script type="text/javascript">

 // Add a script element as a child of the body
 function downloadJSAtOnload() {
 var element = document.createElement("script");
 element.src = "deferredfunctions.js";
 document.body.appendChild(element);
 }

 // Check for browser support of event handling capability
 if (window.addEventListener)
 window.addEventListener("load", downloadJSAtOnload, false);
 else if (window.attachEvent)
 window.attachEvent("onload", downloadJSAtOnload);
 else window.onload = downloadJSAtOnload;

</script>

могу я загрузить bootstrap.min.js таким образом, или я должен загрузить его не асинхронно?

2 ответов


Bootstrap.js требует запуска jquery. Если вы хотите получить выгоду от загрузки асинхронного скрипта, то вы, вероятно, захотите загрузить jQuery (и потенциально другие библиотеки) async... Проблема в том, что у вас не будет гарантии, что jQuery async завершится до начальной загрузки, используя приведенный выше пример кода. Я также уверен, что у вас есть свой собственный javascript, который вы хотите написать, чтобы использовать bootstrap.особенности js. Это означает еще больше зависимостей. Вы может напишите логику для подключения зависимостей и асинхронной загрузки вручную, но это станет большой работой, поскольку количество сценариев, которые вам могут понадобиться, увеличится.

помощью RequireJS - это библиотека, которая заботится обо всем этом управлении зависимостями для вас и может загружать ваши файлы асинхронно (и в правильном порядке). Другим преимуществом этой библиотеки является оптимизатор, который может отслеживать зависимости и" записывать " их в один (необязательно уменьшенный) файл. После того, как вы используете оптимизатор для оптимизации вашего "основного" JS-файла (со всеми зависимостями, необходимыми для страницы), requireJS может просто загрузить этот файл асинхронно. Нужен только один скрипт!

пример будет выглядеть так:

/ app / main.js:

requirejs.config({
    paths: {
        jquery: "lib/jquery-1.11.0",
        bootstrap: "lib/bootstrap"
    },
    shim: {
        bootstrap: {
            deps: ['jquery']
        }
    }
});

//Define dependencies and pass a callback when dependencies have been loaded
require(["jquery", "bootstrap"], function ($) {
    //Bootstrap and jquery are ready to use here
    //Access jquery and bootstrap plugins with $ variable
});

С помощью jQuery.JS и ушко.в этом случае js будет жить под /app/lib (вместе с require.в JS).

в HTML-вы бы этот скрипт:

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

это будет нагрузка в bootstrap и jquery(в правильном порядке), а затем передайте эти модули в качестве параметров (только jquery/$ необходим, так как bootstrap-это просто плагин поверх jquery) в вашу функцию обратного вызова.


думал, что я просто добавлю это с моим опытом (ценю, что многие люди, вероятно, уже знают об этом )

Итак, принимая Patricks отличный ответ (который мне очень помог, так что спасибо), если вы запустите свой сайт против https://developers.google.com/speed/pagespeed/insights/ он все равно даст вам предупреждение, что

Eliminate render-blocking JavaScript and CSS in above-the-fold content
Your page has 1 blocking script resources
Remove render-blocking JavaScript:
http://mydomain/js/require.js

но принимая настройку OP (и тот, который рекомендует Google), вы можете сделать это непосредственно перед </body> tag

<script type="text/javascript">
  function requireJSOnload() {
    var element = document.createElement("script");
    element.src = "/js/require.js";
    element.setAttribute('data-main', '/js/main');
    document.body.appendChild(element);
  }
  if (window.addEventListener)
    window.addEventListener("load", requireJSOnload, false);
  else if (window.attachEvent)
    window.attachEvent("onload", requireJSOnload);
  else window.onload = requireJSOnload;
</script>

Теперь, когда вы бежите против https://developers.google.com/speed/pagespeed/insights/ у вас не будет сценариев блокировки JS.

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

спасибо