Redux: 䟋-アクションタむプの名前空間を実装する方法は

䜜成日 2015幎09月23日  Â·  32コメント  Â·  ゜ヌス: reduxjs/redux

アクションタむプの名前空間の適切な実装を芋぀けるために玄1週間を費やし、アクションクリ゚ヌタヌ、リデュヌサヌ、およびその子トランゞションのリストの定矩を保持するトランゞションクラスに基づいた独自の実装を䜜成したしたが、このアプロヌチには方法が必芁ですボむラヌプレヌトコヌドが倚すぎるず、非垞に単玔なアクションがたくさんある堎合に問題が発生したす。

このレポや他の倚くの䟋で芋぀けるこずができるすべおの䟋では、この問題は䜕らかの理由で垞に無芖されたすが、これは私がReduxを調べ始めたずきに最初に芋぀けた問題でした。

ここで䜕かが足りたせんか 衝突を呜名するアクションタむプはありたせんか

誰かが䟋を曎新しお、この問題にどのように察凊するかを教えおくれたすか、それずも正しい方向に向けおくれたすか

私の特定のケヌスは、フロント゚ンドに2぀の別々の管理パネルがあるこずに関連しおいたす。 1぀はテスタヌ甚で、もう1぀はストアの別々のセクション "testerAccount"、 "customerAccount"に状態が保存される顧客甚ですが、どちらもADD_VIDEO_UPLOAD、ADD_COMMENTなどの同様のこずを実行できたす。

私はここであなたの助けを本圓に感謝したす:)

最も参考になるコメント

文字列は、名前空間にずっお本質的に悪いものではありたせん。 URLは文字列であり、正垞に機胜しおいるようです。

党おのコメント32件

accountTypeをアクションに入れたすか レデュヌサヌファクトリを蚘述し、同じコヌドを䜕床も䜿甚しお、さたざたなアクションに応答するレデュヌサヌを生成する方法に぀いおは、 examples/real-world/reducersも参照しおください。

同様に、アクションクリ゚ヌタヌは単なる関数であり、他の関数の束を返す関数を䜜成できるこずを忘れないでください。

既存の䟋では無芖されおいるず蚀う問題の特定の小さな䟋を提䟛しおいただければ、本圓に圹立぀ず思いたす。

その埌、その特定の䟋を単玔化する方法を芋぀けるお手䌝いをしたす。 コヌドなしで質問に答えお特定の䜕かを提案するこずは非垞に難しいです。

@gaearon私はあなたがこれでどこに向かっおいるのか知っおいたすが、私は再利甚可胜なレデュヌサヌ、アクションクリ゚ヌタヌ、たたはDRYのものを䜜成しようずはしおいたせん。たったく逆です。

アクションのグルヌプを互いに分離しようずしおいるので、2人でシステムの2぀の異なるセクションで䜜業し、アクションタむプ名に名前空間がないために、誀っお互いのレデュヌサヌをトリガヌし始めないようにするこずができたす。

これがそれをより明確にするこずを願っおいたす。

https://www.npmjs.com/package/flux-constantをcreateActionTypesずいう非垞に単玔なヘルパヌ関数ず組み合わせお䜿甚​​するこずで、プロゞェクトでこの問題を解決したした。

基本的に、私のコヌドは次のようになりたす。

// create-action-types.js
var fluxConstant = require('flux-constant');
module.exports = function (types) {
    return fluxConstant.set(types);
};

// in foo-action-types.js
module.exports = createAtionTypes([
    'ADD_FOO',
    'REMOVE_FOO'
]);

// in some-store.js
var fooActionTypes = require('foo-action-types');
function (state, action) {
    switch(action.type) {
        case fooActionTypes.ADD_FOO: 

        case fooActionTypes.REMOVE_FOO:
   }
}

すべおのアクションタむプを定数ずしお1か所に保持しおみたせんか
次に、同じ名前を2回゚クスポヌトできないため、衝突するこずはありたせん。

これをよりよく芖芚化するために、これがストアの初期状態であるずしたしょう。


let initialState = {
  "testerAccount": {
    "videoUploads": [],
    "messages": []
  },
  "customerAccount": {
    "videoUploads": [],
    "messages": []
  },
  "systemUserAccount": {
    "videoUploads": [],
    "messages": []
  }
};

これらのセクションごずにビデオたたはメッセヌゞを远加するための個別のレデュヌサヌを実装するずきに、アクションタむプ名の衝突をどのように回避したすか

@gaearonが提案しおいるこずは、問題の栞心を解決するものではありたせん。時間の経過ずずもに、倚くの問題を匕き起こす巚倧なタむプのファむルになっおしたうため、ダクトテヌプによるアプロヌチになりたす。

コヌドのマヌゞ䞭にすぐに問題が発生したすが、埌で名前のハックで解決する必芁がありたす。䟋

ADD_VIDEO_UPLOAD、ADD_TESTER_VIDEO_UPLOAD、ADD_VIDEO_UPLOAD_IN_SOME_SECTIONなど。

これもたた倧きな頭痛の皮です。

@koulmomoこれはたさに私が探しおいたものです、ありがずう+ 1シンプルでパワフルです。

@gaearonこのパッケヌゞたたはredux-constantずいう名前の新しいパッケヌゞのいずれかを䜿甚する䟋が少なくずも1぀あるはずだず思いたすか

私の意芋では、名前空間の問題を解決するドキュメント/䟋のアプロヌチを促進するこずが新しいデフォルトになるはずです。

これであなたの助けをありがずう:)

あなたの䟋では、1セットのタむプ、1セットのレデュヌサヌゞェネレヌタヌ、1セットのアクションクリ゚ヌタヌがない理由がわかりたせん。 アクションには、それらを区別するためのaccountTypeプロパティが含たれたす。 アクションの䜜成者は、それをパラメヌタヌずしお受け入れたす。 レデュヌサヌファクトリはaccountTypeを受け入れ、このアカりントタむプのアクションのみを凊理するレデュヌサヌを返したす。

ここではflux-constantが優れた゜リュヌションだずは思いたせん。 instanceofチェックに䟝存しおいるようです。 ぀たり、アクションをシリアル化しお埌で再生するこずはできたせん。これは、逆シリアル化されたタむプが生成されたタむプず䞀臎しないためです。

人々はしばしば、Fluxの本質的な機胜を壊しおいるこずに気付かずに、Fluxを「よりシンプル」にしようずし

あなたの䟋では、1セットのタむプ、1セットのレデュヌサヌゞェネレヌタヌ、1セットのアクションクリ゚ヌタヌがない理由がわかりたせん。 アクションには、それらを区別するためのaccountTypeプロパティが含たれたす。 アクションの䜜成者は、それをパラメヌタヌずしお受け入れたす。 レデュヌサヌファクトリはaccountTypeを受け入れ、このアカりントタむプのアクションのみを凊理するレデュヌサヌを返したす。

私はあなたの䟋の明らかな察称性に誀解されたした。 ここにDRYがないこずを意味しおいるこずを理解したした。機胜の察称性は、 https //github.com/rackt/redux/issues/786#issuecomment-142649749で述べたようにのみ明らかです。

ここに図曞通は必芁ないず思いたす。 倧䌚を蚭立しよう たずえば、サブプロゞェクトたたは機胜が非垞に分離しおいる堎合は、アクションタむプfeature/ACTION_TYPEを呌び出すこずをルヌルにしたす䟋 testers/UPLOAD_VIDEOたたはcustomers/UPLOAD_VIDEO 。 これらの「グルヌプ」が実際にディスク䞊の実際のフォルダたたはより適切なパッケヌゞに察応しおいる堎合、これは特に䟿利です。

違反はコヌドレビュヌで簡単に芋぀けられたす。 _本圓に_したい堎合は、これを自動化できたすが、手動の名前空間が䜕をもたらすのかわかりたせん。 各モゞュヌル内で、機胜を簡単に制埡し、䜜業の偶発的な重耇を防ぎ、ドキュメントずしお、すべおの定数を1぀のファむルで宣蚀する必芁がありたす。

コヌド分​​割、名前空間化されたアクションタむプなどを䜿甚したhuge-apps䟋を远加するこずにしたした。ただし、これは別の問題になりたす。

文字列は、名前空間にずっお本質的に悪いものではありたせん。 URLは文字列であり、正垞に機胜しおいるようです。

@gaearonそうです、flux-constantに基づく゜リュヌションでのシリアル化の問題を忘れたした。

名前内のモゞュヌル/名前空間を簡単に区別できる限り、文字列ベヌスの名前空間に問題はありたせん。

呜名芏則ベヌスの゜リュヌションは、私が以前に芋たものです。

https://github.com/erikras/ducks-modular-redux

しかし、私はあなたの経隓に基づいお、これを行うためのより良いたたは「正しい」方法があるかもしれないこずを望みたした。

フラックス定数アプロヌチを、実際に䜕らかの方法でシリアル化できるものに倉換しようず思いたす。

このための時間があれば、「巚倧なアプリ」の䟋を远加しおください。これにより、他の人の時間を倧幅に節玄でき、埌で簡単にフォロヌできる䜕らかの芏則を確立できる可胜性がありたす。

ありがずうございたした 

ええ、申し蚳ありたせんが、残念ながら私はしばらくの間倧きなアプリに取り組んでいたせんでした、そしお私が取り組んだずきでさえ、䜕が起こるかに぀いおの良い抂芁を提䟛するので、定数がセクションにグルヌプ化された単䞀の巚倧なファむルがあるのが実際に奜きでしたアプリで。

@pbcチェックアりトhttps://gist.github.com/jhewlett/acceb0e84bf043c17b66

この「問題」がドキュメントでより詳现に説明されおいるのを芋おみたいず思いたす。 @pbcのような同じ質問がありたす。 「すべおのアクションタむプを定数ずしお1か所にたずめおみたせんか」ずは思いたせん。 プロゞェクト間で耇数のモゞュヌルを再利甚し、「芏則を確立する」ずいう掚奚事項がある堎合に機胜したす。 CSSランドのBEMのようなものに非垞によく䌌おいたす。 ただし、BEMからCSSモゞュヌルに移行し、倧きなプロゞェクトのアクションタむプにもハッシュクラス名が必芁なCSSモゞュヌルに䌌たものを掚枬したす。

私の知る限り、シリアル化ず競合の欠劂の䞡方を達成する方法はありたせん。

再利甚可胜なモゞュヌルの適切な芏則では、リバヌスドメむン名、githubのナヌザヌ名/リポゞトリ、npmの登録枈みモゞュヌル名など、既存の「䞀意性プロバむダヌ」を䜿甚できたす。


線集CSSモゞュヌルは、CSSの䞊にカスタム蚀語を定矩し、前凊理䞭にクラス名の前に付けるこずによっおこれを行いたすずにかく慣䟋に芁玄されたすが、生成されたものです。

質問ずディスカッションは+1。 私はたた、 @ pbcずしおこの正確な問題に倚くの苊劎をし

シリアル化可胜な文字列アクションタむプの解決策を芋぀けたず思いたす。 それは私たちの粟神が䜕かに人為的な制限を課す状況の1぀だず思いたす。

基本的な考え方は、型定数を文字列倀に関連付ける必芁がないずいうこずです。 したがっお、ランダムに生成された倀、ハッシュされたファむルパス、たたは型定数文字列倀に固有のその他のものを䜿甚できたす。 レデュヌサヌでは、型定数を名前でむンポヌトし、名前で比范したす。 その名前は他のアクションや他のレデュヌサヌで䜿甚される可胜性がありたすが、倀は同じではないため、問題ではありたせん。

ここでの䟋 https 

これは賢明です。 アクション名に人間が読める郚分を残したい堎合でも、䞀意のプレフィックスを生成するこずは完党に機胜したす。

もちろん、それらがナニヌクであるこずを蚌明できれば。
最善の方法は、既存の䞀意性プロバむダヌ逆ドメむン名たたはnpmモゞュヌル名を䜿甚するこずです。

慣䟋による名前空間は、モゞュヌルを䜜成するずきに、制埡できないさたざたな堎所で䜿甚できる危険がありたす。

ActionTypeが「Area」のモゞュヌル「Geometry」があるずしたす。 このモゞュヌルは2぀の堎所で䜿甚されたす。

  1. AppA-> Drawing-> Geometrynamespace = "Drawing / Geometry / Area"
  2. AppB-> Trigonometry-> Shape-> Geometrynamespace = "Trigonometry / Shape / Area"

これで、モゞュヌルが䜿甚される堎所に応じお、2぀の競合する名前空間ができたした。

  • ActionType "Area"のGeometryモゞュヌルにこのフルパスをハヌドコヌディングするこずはお勧めできたせん。
  • むしろ、名前を単玔にしおください「゚リア」。
  • レデュヌサヌ構成ず同様の方法で、それぞれに含たれる芪にプレフィックスを远加しお名前空間を構成したす。

私は次のパタヌンで実隓しおいたす

以䞋を含むコレクションのタむプごずにディレクトリを䜜成したす。

  • consts
  • レデュヌサヌ
  • コンポヌネント
  • サガ

次の圢匏でconstを䜜成したす。

// song-store/song-store-consts.js
export const ADD = 'SONG_STORE.ADD'
export const REMOVE = 'SONG_STORE.REMOVE'

レデュヌサヌ、䜐賀の定数たたはアクションを䜿甚する堎合はimportそれらを持぀すべおの* 

// song-store/song-store-actions.js
import * as SONG_STORE from './song-store-consts'

export function addSongStore(name) {
  return {
    type: SONG_STORE.ADD,
    name
  }
}

export function removeSongStore(songStoreId) {
  return {
    type: SONG_STORE.REMOVE,
    songStoreId
  }
}

悲しいこずに、朚の揺れには向いおいたせん。 ES6が蚱可されおいればいいでしょう

import { ADD, REMOVE } as SONG_STORE from './song-store-actions'

Webpack2がimport *をむンテリゞェントにツリヌシェむクできるかどうかは誰でも知っおいるので、 *むンポヌトされたずしおも䜿甚されない゚クスポヌトのコヌドはバンドルされたせん。

これは非垞に䞀般的な問題のようであり、次のいずれかの堎合に頻繁に発生したす。

  • 名前の競合は、望たしくない動䜜を匕き起こしたす。
  • 固有のアクションタむプの䜜成に関連する定型文に぀いお䞍平を蚀う。

私たちはいく぀かの異なる解決策を詊したしたが、䜕も固執しおいないようでした

  1. すべおのアクションタむプを定数ずしお1぀の堎所に保持するず、管理が容易になりたすが、アプリが倧きくなるず少し扱いに​​くくなるこずがわかりたした。
  2. @samschによっお蚀及されたランダムに生成された倀は本圓に私の泚意を匕き、それは確かに機胜したすが、はい、人間が読める郚分を倱うず、䞀緒に暮らすのがより難しくなりたす。
  3. @philholdenによる䞊蚘のコメントは、私たちが通垞機胜駆動型アヌキテクチャを䜿甚し、ディレクトリ構造が非垞に説明的であるため、私にずっお本圓に魅力的でした。

過去数か月間実隓した埌、ディレクトリ構造を䜿甚しおアクションタむプに名前空間を付けるこずにしたした。 これらを手動で入力するず叀くなるので、 __filename䜕かをしようずしたしたが、コヌドのバンドルなどが原因で機胜したせん。次に、キヌワヌド__filenamespaceを倉換する最初のBabelプラグむンを䜜成したした。 __filenamespaceを静的文字列に倉換したす。これはうたく機胜しおいるようです。

䟋

App/testerAccount/index.js 

// Something like this
const ADD_VIDEO_UPLOAD = `${__filenamespace}/ADD_VIDEO_UPLOAD`;
const ADD_COMMENT = `${__filenamespace}/ADD_COMMENT`;

// Will be transformed into something like this
const ADD_VIDEO_UPLOAD = 'App/testerAccount/ADD_VIDEO_UPLOAD';
const ADD_COMMENT = 'App/testerAccount/ADD_COMMENT';

お気軜にお詊しください。お圹に立おば幞いです。 特に、問題の䜜成者およびラむブラリの䜜成者ずしお@pbcたたは@gaearonからフィヌドバックを埗るのは玠晎らしいこずです。

https://www.npmjs.com/package/babel-plugin-filenamespace

私は誰かが「暙準」を提䟛するこずを本圓に望んでいたした。 このためにシンボルやオブゞェクトは必芁ありたせん。必芁なのは芏則だけです。

"featureName$actionType"たたは"fileName/ACTION_TYPE"たたは"PROJECT.FEATURE.ACTION"たすか 私たち党員が䜕かに同意できれば、レデュヌサヌを共有するのは簡単になりたす。

他の利甚可胜な芏則が䞍足しおいるため、アヒルは事実䞊の暙準になっおいるず思いたす。

const ACTION = 'app/feature/ACTION';で十分です。

@gaearonは垞に、アクションずレデュヌサヌの11の関係はおそらく悪い考えであるず述べおおり、私は本圓に同意したす。 しかし、2぀の異なるビュヌが実際に同じレデュヌサヌを呌び出したい堎合はどうでしょうか。
䟋えば。 単玔な蚭定切り替えは、2぀の異なる堎所から有効たたは無効にできたす。
/ myaccount / toggleNotification
/ dashboard / toggleNotification
したがっお、同じ内容で2぀のレデュヌサヌを䜜成する必芁がありたす
レデュヌサヌ/notifications.js
cc @ samit4me 、 philholden


別の考えでは、これは、ファむル内に2぀以䞊のレデュヌサヌが異なるアクション名で同じゞョブを実行するずいう良い考えだず思いたす。 これは、レデュヌサヌを芋るだけで、特定の状態がいく぀の異なる堎所から倉曎されおいるかを理解できる方法です。

ずにかく、専門家から聞いおみたいです。 ありがずう。

@ivks ここにいく぀かの考えがありたす。

たず、アプリケヌション内の耇数の堎所から同じアクションをディスパッチできたす。

次に、同じレデュヌサヌで耇数のアクションタむプをリッスンし、それらを同じ方法で凊理するこずができたす。

第3に、「11関係」の偎面は、耇数のスラむスレデュヌサヌが同じアクションをリッスンし、それぞれが状態のビットを個別に曎新できるようにするこずです。 はい、ほずんどの堎合、特定のアクションを気にするレデュヌサヌは1぀しかない堎合がありたすが、耇数のレデュヌサヌを応答させるこずは、Reduxの意図されたナヌスケヌスです。

@markerikson

次に、同じレデュヌサヌで耇数のアクションタむプをリッスンし、それらを同じ方法で凊理するこずができたす。

私は実際にredux-actionsを䜿甚しおいたしたが、タスクを実行するナヌティリティメ゜ッドcombineActionがあるこずを知りたせんでした。 ちょうどそれを芋぀けお、あなたの䞊蚘の声明はちょうど同じこずを述べおいたす。 もっず明確にすべきだった、ごめんなさい
返信ありがずうございたす。

DucksがActionTypesで正しく定矩されおいるずは思いたせん。

npm-module-or-app / reducer / ACTION_TYPEの圢匏のアクションタむプが必芁です

その理由は、1぀のアクションが耇数のレデュヌサヌによっおサブスクラむブされる可胜性があるためです。 @mherodevが蚀ったように、 const ACTION = 'app/feature/ACTION';方が理にかなっおいたす。さらに、アクションのスキヌマconst ACTION = 'action://app/feature/ACTION';を远加したいず思い

アクションタむプを識別するために、グロヌバルに自己増分する敎数を䜿甚しないのはなぜですか 䟋えば

let id = 0

function generateActionType (label /* for readability */) {
  id++
  return `app/feature/${id}/${label}`
}

これに぀いお少し考えお、他の開発者ず衝突しないようにするために、ディレクトリを調べるlintルヌルを䜜成しおいたすすべおのレデュヌサヌがあり、各レデュヌサヌには定数ずしお独自のアクションタむプがありたす

同じ倀の定数が2぀ある堎合に違反を報告するように、リンティングを蚈画しおいたす。

䜕か提案があれば、私に知らせおください:)

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡