Как обеспечить ECMAScript 5 (ES 5)-шим?

В пятом издании ECMAScript (выпущено в декабре 2009 года) представлено несколько новых методов (подробности см. В этой таблице). Тем не менее, все еще существуют старые браузеры, которые не реализуют эти новые методы.

К счастью, существует удобный скрипт (написанный на JavaScript) - ES5-shim, который реализует эти методы вручную в тех средах, где их нет.

Тем не менее, я не уверен, как обеспечить ES5-shim... Должен ли я просто "дать" его всем браузерам, вот так:

<script src="es5-shim.js"></scipt>

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

<script>
    if ( !Function.prototype.hasOwnProperty( 'bind' ) ) {
        (function () {
            var shim = document.createElement( 'script' );
            shim.src = 'es5-shim.js';
            var script = document.getElementsByTagName( 'script' )[0];
            script.parentNode.insertBefore( shim, script );
        }());
    }
</script>

(Я использую Function.prototype.bind проверить, реализует ли браузер все новые методы ECMAScript 5. В соответствии с таблицей совместимости, которую я связал выше, bind является "последним бастионом", когда дело доходит до реализации методов ECMAScript 5.)

Конечно, чтобы эта прокладка была эффективной, она должна выполняться перед всеми другими сценариями, что означает, что мы хотим включить вышеупомянутые элементы SCRIPT в начале страницы (в HEAD, перед всеми другими элементами SCRIPT).

Итак, будет ли этот второй пример хорошим способом предоставить ECMAScript 5-shim для браузеров? Есть ли лучший способ сделать это?

3 ответа

ES5-Shim будет обрабатывать только те части, которые не реализованы в браузерах, поэтому просто предоставьте их всем браузерам. Он будет обрабатывать обнаружение того, что нужно переложить, а что нет.

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

Кажется, это работает для меня:

<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]-->

В настоящее время решение, которое лучше всего работает с ES5-Shim, заключается в использовании библиотеки во всех средах и позволяет ей определять, какие функции необходимо исправлять во время выполнения. Было бы еще лучше доставить его из CDN сообщества, чтобы максимизировать попадания в кеш между сайтами.

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

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