2012-01-04 2 views
34

ECMAScript Fifth Edition (2009 년 12 월 출시)에는 많은 새로운 방법이 도입되었습니다 (자세한 내용은 this table 참조). 그러나, 거기에 아직도 그 새로운 방법을 구현하지 않는 오래된 브라우저가 있습니다.ECMAScript 5 (ES 5) 제공 방법 -shim?

다행히 편리한 스크립트 (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> 

(나는 브라우저가 모든 새로운 ECMAScript를 5 개 메소드를 구현 있는지 확인하는 Function.prototype.bind을 사용하고 내가 위의 링크 된 호환성 테이블에 따르면, bind이 : 정말 필요 그래서 같은 그 브라우저가 "방해" ECM 구현에 관한 "마지막 요새" AScript 5 개 방법.) 물론

이 심 효과적 일을 위해, 그것은 전에 을 실행해야 우리가에서 (초기 페이지에서 위에서 언급 한 SCRIPT 요소를 포함 할 것을 의미 다른 모든 스크립트, HEAD, 다른 모든 SCRIPT 요소보다 먼저).

이렇게 두 번째 예제는 ECMAScript 5-shim을 브라우저에 제공하는 좋은 방법일까요? 그것을 할 수있는 더 좋은 방법이 있습니까?

답변

22

ES5-Shim은 브라우저가 구현하지 않는 부분만을 심을 것이므로 모든 브라우저에 제공하십시오. 그것은 shimmed해야하고 무엇이 필요하지의 탐지를 처리합니다.

그러나 어떤 경우에는 어떤 심이 제대로 작동하지 않는지주의해야합니다. 나는 그 문제를 과거에 가지고 있었고 그 대답이 매우 간단하다는 것을 깨닫기 전까지는 많은 고통을 겪었습니다 ...

+8

을하지만 (즉, 크롬, 파이어 폭스, 곧 오페라 최신) 다운로드하고 불필요하게 웹 페이지 속도가 느려집니다 심의를 실행 ES5 호환 브라우저를 강제 . 약간의 JavaScript 확인으로이 문제를 피할 수 있다면 기꺼이 해보겠습니다. –

+3

@ imeVidas : 8kB입니다. 적절한 캐싱을 사용하면 걱정할 필요가 없습니다. – You

+0

성능 저하는 무시할 수 있습니다. ES5 Shim은 불필요한 코드 실행을 피하기 위해 이미 할 수있는 일을합니다. – JaredMcAteer

8

현재 ES5-Shim에서 가장 잘 작동하는 솔루션은 다음에서 라이브러리를 사용하는 것입니다. 모든 환경을 지원하며 런타임에 패치 할 기능을 감지 할 수 있습니다. 사이트 간 캐시 히트를 최대화하려면 커뮤니티 CDN에서 제공하는 것이 더 좋습니다.

즉, 기능 검색, 에이전트 핑거 프린팅 및 동적 번들링을 결합하여 대상화 된 심 서브 세트를 자동으로 생성 및 전달하는 시스템을 만드는 기회가 있습니다. 문제의 범위는 ES5-Shim을 넘어서서 모든 종류의 심에 적용될 수 있습니다.

+0

네, 저는 그것을 호스팅하는 [CDNJS] (http://www.cdnjs.com/)를 발견했습니다 ... –

12

이 나를 위해 작동하는 것 같다 :

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

IE가 아닌 브라우저는 어떻습니까? ES5를 지원하지 않습니까? – Bergi

+3

@Bergi : 나는 그것들이 실제로 존재한다고 생각하지 않습니다. –

+1

@RocketHazmat : "거의 사용하지 못했다"는 것을 의미한다고 생각되지만 확실히 존재합니다. 인기있는 브라우저 또는 일부 내장형 또는 모바일 브라우저의 ES5 이전 버전을 사용하십시오. – Bergi