Discourseのアップグレード後にテーマが壊れる - テーマコンポーネントの「use strict」の変更について

最新のコミットレベル(105634435f)に更新しました。Discourse はおおよそ週に一度アップグレードしていますが、通常は全く問題が起きません。しかし今回は、複数のテーマコンポーネントが読み込めなくなりました。「読み込めない」とは、コンポーネントが表示されなくなったことを意味します。管理パネルのログ機能には、この問題に関連する異常な記録は表示されません。これらのエラーの多くは一時的なものであり、すでに長い期間にわたって発生しています。まれな MimeType エラーや Google への DNS タイムアウトなどがそれにあたりますが、これらも頻度は低いです。

以下のプラグインはアップグレード後に読み込めなくなりました:

  • DiscoTOC
  • discourse gifs
  • Discourse Jitsi
  • Hamburger Theme Selector
  • Nav Links Component
  • Tag Icons

動作しているのは以下のものです:

  • Discourse Kanban
  • Easy Footer

さらに情報が必要な場合(おそらく必要でしょう)、喜んで提供します。指示をお願いします。この投稿は、何かがおかしく、おそらく最近の変更が原因であるというお知らせとしてのものです。情報が不足していることをお詫びします。

さらに、xxx = 330; のような非厳密な JavaScript の変数定義は、var xxx = 330; の代わりに使用すると、JS で「未定義の変数」エラーを引き起こします。当社のスクリプトでは、これらすべてを変更する必要がありました。

はい、一部のテーマコンポーネントに問題があります。修正に取り組んでいます。

@pmusaraj ありがとうございます。
頑張ってください。

コンポーネント内で非厳密定義された JS 変数に対してエラーがスローされる理由をご存知ですか?これはポストプロセッシングのエラーでしょうか?ここに変更はありましたか?

この問題を引き起こした変更は1時間前に元に戻されました。影響を受けたサイトの方は、最新版に更新してください。

ファルコさんがおっしゃったことに加えて、この変更は数日中に再び実装されますが、その前に公式のテーマやコンポーネントがすべてこの変更と互換性があることを確認します。そのため、再び公式のテーマやコンポーネントで問題が発生した場合は、それらを更新することで解決するはずです。

また、カスタムまたはプライベートなコンポーネントを使用しているサイト管理者向けに、テーマやコンポーネントを互換性のある状態にする方法について説明する投稿も作成します。

本日のご迷惑をおかけし、申し訳ございません。

当社のテーマ(バナーテーマ)の1つが、初期形式に完全に上書きされ、私たちが行っていたすべての変更が失われました。そのテーマは2018年以来、更新されていませんでした。変更を元に戻すことは可能でしょうか?

うーん、それは本当に奇妙ですね。Revert "FEATURE: Introduce theme/component QUnit tests (#12517)" (#12… · discourse/discourse@2b9ab3a · GitHub を含むようにインスタンスを再度更新しましたか?「初期フォーマット」というのは具体的に何を指しているのか、もう少し詳しく説明していただけますか?つまり、テーマの JS/CSS にローカルの変更を加えていたのに、今それらの変更がすべて失われてしまった、ということでしょうか?

これには、JavaScript の変数定義に関する問題の説明も含まれていますか?含まれている場合、どのように説明されていますか?

この問題は、元に戻された機能とは関係ないと思います。数週間前、コンポーネントで同じケースに遭遇しました。おそらくフォークインジケーター機能の頃だと思います(これはプラグインに関わるので :roll_eyes: おそらく無関係かもしれませんが、単にコンポーネントをフォークして修正する必要がありました)。

それは本当に奇妙ですね。そのような問題はこれまで一度もありませんでした。最新バージョンになって急に発生しました。ここで具体的に何が起こっているのか気になります。

これは、テーマ内の「インライン」JavaScript にも影響を及ぼす複雑な変更でした。この変更は取り消され、再適用に先立ち、今後数日間で再検討される予定です。詳細については、https://github.com/discourse/discourse/pull/12517 をご覧ください。

はい、その変更がご自身のテーマで発生した問題の原因です。何が起きたかを説明するために、テーマシステムについて少し詳しく解説します。Discourse のテーマやコンポーネントに JavaScript を追加する方法は 2 つあります。1 つ目は head_tag.html ファイル内に <script type="text/discourse-plugin"> タグを使用する方法、もう 1 つ目はテーマ/コンポーネント内の javascripts というディレクトリに配置されたスタンドアロンの JS ファイルを使用する方法です。

本日の私の変更以前は、それらの特別なスクリプトタグ内の JavaScript は、Ember CLI を使用して Discourse を開発している際に利用できない Discourse グローバル変数に依存する形で処理されていました。本日プッシュした変更により、Discourse はそれらのタグ内の JavaScript をスタンドアロンファイルから来たものと同様に扱うようになり、Discourse グローバル変数を使用する必要がなくなりました。

ここで、JavaScript タグをファイルとして扱うことによる「副作用」の 1 つとして、タグ内の JavaScript に以前は存在しなかった "use strict" ディレクティブが追加されるようになります。このディレクティブが、あなたが目にしたエラーの原因です。

本日のテーマで行った変更はすべて維持することをお勧めします。私が変更を元に戻す際、JS タグは再びスタンドアロンファイルとして扱われるようになります。

はい、単にコード内の定義が緩やかだったためで、定義を厳密にすればすべて正常に動作しています。

とにかく、詳しくご説明いただきありがとうございます。他の人にも役立つかもしれませんね。

はい、すべて消えてしまいました。CSS や JS の変更から、テキストの変更さえも :sweat: つまり、私のテーマは「Lorem ipsum dolor sit amet …」といったテキストを含む初期フォーマットに戻ってしまいました。いずれにせよ、バックアップを使用しますが、アップグレード後にこのようなことが起こるのは不思議ですね。

@Pad_Pors さん、こんにちは。

ご質問の件は、おそらくこちらに関連しているかと思います。:slightly_smiling_face:

また、以前書かれていた別のトピックについてですが:

そのため、Discourse のアップデートがしばらく行われていないのではないかと考えられます。