クリック時に _ember_jquery が誤ったパスで呼び出される問題

BS4のドロップダウンが機能しないという問題のデバッグを行っていたところ、クリック時に_ember_jquery.jsが/assets/var/www/discourse/public/assetsで呼び出されていることを発見しました。実際には/assetsに配置されているはずです。なぜフルサーバーパスが追加されるのか分かりません。私の知る限り、関連する設定の変更は行われておらず、取り組んでいたのはシンプルなカスタムプラグインの追加のみでした(プラグインを削除しても問題は解消されません)。Discourseについてはまだ初心者ですので、この件に関するご意見やアドバイスがあれば大変助かります。追加の情報が必要であればお知らせください。

これは、この PR: DEV: Bump uglifyjs by romanrizzi · Pull Request #7834 · discourse/discourse · GitHub に起因するソースマップの生成方法に関する問題だと考えています。

以前は、-p 相対オプションが使用されていたため、ソースマップのパスは [‘admin…js.map’] のような形式でした。2.4.beta9 以降、uglify 3 への移行により -p オプションが利用できなくなったため、ソースマップのパスは ‘/var/www/discourse/public/assets/admin…js.map’ のような絶対パスとなりました。これにより、実際のファイルは /assets にあるにもかかわらず、マップが /var/www/…/assets にあることを示しているため、デバッグ時にソースマップが 404 エラーを発生させる原因となりました。

私が発見した回避策は、lib/tasks/asset.rake を変更して、ソースマップパラメータに base オプションを追加することです。以下のようにします。

  base = assets_path + ((d = File.dirname(from)) == "." ? "" : "/#{d}")

  cmd = <<~EOS
    uglifyjs '#{assets_path}/#{from}' -m -c -o '#{to_path}' --source-map "base='#{base}',root='#{source_map_root}',url='#{source_map_url}'" --output '#{to_path}'
  EOS

全員に通用する保証はありませんが、この方法により 404 エラーが発生せずにソースマップ経由でのデバッグが可能になりました。

@sam、これを修正する必要はありましたか?

はい、これは別の場所で追跡しています。@Roman が把握できるよう、TODO に注記を追加します。

遅くなり申し訳ありません。問題は現在修正され、ベータ版および安定版にもバックポートされました。アセットへのパスを含む base 属性を追加し、source 属性にはファイル名のみを残すようにしました。

https://review.discourse.org/t/fix-ensure-sourcemaps-source-is-correct-uses-the-full-assets-path-this-time-8774/8506