以下の内容はhttps://let.blog.jp/tag/CDNより取得しました。


Skypack で壊れる
Skypack を使っていたところでエラーが起きるようになってました
エラーの内容はコンストラクタで this にアクセスする前に super() を呼び出さないといけないというものです

Must call super constructor in derived class before accessing 'this' or returning from derived constructor

Skypack 以外を通して使うと発生してないので元のソースコードには問題はないはずです

エラー箇所を見てみるとプライベートプロパティの変換によるものでした
プライベートプロパティがあると constructor の最初で初期化処理を行うように変換されていて それが this を使うのに super の呼び出しより先に行っているのでエラーでした

こんな感じ

constructor() {
_foo.set(this, void 0);
super();
}

Skypack というよりは Skypack が使ってる変換ツールの問題な気もしますが そもそもプライベートプロパティはもう ES2022 で標準化されているので変換が不要だと思います
しかし 自動で生成されるモジュールのパスを見ると es2019 の文字が入ってるので ES2019 相当で変換されてるようです

Skypack はもうメンテされてなさそうで そういう issue がいくつかできてますし 公式サイトにあるブログも 2021 年から更新されてません
他のサービスに移行したほうがいいのかもしれませんね

といってもどこがいいのでしょうか
Skypack はバンドルもしてくれるあたりがよかったのですが あまりそういうのって他で聞かない気がします

unpkg はよく使いますが 遅いですし ときどき数秒レベルで待たされます
デフォルトでは npm パッケージのままなので node_modules 用のインポートになってます
ブラウザでは解決されません
解決するには URL に ?module を付ける必要があります
解決されてもバンドルはされずにひとつひとつのファイルが個別に変換されるだけです
依存関係が多いとただでさえ遅いのがかなり遅くなって エラーで表示されないのかモジュールのロード待ちなのかわからないことも多々あります

最近は jsdelivr も npm パッケージや Github のリポジトリから直接指定できるようになったのでこっちを使ったりもしています
unpkg に比べると高速です
ESM でブラウザで解決できるようにするには URL の最後に 「/+esm」 をつけます
これをつけるとバンドルもされます
Rollup + Terser で変換してるとコメントに記載されてます
ただ問題があって コードが重複します
オプションで本体に同梱されてないプラグイン系のモジュールをロードすると プラグインごとに共通部分のコードが含まれます
ちゃんと動作確認までしてないですが これがあると別モジュールとして扱われたりしてうまく動かないケースがあるのであまり使いたくないです
Skypack ではバンドルはしてるのですが 適度に分割はされていて確認した限りはこの問題がなかったです
ちゃんとパッケージ全体を見た上で公開されているエントリポイントを基準に分割してるのでしょうか

こういうのがあるので 遅いのを承知で unpkg を module で使うか jsdelivr を変換なしにして importmap で使うかが多いです
importmap が自動で作られるといいのですが 自力でやると依存パッケージが多いと手に負えなくなるんですよね
node_modules フォルダ内の (フォルダ数 x 2) を手作業で記載するような形になりますし

最近は esm.sh を見かけることが増えているのでこれを試してみると いい感じに動きました
Skypack と近い感じです
バンドルされますが コードが重複しないようになってるようです
また ネストされた import で順番にファイルを取得すると遅くなるので エントリポイント部分でフラットに import を展開して並列でロードできるようにするなど高速化の工夫もされています
良さそうに思うのですが 新しいものに飛びついた結果が Skypack ですし もうしばらくは様子見したいところです
unpkg などの CDN の依存解決は実行時のバージョンになる
unpkg などの CDN を使うとき バージョンを指定しなければ最新版が使われます
それだと後々動かなくなるかもしれないのでバージョンを固定するために バージョン付きの URL にします
これで大丈夫だろうとは思っていましたが ダメでした

依存モジュールがある場合は 別の URL をインポートすることになりますが それが別のパッケージの場合は package.json のように ^2.4.0 みたいな指定になります
この指定だと互換性がある中での最新版となり 実行するタイミングによってバージョンが変わります
依存パッケージのバージョンは固定できません

通常は互換性があるバージョンなので問題ないはずですが 完全にそうとはいかないです
バグが入り込むケースもあれば マイナーバージョンのアップデートなのに breaking change を起こしているパッケージもあります
そういうことがあるので yarn.lock などの lock ファイルがあり 依存パッケージのバージョンまで固定しているわけです

CDN が最初のアクセス時点で依存パッケージも含めバンドルしてしまい 同じ URL なら依存パッケージも含めて同じになるようにしてくれるといいのですが それだと依存パッケージに修正が入ってもそれが反映されないとかの問題が出そうです
?key=abcd みたいなクエリをつけて key ごとに初回アクセス時にバンドルしてくれれば 更新したいタイミングで key を変えて対応できそうですが多数の key 違いの URL でアクセスされると CDN 側で保持するバンドル数が多すぎて現実的でないです

依存関係も含めて完全に動作確認済みのバージョンで動作させたいのなら CDN は避けたほうがいいのかもですね
ただ Deno って基本は URL 指定なので同じ問題が起きそうな気がします
ローカルにキャッシュされるので同じ環境だと問題ないですが 別環境だとその時点の最新になるはずです
キャッシュの共有が必要になってくるとそれも面倒です

この辺はどうするのがいいのでしょうね



以上の内容はhttps://let.blog.jp/tag/CDNより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14