puppeteer 13.3.1がリリースされました。
さっそくリリースノートを見ていきましょう。
Bug Fixes
https://github.com/puppeteer/puppeteer/releases/tag/v13.3.1
・puppeteer: revert: esm modules
先日紹介した ES module に関する修正を巻き戻したとのことです。
ここでちょっとだけおさらいを。ES moduleではexportsで何をモジュールとして提供するかを明確に指定することができます(一応defaultsもあるのですが、今回は説明を割愛)。これは、モジュールで提供されている関数やクラスなどを後から上書きできないようする、いわばES moduleのセーフティ機構でもあるわけです。これが前回の修正では裏目に出てしまったようです。
Common JSではモジュールは結局のところただのオブジェクトです。そのためモジュールとして公開している意図はなかったとしても、オブジェクトからプロパティとして見えていたら使えてしまうわけです。この puppeteer の内部のプロパティを参照する使い方をしている NodeJS モジュールがあったのが問題だったわけです。 Common JS では問題なく見えていたのですが、 ES module 用に厳密なexportsを定義したところ、puppeteerチームは公開しているつもりがなかったプロパティがexportsされなくなってしまったのです。そして、このプロパティを参照してた NodeJS モジュールの方では値が取れなくなってしまったわけです。
JavaやC#、そしてTypeScriptであればprivate/publicなどで制御できたかもしれませんが、ゆるゆるなJavaScriptだと気付かないところでプロパティを直参照される・・・なんてことが起きやすいのです。そういった不慮の公開(?)を防ぐ上でも ES module としてexportsすることに効果はあると思います。