Geckoのバージョン74より前のDiscourseはレンダリングされません

コミット 08883cbdd1c39a0c15b97af44ddaefe14acdc21a により、古い Gecko リリースでの Discourse のレンダリングが破損しました。Gecko はバージョン 74 以前ではオプショナルチェーン演算子をサポートしていません。

詳細については、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#browser_compatibility をご覧ください。

「いいね!」 2

これはトランスパイルする必要があるのでしょうか、@pmusaraj / @eviltrout / @j.jaffeux

「いいね!」 3

おそらく間違っているかもしれませんが、最初の推測としては、ブラウザリストを定義していないため、デフォルトのもの(おそらく https://babeljs.io/docs/en/babel-preset-env)が使用され、このバージョンはサポート対象として認識されず、トランスパイルされないということです。

しかし、奇妙なことに、Firefox 74 はわずか 1 年前のバージョンです。ただ、現在の browserlist を見てみると:

$ npx browserslist
...
firefox 89
firefox 88
firefox 78
...

さて、問題は、@sam さん、これをサポートしたいかどうかです。1 年前のバージョンとはいえ、現在の Firefox のバージョンは 89 なので、15 バージョン遡ったことになります。これは判断が難しいですね。これをサポートすると、トランスパイルは基本的にポリフィルと同様に動作するため(このバージョンをサポートするための関数を追加し、構文を関数呼び出しに置き換える)、全ユーザーのペイロードが増加することに注意が必要です。

「いいね!」 2

(安定版では UX: Add auto focus to hamburger and user menu dropdowns (#13165) · discourse/discourse@45dca79 · GitHub です)

気になったのですが、古いコードスタイルでも問題なく動作しています。当面はそれに固執しないのはなぜでしょうか?:thinking: FIX: We can't use `?.` yet (#13168) · discourse/discourse@96fd202 · GitHub

「いいね!」 2

理由はたくさんありますが、主に開発者の負担を軽減するためです。使用可能な機能や制限について深く考えずに済むため、比較的モダンな基盤を維持できます。

「いいね!」 4

HTML のフォールバックが整っていれば、サポートを廃止することに異存はありません。

IE9 では動作する静的ページを表示しつつ、1 年前の Firefox では壊れたページを表示することは絶対にできません。

私は 2〜3 年前の Firefox や Chrome までトランスパイルする方が好みですが、その判断は @eviltrout さんやあなたにお任せします。より攻撃的な方針にしても構いませんが、壊れたページを表示することはできません。

編集:バックリンクを参照してください。これは Android において深刻な問題となり得ます。Android はブラウザのアップグレード頻度が極めて低い傾向にあります。

「いいね!」 5

私も全く同感です。最近、ブラウザの互換性がいくつかの打撃を受けていることを懸念しています。

また、iOS では以下の問題がありました:Safari (iOS) shows blank pages on Discourse instances after beta 8 due to manually disable IntersectionObserver

「いいね!」 1

はい、同意します。最低でも Browserlist のサポートを実装して、未対応の機能が予期せず発生しないようにすべきです。

「いいね!」 3

この問題が Google のインデックス登録を制限する可能性がありますか?

インデックス登録のブロックの原因が他にあるかどうかを確認するために、この問題を調査する必要がありますか?

ありがとうございます。

メタサイトでは OP の再現ができませんでした。Browserstack を使用し、macOS の Firefox 73 と Windows の Firefox 68 で試しました。@vige さん、メタサイトでの問題再現は可能ですか?

「いいね!」 4

おっしゃる通り、実際には動作するはずです。ブラウザでコードを確認しました:

    toggleHamburger: function toggleHamburger() {
      this.state.hamburgerVisible = !this.state.hamburgerVisible;
      this.toggleBodyScrolling(this.state.hamburgerVisible); // ドロップダウン内の最初のリンクに自動フォーカス

      (0, _runloop.schedule)("afterRender", function () {
        var _document$querySelect2;

        (_document$querySelect2 = document.querySelector(".hamburger-panel .menu-links a")) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.focus();
      });
    },

ただし、これが問題の原因ではない可能性があっても、実際に何がトランスパイルされ、何がされないのかを正確に把握しようとすべきです。

「いいね!」 4

@pmusaraj、もし間違っていたら訂正してください。presets-env を設定しておらず、結果として targets も定義していないため、含めるすべてのプラグインが使用されていると考えています。その結果、proposal-optional-chaining は確実に適用されます。

これについては問題ないと思いますが、毎年各プラグインを確認し、まだ必要かどうかを再検討する必要があるかもしれませんね。

「いいね!」 2

見つかりました。stable だけが壊れています。proposal-optional-chaining はそこには適用されていません。

tests-passed では ?. の変更には proposal-optional-chaining の変更が含まれています:DEV: Enable optional chaining in all contexts (#13180) · discourse/discourse@855e854 · GitHub

一方、stable では ?. を含むコード変更のみが行われ、トランスパイラオプションは調整されていませんでした:UX: Add auto focus to hamburger and user menu dropdowns (#13165) · discourse/discourse@45dca79 · GitHub

「いいね!」 3

いい指摘ですね:

  • オプショナルチェーンを含むコードを追加しました
  • それを元に戻しました
  • 正しい Babel プラグインと共に再度追加しました

ただし、5 日前にはプラグインなしで元のコミットのみをバックポートしました:

@pmusaraj 安定版でもプラグインをバックポートするのは安全だと思いますが、いかがでしょうか?

「いいね!」 8

はい、同意します。バックポートすべきですね。本日中に着手します。

「いいね!」 10

これは安定版(v2.7.4)で修正されました。Babel の proposal-optional-chaining プラグインが有効になり、問題が解決しています。

@RGJ @j.jaffeux の皆様、そして元の報告をしてくれた @vige にも感謝します!

「いいね!」 12

なるほど、それで納得がいきました!コードは安定版に含まれているのに、トランスパイラはまだ含まれていないのですね。調査してくださり、ありがとうございます。

「いいね!」 7

ご対応いただいたすべての開発者の方々に心から感謝いたします!

参考までに、私のテストによると、このバグは場合によっては Android 版の最新 Microsoft Edge にも影響を及ぼしていました(AFAIK、Gecko は動作していません)。

「いいね!」 6

お手数ですが、そのリリースに実際の v2.7.4 タグを追加していただけますか?
実は git checkout v2.7.4 を試して 30 分ほど費やしてしまったのですが、タグが存在しませんでした :sweat_smile:

「いいね!」 3

申し訳ありません。現在は タグ付け されています。

「いいね!」 7