6

現在再生中のトラックと Soundcloud の進行状況を監視するグリースモンキー スクリプトを維持しています。以前は、require("lib/audiomanager")トラック情報の再生など、ページ全体の状態を表示できるオブジェクトにアクセスするだけで済みました。

問題は、Soundcloud がクライアント側の Javascript に webpack を使用するようになったことです。私の理解では、これにより、これらすべてのクラスが特定の番号としてパッケージに格納されます。それらが保存されている数は、クライアント側の JS が更新されて再コンパイルされるたびに変化するように見えます。

webpack 内に格納されたオブジェクトにアクセスする唯一の方法は、以下のようにグローバルな webpackJsonp を介するようです。パックの番号は一意である必要があります。

webpackJsonp([6060], {
    0: function (e, t, n) {
        window.aman = n(726);
        e.exports = function (abc) {
            console.log("Exports called");
        };
    }
});

そのコードが実行され、webpack のその番号のオブジェクトにアクセスできるようになります。クライアント側の webpack'd JS で定義されているオブジェクトは次のとおりです。

726: function (e, t, n) {
    (function (t) {
        function i(e) {
            var n = t(e.getContainerElement()),
                i = e.getState() === r.States.ERROR;
            n.toggleClass('blocked', i)
        }
        var r,
            s = n(53),
            o = n(14),
            a = 1000 / 60;
        e.exports = r = new s({
                flashAudioPath: n(2181),
                flashObjectID: 'flashAudioObject',
                updateInterval: a,
                debug: !1
            }),
            r.Errors = s.Errors,
            r.States = s.States,
            r.UPDATE_INTERVAL = a,
            o.once('audio:flash_block audio:flash_unblock', i)
    })
    .call(t, n(1))
},

だから、私が考えることができる解決策:

  • このオブジェクトへのハンドルを取得するために使用できる、webpack 番号が変更されないオブジェクトを見つけます
  • すべての webpack 番号を繰り返し、これと同じメソッド セットを持つオブジェクトを探します。

後者はややこしいようで、前者は不可能に思えます。何か案は?

私が試したこと:

  • 目的のオブジェクトのように新しい n(53) を作成すると、更新間で同じままであるように見えます。audiomanager が表示されますが、ページの通常の audiomanager とは完全に分離されているため、何が再生されているかわかりません。
4

2 に答える 2

3

私たちもクライアント側のスクリプトでSoundCloud APIを使用しているため、最終的には少し「よりクリーンな」コードになりました。これがその主要部分です (すべてのモジュールが存在するため、try-catch ブロックが含まれていないことに注意してください)。

var playManager, libAudio, eventBus;

webpackJsonp([], {0: function(a, b, require) 
{ 
    var modules = require.c;

    for (var moduleid in modules)
    {
        var el = require(moduleid);

        if (typeof el["playCurrent"] == "function")
        {
            playManager = el;
        }
        else if (typeof el["getSettings"] == "function")
        {
            libAudio = el;
        }
        else if (typeof el["trigger"] == "function" 
               && typeof el["bind"] == "function"
               && typeof el["listenToOnce"] == "function" &&
               typeof el["$"] != "function" &&
               typeof el["broadcast"] == "function")
        {
            eventBus = el;
        }
}     
于 2015-01-20T08:32:03.787 に答える