私は現在カスタム要素で遊んでいます。私は、サポートが不足しているブラウザ(多分Firefoxのみですか?)にpolyfillブラウザをインストールするには正しい方法(正しい方法のような感じ)を見つけるのに苦労しています。カスタム要素のポリフィルをロードする最適な方法は何ですか?
私は現在、次のやっている:
if ('customElements' in window) {
var e = document.createElement('script');
e.src = '/static/elements/my-element.js';
document.body.appendChild(e);
} else {
var e = document.createElement('script');
// customElements
e.src = 'https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.0.8/webcomponents-sd-ce.js';
e.onload = function() {
var c = document.createElement('script');
// ShadyCSS
c.src = '/static/js/custom-style-interface.min.js';
c.onload = function() {
var i = document.createElement('script');
i.src = '/static/elements/my-element.js';
document.body.appendChild(i);
}
document.body.appendChild(c);
}
document.body.appendChild(e);
}
これは動作しますが、(特に高/低速の待ち時間のネットワーク上で)明らかに、非常に非効率的であり、また非常に騒々しい見えます。 Firefoxをサポートしようとする前に、私は単に次のようにしました:
<script src="/static/elements/my-element.js"></script>
私は上記の嫌悪を持っています。より良い方法が必要ですが、私はそれを見つけることができません。
の前にcustomElementとShadyCSSポリフィルが実行されていることを確認しても、それほどダウンロードが遅れることはありませんか?どのポインタも高く評価されています!
編集: 今のところ私はここで追加する別のアプローチを使用しています。私はそれが完璧だとは思わないが、私の最初のアプローチよりも優れているように思えるし、誰もがポリフィルをダウンロードしてもらう必要があるかどうかは関係ありません。
function insertScript(url, downloadAsync) {
const script = document.createElement('script');
document.head.appendChild(script);
script.async = downloadAsync;
script.src = url;
return script;
}
function downloadAsync(url) {
return new Promise((resolve, reject) => {
const script = insertScript(url, 'true');
script.onload = resolve;
script.onerror = reject;
});
}
var deps = [];
if (!('customElements' in window)) {
deps.push(downloadAsync('/url/of/polyfill.js'));
// if you need more than 1 polyfill add more deps.push
}
Promise.all(deps).then(() => {
insertScript('/static/elements/my-element.js');
});
誰もが必要としているかどうかにかかわらず、82kb/64kbを強制するのは、むしろ私がやりたいことです。私は 'webcomponents-loader.js'を使ってみましたが、私のカスタム要素は実際のポリフィルが実行される前に実行されているようです(動的に読み込まれたスクリプトは非同期で実行されるようです)。 –
はい、非同期ですので、リンクで説明されているようにWebComponentsReadyイベントを待つ必要があります – Supersharp