インストール
Nodeがまだインストールされていない場合は、インストールしてください。
プロジェクトにモジュールをインストールするには、npm
を使用します:
npm install @wordpress/redux-routine
@wordpress/redux-routine
は、JavaScript言語の2つのモダンな機能であるPromisesとGeneratorsの両方を活用しています。古いブラウザ(Internet Explorer 11以前)をサポートする必要がある場合は、自分でポリフィルを提供する必要があります。
使用法
例えば、ネットワークリクエストを発行する必要がある一般的なケースを考えてみましょう。ミドルウェアを作成する際に、ネットワークリクエストを制御ハンドラとして定義できます。
``````bash
import { combineReducers, createStore, applyMiddleware } from 'redux';
import createMiddleware from '@wordpress/redux-routine';
const middleware = createMiddleware( {
async FETCH_JSON( action ) {
const response = await window.fetch( action.url );
return response.json();
},
} );
function temperature( state = null, action ) {
switch ( action.type ) {
case 'SET_TEMPERATURE':
return action.temperature;
}
return state;
}
const reducer = combineReducers( { temperature } );
const store = createStore( reducer, applyMiddleware( middleware ) );
function* retrieveTemperature() {
const result = yield { type: 'FETCH_JSON', url: 'https://' };
return { type: 'SET_TEMPERATURE', temperature: result.value };
}
store.dispatch( retrieveTemperature() );
`
この例では、retrieveTemperature
をディスパッチすると、制御ハンドラが有効になり、ネットワークリクエストが発行され、その結果がresult
変数に割り当てられます。リクエストが完了した後にのみ、アクションクリエーターはSET_TEMPERATURE
アクションタイプを返す処理を続行します。
API
デフォルト
アクションタイプごとに動作する制御のオブジェクトを与えることで、Reduxミドルウェアを作成します。各キーはアクションタイプであり、値はアクションの評価が続行されるべきときに解決されるPromiseまたは値を返す関数です。値または解決されたPromiseの値は、yieldの戻り値に割り当てられます。制御ハンドラがundefinedを返す場合、実行は続行されません。
パラメータ
- controls
Record<string, (value: import('redux').AnyAction) => Promise<boolean> | boolean>
: 制御ハンドラのオブジェクト。
戻り値
動機
主な動機には、他にも以下が含まれます:
- **テスト可能性**: アクションクリエーターがプレーンなアクションオブジェクトをyieldするため、その解決の動作はテストで簡単に置き換え可能です。
- **制御された柔軟性**: アクションタイプの表現力と意図性を犠牲にすることなく、制御フローを実装できます。thunksやpromisesのような他のソリューションは究極の柔軟性を促進しますが、アクションタイプと偶発的な実装の間の深い結合を通じて保守性の犠牲を伴います。
- データフローを表現するための**共通のドメイン言語**: 制御が中央で定義されているため、新しい制御ハンドラを追加する際の開発チームの意識的な決定が必要です。
<a name="testing"></a>
## テスト
アクションクリエーターはプレーンなアクションオブジェクトの反復可能なジェネレーターを返すため、テストは非常に簡単です。
再度、上記の例を考えてみましょう:
``````bash
function* retrieveTemperature() {
const result = yield { type: 'FETCH_JSON', url: 'https://' };
return { type: 'SET_TEMPERATURE', temperature: result.value };
}
`
テストケース(Nodeのassert
組み込みモジュールを使用)を次のように記述できます:
import { deepEqual } from 'assert';
const action = retrieveTemperature();
deepEqual( action.next().value, {
type: 'FETCH_JSON',
url: 'https://',
} );
const jsonResult = { value: 10 };
deepEqual( action.next( jsonResult ).value, {
type: 'SET_TEMPERATURE',
temperature: 10,
} );
アクションクリエーターがyieldされた結果を変数に割り当てない場合、Array.from
を使用してアクションクリエーターの結果から配列を作成することもできます。
このパッケージへの貢献
これはGutenbergプロジェクトの一部である個別のパッケージです。このプロジェクトはモノレポとして整理されています。特定の目的を持つ複数の自己完結型ソフトウェアパッケージで構成されています。このモノレポ内のパッケージはnpmに公開され、WordPressや他のソフトウェアプロジェクトで使用されています。
このパッケージやGutenberg全体への貢献について詳しく知りたい場合は、プロジェクトの主要な貢献者ガイドをお読みください。