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


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 ですし もうしばらくは様子見したいところです
skypack で Node.js ビルトインが正しく処理されてない
例えば Babel のこれ
https://cdn.skypack.dev/-/@babel/helper-module-imports@v7.18.6-gIt8Nv6hvQGBlVjZbvtT/dist=es2020,mode=imports/optimized/@babel/helper-module-imports.js

ソースコードはこれ
普通に assert をインポートして使ってるだけ
https://github.com/babel/babel/blob/v7.18.8/packages/babel-helper-module-imports/src/import-injector.ts

Node.js の assert は関数で ok, fail 等のプロパティに関数を持ってる
skypack の出力を見ると assert は関数でプロパティに ok などの関数をもってる
だけど assert$1 というのを作ってこっちはただのオブジェクト

var assert$1 = /* @__PURE__ */ Object.freeze({
__proto__: null,
default: assert,
AssertionError,
fail,
ok,
assert: ok,
equal,
notEqual,
deepEqual,
deepStrictEqual,
notDeepEqual,
notDeepStrictEqual,
strictEqual,
notStrictEqual,
throws,
doesNotThrow,
ifError
});

これを関数として呼び出してるので assert 箇所でエラーが起きる
default とかあるし export 用オブジェクトみたい

Rollup で自分でバンドルすればこの問題は起きなかったけど process や global 等の Node.js のグローバル変数がなかったり 循環参照が発生するせいで undefined のプロパティを参照する箇所があったり
グローバル変数問題はプラグインがあるかもだけど globalThis にそれっぽいプロパティを入れて対処
循環参照は自動でできないならどうしようもないのでコードを見ながら手作業で修正
どうにか動くようにできたけどすごく面倒
unpkg は ESM なら ?module で解決できるようにしてくれるけど CJS だとそのままになる

ブラウザで動くようにしてくれるサービスがもっと増えてほしい



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

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