7

Redux でアプリケーションを作成していて、サードパーティのライブラリを使用してログを追加する任務を負っているとします。その API は次のとおりです。

function createLogger(token) {
    // the logger has internal state!
    let logCount = 0;

    return {
        log(payload) {
            logCount++;            // modify local state

            fetch('/someapi', {    // ship payload to some API
                method: 'POST',
                body: payload
            });
        }
    };
}

次に、ライブラリを次のように使用します。

let logger = createLogger('xyz');
logger.log('foobar');

私は間違いなく、アプリケーションの初期化中に一度だけロガー インスタンスを作成したいと考えています。しかし、問題は、ロガー インスタンスをどこに保存すればよいかということです。

最初の本能は、店のどこかに置くことです。しかし、それは良い考えですか?コードで示したように、ロガー オブジェクトはステートフルであり、クロージャーにカウンターを格納します。不変オブジェクトの場合のように、新しいインスタンスを取得しません。ご存知のように、状態は純粋なレデューサー関数を介してのみ変更する必要があります。

他の可能性は、redux ミドルウェア クロージャーのどこかにインスタンスを作成するか、単にグローバル変数を作成することです。これは、テスト容易性の点で明らかに悪です。

この(私が思うに)かなり一般的なシナリオのベストプラクティスはありますか?

4

2 に答える 2

0

Reduxのドキュメントから:

/**
 * Sends crash reports as state is updated and listeners are notified.
 */
const crashReporter = store => next => action => {
  try {
    return next(action)
  } catch (err) {
    console.error('Caught an exception!', err)
    Raven.captureException(err, {
      extra: {
        action,
        state: store.getState()
      }
    })
    throw err
  }
}

Ravenサードパーティのライブラリです。

ライブラリに独自の状態がある場合、ミドルウェアでそれを使用しても問題にはなりません (状態はアプリではなくライブラリに属します)。何らかの理由でその状態を作成している場合、その状態はおそらく store.logger などの下の Redux ストアに属している必要があります。

于 2015-12-10T16:55:07.320 に答える