Black lives matter
Portrait Dr. Axel Rauschmayer
Dr. Axel Rauschmayer
Homepage | Twitter
Cover of book “JavaScript for impatient programmers”
Book, exercises, quizzes
(free to read online)
Cover of book “Deep JavaScript”
Book (50% free online)
Cover of book “Tackling TypeScript”
Book (first part free online)
Logo of newsletter “ news”
Newsletter (free)

What is the difference between a shim and a polyfill?

[2011-12-20] dev, javascript, clientjs, jslang
(Ad, please don’t block)

In the JavaScript world, one frequently encounters the words shim and polyfill. What are those things and what is the difference between them?

Shim. A shim is a library that brings a new API to an older environment, using only the means of that environment.

Polyfill. In October 2010, Remy Sharp blogged about the term “polyfill” [via Rick Waldron]:

Thus, a polyfill is a shim for a browser API. You typically check if a browser supports an API and load a polyfill if it doesn’t. That allows you to use the API in either case. The term polyfill comes from a home improvement product (quoting Remy Sharp):
Polyfilla is a UK product known as Spackling Paste in the US. With that in mind: think of the browsers as a wall with cracks in it. These [polyfills] help smooth out the cracks and give us a nice smooth wall of browsers to work with.
Polyfilla – image from [via Paul]
Examples. Paul Irish has published a list with “HTML5 Cross Browser Polyfills”. es5-shim is an example of a (non-polyfill) shim – it retrofits ECMAScript 5 features on ECMAScript 3 engines. It is purely language-related and makes just as much sense on Node.js as it does on browsers.