シムとポリフィルの違いは何ですか?


406

どちらもWeb開発サークルで使用されているようです。たとえば、HTML5クロスブラウザポリフィルを参照してください。

ここでは、すべてのシム、フォールバック、およびポリフィルを収集しています...

または、es5-shimプロジェクトがあります。

私の現在のプロジェクトでは、これらの数を使用しています。それらをすべて同じディレクトリに貼り付けたいです。だから、私はこのディレクトリを何と呼ぶべきですか--- shims、またはpolyfills


6
再開:「このディレクトリを何と呼ぶべきか」は意見に基づくものであると考えられますが、実際には質問のより大きなコンテキストは与えられていません。この質問の最も重要な側面でもありません。ここでの回答はすべて一致しているようであり、事実、参照、および特定の専門知識の重要な使用があります。
nobar 2018年

回答:


386
  • シムは、実行は、API呼び出しの傍受と抽象化層を提供することは、コードのどの部分です。必ずしもWebアプリケーションやHTML5 / CSS3に限定されているわけではありません。

  • ポリフィルがあるシムの種類現代のHTML5と換装レガシーブラウザこと/ CSS3にはJavaScriptやFlashを使用して通常ます。

特定の質問に答えてshims、ディレクトリを汎用的にしたい場合は、ディレクトリを呼び出します。


234

シム

アダプターパターンに精通している場合は、シムとは何かを知っています。ShimsはAPI呼び出しをインターセプトし、呼び出し元とターゲットの間に抽象レイヤーを作成します。通常、シムは下位互換性のために使用されます。たとえば、es5-shim npmパッケージでは、ECMAScript 5(ES5)構文を記述でき、ブラウザーがES5を実行しているかどうかを気にする必要はありません。テイクDate.nowを例として。これはES5の新しい関数で、ES3の構文はnew Date()。getTime()になります。あなたが使用している場合はES5-シムを次のように書くことができDate.nowを、あなたが実行しているブラウザがサポートES5でそれだけで実行されます。ただし、ブラウザがES3エンジンを実行している場合、es5-shimDate.nowへの呼び出しをインターセプトします代わりに単に新しいDate()。getTime()を返します。この遮断はシミングと呼ばれます。es5-shimからの関連するソースコードは次のようになります。

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

ポリフィル

ポリフィリングは実際にはシミングの特別なバージョンです。ポリフィルは欠落している機能をAPIに実装することですが、シムは欠落している機能の実装が機能の修正ほど重要であるとは限りません。これらは非常に曖昧に思われますが、shimがより広い用語として使用されている場合、polyfillは、古いブラウザーに下位互換性を提供するshimを説明するために使用されます。したがって、シムは古い罪を隠すために使用されますが、ポリフィルは将来の機能強化を元に戻すために使用されます。 例として、IE7でのsessionStorageのサポートはありませんが、sessionstorage npmパッケージのポリフィルは、ウィンドウのnameプロパティにデータを格納するなどの手法を使用するか、Cookieを使用することにより、IE7(およびそれ以前)でこの機能を追加します。


107
したがって、シムは古い罪を隠すために使用されますが、ポリフィルは将来の機能強化を元に戻すために使用されます。これはすべてを私に要約します。分かりやすい説明ありがとうございます。
JohnnyQ、2015年

この回答は役に立ちます。ありがとうございます。しかし、私には、es5-shimを含め、2つの用語がウェブで正確に使用されていないことがよくあります。es5-shimは、定義上、シムとポリフィルの混合だと思います。
Matt Browne 2017年

WOW->シムは古い罪を隠すために使用されますが、ポリフィルは将来の機能強化を元に戻すために使用されます。<-どうもありがとう!
zeppelin

3
日付の例は、ポリフィルのように見えます。なぜそれがポリフィルだと思うのですか?なぜなら、Date.nowはネイティブ呼び出しだからです。ポリフィルは、ブラウザにシームレスな同じAPIでその機能を追加します。シムには、次のような新しいAPIが付属してMyShim.Date.now(); います。間違っている場合は修正してください。
TatzyXY 2018年

99

私が理解していることから:

ポリフィルは、特定の「予期された」APIがないかどうかを検出し、それを手動で実装するコードです。例えば

if (!Function.prototype.bind) { Function.prototype.bind = ...; }

シムは、既存のAPI呼び出しをインターセプトし、さまざまな動作を実装するコードです。ここでの考え方は、さまざまな環境で特定のAPIを正規化することです。したがって、2つのブラウザが同じAPIを異なる方法で実装している場合、それらのブラウザの1つでAPI呼び出しをインターセプトし、その動作を他のブラウザに合わせることができます。または、ブラウザのAPIの1つにバグがある場合、そのAPIへの呼び出しを再度インターセプトして、バグを回避することができます。


66

Axel Rauschmayer氏の著書、Speaking JavaScriptから引用:

  • シムは、古い環境に新しいAPIをもたらすライブラリであり、その環境の手段のみを使用します。
  • ポリフィルは、ブラウザAPIのシムです。通常、ブラウザがAPIをサポートしているかどうかをチェックします。そうでない場合、ポリフィルは独自の実装をインストールします。これにより、どちらの場合でもAPIを使用できます。ポリフィルという用語は、住宅改修製品に由来します。レミーシャープによると:

    ポリフィラは、米国ではSpackling Pasteとして知られる英国の製品です。それを念頭に置いて、ブラウザを亀裂のある壁と考えてください。これらの[ポリフィル]は、亀裂を滑らかにし、ブラウザをスムーズに操作できるようにします。


9

シム。シムは、古い環境に新しいAPIをもたらすライブラリであり、その環境の手段のみを使用します。

ポリフィル。2010年10月、Remy Sharpは「Rick Waldronを介して」「ポリフィル」という用語についてブログに投稿しました。

ポリフィルは、開発者がブラウザーがネイティブに提供することを期待するテクノロジーを提供するコード(またはプラグイン)です。APIランドスケープをフラット化します。


8

これについてよく説明している数年前からこれについて書かれた素晴らしい記事:

ポリフィルとは何ですか?

この記事では、(2)は単にそのように対比されています。

Shim:JavaScript機能を修正するために追加できる(つまり)コードの一部ですが、ほとんどの場合、独自のAPIを備えています

ポリフィル:ドロップインできるもの(つまりJavaScript)であり、サポートされていない既存のブラウザAPIを模倣するように静かに動作します


1
これは、一般的な使用法と、リンク先のブログ投稿で実際にレミーシャープが言うことの両方を誤解を招く表現だと思います。Shimは最近、ポリフィルと同義語として使用されることが多く(特にes5-shimes6-shimを参照)、Remyはに「shim」という単語がカスタムAPIを暗示すること(特にと比較してshim.gif)言及していると述べています。彼は言葉がこのように使用されることを非常に強く要求しておらず、「私に」と言うことにより、彼は自分の使用法が普遍的ではないことを暗黙のうちに認めています。
マークアメリー2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.