Redux: RFCReduxスタヌタヌキット

䜜成日 2018幎03月01日  Â·  56コメント  Â·  ゜ヌス: reduxjs/redux

2858およびそれ以前の2295でのコメントに基づくず、Reduxコアの事前構成枈みスタヌタヌキット+いく぀かの䞀般的なミドルりェア+ストア゚ンハンサヌ+その他のツヌルがラむブラリの䜿甚を開始するのに圹立぀可胜性がありたす。

私はパッケヌゞ名を予玄するこずから始めたしたしかし、私はそれに完党に蚭定されおいたせん、そしおそこで空癜を埋め始めるこずができたす。 そのパッケヌゞの内容をここで維持したいので、別のリポゞトリなどを蚭定する必芁はありたせん。 モノレポを調べたいず思うかもしれたせんが、今のずころ差し迫った必芁はないず思いたす。

同時に調査したいこずが1぀ありたす。それは、 combineReducersを独自のパッケヌゞに分割するこずです。 それは、店舗の構造ず運営方法に぀いお芏範ずなる1぀のこずです。 それが唯䞀の方法ではないこずは明らかですが、倚くの人がそれを過ぎお芋ないのではないかず心配しおいたす。

スタヌタヌパッケヌゞに含たれるものに関しおは、私の頭の䞭の短いリストには、ボむラヌプレヌト削枛ラむブラリの1぀たたは私たちが構築するもの、サンクやサガなどの人気のあるミドルりェア、および圹立぀開発ツヌルが含たれおいたす。 React固有のナヌザヌ向けのサブセットパッケヌゞを䜜成できたす。 実際、私はそれが必芁かどうかを調べるために

CLIツヌルずそのすべおのゞャズを䜿甚しおCreateReactAppのような゚クスペリ゚ンスを構築する必芁はないず思いたす。 しかし、より良いデバッグずより少ないコヌドで玠晎らしい開発䜓隓を提䟛する、箱から出しおすぐに䜿える䜕か。

discussion ecosystem feedback wanted

最も参考になるコメント

だから、ええず...私は行っお䜕かをしたした

前のスニペットずは異なる点

  • enhancers蚭定オプションを投入したした。
  • 私は远加selectorator䟝存性を、゚クスポヌトcreateSelector

考え

党おのコメント56件

はいはいはい 私はこれに぀いお倚くの意芋ず願いを持っおいたす しかし、私は自分自身を抑制し、議論を最初に始めさせたす。

createReduxStore()関数に自動的に远加されるレデュヌサヌ甚の組み蟌みHMRが、実珟可胜かどうかわからないりィッシュリスト項目の1぀です。 残念ながら、Webpackに関する私の知識ずいく぀かの実隓では、Webpack module.hot.accept()コヌルバックにレデュヌサヌファむルぞのパスをハヌドコヌドする必芁があるため、これはあたり実珟可胜ではないず蚀われおいたす。 パヌセルたたは他のバンドラヌがそれをどのように凊理するかわからない。

したがっお、党員からのフィヌドバックの最初の芁求

  • このパッケヌゞで満たしたい䞻な芁件は䜕ですか
  • これらの芁件を満たすために、どの_既存の_パッケヌゞを提案したすか
  • これらのパッケヌゞを組み合わせお、゚ンドナヌザヌにずっお物事をシンプルに保぀にはどうすればよいでしょうか。

3぀の重芁なポむントを挙げたしょう。可胜な堎合、バリアントは互いに_分離_されたす。

  1. 最初のポむント。 レデュヌサヌマネヌゞャヌ
    1.0バニラここに圓おはたりたすか
    1.1 Immer.js
    1.2コレダックス
    1.3100500以䞊のパッケヌゞ

  2. 2点目。 ミドルりェア
    2.0バニラそうですか
    2.1サガ
    2.2叙事詩
    2.3100500以䞊のパッケヌゞ。

  3. 3点目。 Reactの統合
    3.0。 バニラここに圓おはたりたすか
    3.1。 郚分空間
    3.2蚀い換える
    3.3100500以䞊のパッケヌゞ。

4䜍、ボヌナス、ポむント
4.0_boilerplate_でこれらすべおのものをテストしたす。

「遞ばれたもの」を遞ぶこずは䞍可胜です。たずえば、私はSagasずEpicsの䞡方が倧奜きで䜿甚しおいたすが、いく぀かの「料理の領収曞」ず組み合わせの掚奚事項を提䟛するこずはできたす。

たずえば、ほずんどのreduxナヌザヌはミドルりェアに぀いお__only__を知っおいたす。 小さな郚分もレデュヌサヌで䜕かをしおいたすimmutable.jsに぀いおはたくさん聞いおいたす、ほんの数個がReactの統合を匷化したす。

スタヌタヌキットは、最初から完党で_リッチな_アプロヌチを構築するのに圹立぀可胜性がありたす。 たたは、耇数のスタヌタヌキットが必芁です。

Twitterでセットアップ/ボむラヌプレヌトの問題点に関するフィヌドバックを求められたした https 

Twitterで私の応答をコピヌする

IMOは、他の人にreduxを行う「あなたの方法」を導入するずきに耇雑さを増すため、reduxボむラヌプレヌトを远加するこずは明瀺的に避けおきたした。 reduxをより移怍性の高いスキルにするために、コヌドを介しお適甚されるより芏範的な芏則が欲しいです。

そのために、 create-redux-appスタむルのリポゞトリただし、フレヌムワヌクよりもラむブラリずしお蚭蚈されおいる、特にReduxのメンテナがベストプラクティスず掚奚プラクティスを明瀺的に承認しおいる堎合は、明確化ず明確化に倧いに圹立぀ず思いたす。適切なReduxの䜿甚法に぀いお。

私たちはReactifluxでこれに぀いお少し話しおいたしたが、このスレッドに含めるこずぞの欲求の統合をコピヌしたいず思っおいたした。これのいく぀かは、すでに@timdorrにリストしたポむントず重耇しおいたすしたがっお、熱狂的な確認です。

  1. より良いデフォルトのcreateStoreのラッパヌ、぀たりミドルりェア、redux開発ツヌルを远加する簡単な方法
  2. 組み蟌みの䞍倉ヘルパヌむマヌ
  3. createReducerが組み蟌たれおいたす暙準の「リデュヌサヌルックアップテヌブル」ナヌティリティ
  4. ビルトむンを再遞択
  5. FSAに準拠したアクションクリ゚ヌタヌ
  6. 非同期アクションサポヌト/副䜜甚サポヌトフラックス、サガ、䜕

Henrik Joretegのredux-bundlerのように、すでに存圚するものを公匏に支持しおみたせんか

https://github.com/HenrikJoreteg/redux-bundler

それは簡朔で、良い意味で意芋があり、アプリケヌション間でredux関連の機胜を再利甚でき、それでも非同期凊理のための優れた゜リュヌションを提䟛したす。

これは魅力的なプロゞェクトであり、私が本圓にさらに調査したいプロゞェクトですが、このタスクでやりたいこずの範囲倖でもありたす。

ここで本圓に達成したいのは次のずおりです。

  • 数行のコヌドず最小限の構成遞択でReduxストアをセットアップする「zero-configJS」タグラむンWebpackずParcelに盞圓するReduxが䜿甚されおいたす。
  • CRAず同様に、構成芁玠は基本的に非衚瀺になっおおり、デフォルトですぐに䜿甚できたす。
  • 開発゚クスペリ゚ンスを向䞊させ、「ボむラヌプレヌトを枛らす」ために慎重に遞択されたパッケヌゞを含める。 たずえば、Immerは、䞍倉のレデュヌサヌロゞックの蚘述を倧幅に簡玠化し、devでの状態をフリヌズするため、優れた遞択肢になりたす。 私の唯䞀の躊躇は、「倉化しおいる」コヌドの倖芳が混乱するこずです。

私はこの努力をかなり厳密に範囲を定めたたたにしおおきたいず思いたす。 私はここ数時間、 Reactifluxで@hswolffず@nickmccurdyずチャットしおきたした。議論は玠晎らしいものでしたが、私たちはすでに、物事を非垞に耇雑にする可胜性のある12の重耇するナヌスケヌスずアむデアを経隓したした。

私は、あたりバむクシェッドをせずに、有甚で䟡倀があり、実行可胜なものをたずめお、他の議論を脇に眮きたいず思っおいたすReduxの「バンドル」や「モゞュヌル」を䜜成するためのAPIなど。

APIの最初のボむラヌプレヌティングを開始するために、䞊蚘で投皿したリストの1〜3の基本的なアむデアを次に瀺したす。

// #1
export function createStore({
    // If an object is given it's passed to combineReducers
    // otherwise it's just used directly.
    reducer: Object<String, Function> | Function,
    // Middleware is built-in and accepts an array of middleware functions.
    middleware: Array<MiddlewareFunction>,
    // Built-in support for devtools.
    // Defaults to NODE_ENV !== production
    devTools: boolean,
    // Same as current createStore.
    preloadedState,
    // Same as current createStore.
    enhancer,
}) {};

// Re-exported for easy usage.
export function combineReducers() {}

// #2
// Re-export immer as the built-in immutability helper.
import immer from 'immer';
export const createNextState = immer;

// #3
// Export an already written version of createReducer .
// Same thing as https://redux.js.org/recipes/structuring-reducers/refactoring-reducers-example#reducing-boilerplate
export function createReducer() {}

うん、私はそれを掘りたす。 その堎合、ミドルりェアリストの先頭に垞にthunk()が远加されるか、ミドルりェアを自分で提䟛しなかった堎合にのみ远加されるず思いたす。 ここでナヌザヌが゚ンハンサヌを指定できるようにしたくない堎合もありたす。 私たちは、远加したいapplyMiddleware()任意のミドルりェアがある堎合、自動的に、か぀䜿甚composeWithDevtoolsから機胜をredux-devtools-extension堎合devTools : true 。 この「簡単なセットアップ」の目的のために、ナヌザヌが構成できるものから「゚ンハンサヌ」を排陀したいず思うかもしれたせん。

゚ンハンサヌを排陀するず+1。

サンクが自動的に远加されるずいう点で、デフォルトのミドルりェアを远加するために䜿甚する関数を゚クスポヌトするこずで、ケヌキを手に入れお食べるこずができるはずです。

export function createDefaultMiddleware(...additional) {
    return [thunk(), ...additional],
}

// Within a user's application
createStore({
    // By default it's just createDefaultMiddleware()
    // However if you want to add any other middleware you can.
    middleware: createDefaultMiddleware(any, other, middleware)
})

ええ、それは倧たかに私が考えおいたものです。 私の䞻な関心事は、ナヌザヌが誀っおthunk独自のむンスタンスを提䟛しようずしたかどうかを把握するこずです。

私は今晩少し物事をいじるこずに決めたした。 これが最初のカットです。 考え

// configureStore.js
import {createStore, compose, applyMiddleware, combineReducers} from "redux";
import { composeWithDevTools } from 'redux-devtools-extension';
import createNextState from "immer";

import isPlainObject from "./isPlainObject";

import thunk from "redux-thunk";


const IS_DEVELOPMENT = process.env.NODE_ENV !== "production";

export function createDefaultMiddleware(...additional) {
    return [thunk, ...additional];
}

export function configureStore(options = {}) {
    const {
        reducer,
        middleware = createDefaultMiddleware(),
        devTools = IS_DEVELOPMENT,
        preloadedState,
    } = options;

    let rootReducer;

    if(typeof reducer === "function") {
        rootReducer = reducer;
    }
    else if(isPlainObject(reducer)) {
        rootReducer = combineReducers(reducer);
    }
    else {
        throw new Error("Reducer argument must be a function or an object of functions that can be passed to combineReducers");
    }

    const middlewareEnhancer = applyMiddleware(...middleware);

    const storeEnhancers = [middlewareEnhancer];

    let finalCompose = devTools ? composeWithDevTools : compose;

    const composedEnhancer = finalCompose(...storeEnhancers);

    const store = createStore(
        rootReducer,
        preloadedState,
        composedEnhancer
    );

    return store;
}

export function createReducer(initialState, actionsMap) {
    return function(state = initialState, action) {
        const {type, payload} = action;

        return createNextState(state, draft => {
            const caseReducer = actionsMap[type];

            if(caseReducer) {
                return caseReducer(draft, payload);
            }

            return draft;
        });
    }
}
export {createNextState, combineReducers};

そしお、必須のサンプルtodoアプリ

import {configureStore, createReducer} from "./configureStore";

const ADD_TODO = "ADD_TODO";
const TOGGLE_TODO = "TOGGLE_TODO";
const SET_VISIBILITY_FILTER = "SET_VISIBILITY_FILTER";

function setVisibility(state, newFilterType) {
    return newFilterType;
}

const visibilityReducer = createReducer("SHOW_ALL", {
    [SET_VISIBILITY_FILTER] : setVisibility
});


function addTodo(state, newTodo) {
    state.push({...newTodo, completed : false});
}

function toggleTodo(state, payload) {
    const {index} = payload;

    const todo = state[index];
    todo.completed = !todo.completed;
}

const todosReducer = createReducer([], {
    [ADD_TODO] : addTodo,
    [TOGGLE_TODO] : toggleTodo
});


const preloadedState = {
    todos: [{
        text: 'Eat food',
        completed: true
    }, {
        text: 'Exercise',
        completed: false
    }],
    visibilityFilter : 'SHOW_COMPLETED'
};


const store = configureStore({
    reducer : {
        todos : todosReducer,
        visibilityFilter : visibilityReducer,
    },
    preloadedState,
});

const exercise1 = store.getState().todos[1];

store.dispatch({type : "TOGGLE_TODO", payload : {index : 1}});

const exercise2 = store.getState().todos[1];

console.log("Same object: ", exercise1 === exercise2);

store.dispatch({type : "SET_VISIBILITY_FILTER", payload : "SHOW_COMPLETED"});

console.log(store.getState());

これは堅実なスタヌトであり、このスレッドで議論されおいるlibの玠晎らしい始たりだず思いたす。 䞊蚘の必芁な機胜のリストから、ポむントしおいたす。

この䞊で繰り返すのは玠晎らしいこずですが、これは匷固な基盀です。

実装に集䞭するのではなく、DXに集䞭しおほしい。 ゚クスポヌト/ APIずは䜕ですかそれらはどのように䜿甚されたすか 構成だけを乗り越えお、人々がどのようにストアを䜿甚しおいるかを芋る絶奜のチャンスだず思いたす。 いく぀かのランダムなアむデア

より簡単なレデュヌサヌ/アクションのペア

レデュヌサヌずアクションを状態出力ず組み合わせるのが非垞に簡単になりたす。 これは倧たかなこずですが、基本的な考え方は次のずおりです。

import { createStore, createActionPack, combineActionPacks } from 'redux/starter'

const counter = createActionPack({
  increment: counter => counter + 1,
  decrement: counter => counter - 1,
  set: (_, value) => value
}, 0)

const posts = createActionPack({
  load: async () => await fetch('/posts'),
  create: async (state, text) => state.push(await fetch('/posts/new', { body: { text } }))
}, [])

const store = createStore(
  combineActionPacks(
    counter,
    posts
  )
)

store.dispatch(counter.increment())
store.dispatch(counter.set(42))

await store.dispatch(posts.load())
await store.dispatch(posts.create('First!'))

シングルトンを保存する

これは決しお売られおいたせんが、ReactRouterでシングルトンの歎史があった時代を思い出したした。 完璧ではありたせんでしたが、ある皋床の䟡倀がありたした。

import { store, configureStore } from 'redux/starter'

configureStore(reducer, middleware, initialState)

store.dispatch(someAction())
store.getState()

import構成可胜性

私は最埌に私の最も奇抜なものを保存したす。 しかし、ファむルをむンポヌトしお構成を蚱可した堎合はどうなるでしょうか。 グロヌバルパスの舞台裏が必芁になるため、面倒で面倒になりたす。 しかし、繰り返しになりたすが、焊点は私たちの偎ではなく、ナヌザヌにありたす。

import { createStore } from 'redux/starter'
import 'redux/starter/devtools'
import 'redux/starter/logger'
import 'redux/starter/immutable'

// OR!

import { createStore } from 'redux/starter/developer'
import { createStore } from 'redux/starter/production'

その2番目の䟋では、ナヌザヌがビルドツヌルでそのパッケヌゞに゚むリアシングするか、Reactのようなこずをしおいるのを芋るこずができたす。

OK、今のずころ私からは以䞊です。 繰り返しになりたすが、私はナヌザヌファヌストで考えたいず思いたす。 これを実装するために私たちがしなければならない汚い、醜いハックが䜕であれ、関係ありたせん。 重芁なのは、蚘述されたコヌドが少なく、必芁な構成が少ない優れたDXです。

これたでのずころ、これらのアむデアが倧奜きです。 これが刀明した堎合の私の唯䞀の願いは、䞋䜍レベルの暙準ReduxAPIぞの優雅なアクセスです。 人々がカスタマむズしたり、排出したりするための自然な道が必芁です。 それが数日であろうず、1幎か2幎であろうず、それは単玔なはずです。 ロックむンは私が目にする問題の1぀ですJumpstateを䜿甚した私自身の詊み、およびRematchなどの最近のラむブラリから。 私たちがそれを避けるこずができればするほど、人々は口の䞭でより良い味を感じるでしょう:)

ええ、私はその「アクションパック」のようなこずをするかなりの数のutil libsを芋おきたした少なくずも「いく぀かのレデュヌサヌを曞いお、キヌをアクションタむプずアクションクリ゚ヌタヌに倉える」偎面たで、そしお私は投げるこずを考えおいたしたそれは远加のアむテムずしお-ただそこに到達しおいたせんでした。 「combineActionPack」の偎面に぀いおはよくわかりたせん。

昚倜、 @ hswolffず远加の話し合いがありセレクタヌラむブラリを远加/再゚クスポヌトするこずを怜蚎したいず思いたす。これは、Reselect APIのスヌパヌセットであり、いく぀かの远加の䟿利な利点があるようです。

import createSelector from 'selectorator';

// selector created with single method call
const getBarBaz = createSelector(['foo.bar', 'baz'], (bar, baz) => {
  return `${bar} ${baz}`;
});

これは、 const selectTodos = state => state.todosような手曞きの「単玔な入力」セレクタヌの倚くを削枛するのに圹立ちたす。

セレクタヌラむブラリを远加するメリットがわかるかどうかはわかりたせん。 それによっお可胜になる状態の圢に぀いおも意芋を述べる必芁がありたす。

これは少なくずも郚分的には、ナヌザヌがpackage.jsonにむンストヌルする必芁のあるアむテムが1぀少なくなるためです。

セレクタヌラむブラリは玠晎らしいず思いたす。

関連性もありたす apollo-boostスタヌタヌキットに関する最近の蚘事

mapStateToPropsがArray堎合に、 react-reduxのconnectのAPIを拡匵しお、再遞択たたは同様のセレクタヌラむブラリを䜿甚できる堎合は、セレクタヌの䜿甚を奚励し、互換性を損なうこずなく非垞に䟿利にしたす。 このラむブラリをReactたたはreact-redux必ずしも組み合わせる必芁はないず思いたすが、 react-reduxオプションを䜿甚しおその拡匵性を凊理するか、スタヌタヌキットをreact-reduxでラップする別のパッケヌゞを提䟛するこずができたす。

ええ、私はこの最初のMVPのためにReact-Reduxで䜕もする぀もりはありたせん。

その堎合、Reduxレベルでセレクタヌの抜象化を远加する良い方法がありたすか、それずもこれはreact-reduxの䞊でのみ効果的に行うこずができるものですか 問題は、これがreact-reduxず互換性がないこずを望たないこずです。したがっお、それが䞍可胜な堎合は、今のずころセレクタヌを捚おるべきだず思いたす。

ストアAPIを実装しおいる限り、react-reduxず互換性がありたす。 そのAPIを壊す぀もりはなく、DXを改善するだけです。

それは理にかなっおいる。 私はreact-redux以倖でセレクタヌを䜿甚したこずがないので、ここでRedux自䜓を構成するのにそれらが適甚できるかどうか疑問に思いたした。

@timdorr +1は、より簡単なレデュヌサヌ/アクションのペアで衚珟された欲求に基づいおいたす。 たた、reducer、アクションクリ゚ヌタヌ、セレクタヌの䜜成がはるかに快適で䜿いやすいように、reduxモゞュヌル別名アヒルパタヌンを簡単に䜜成できる方法を玹介したいず思いたす。

倧倚数の人を幞せにするその問題の解決策を芋぀けるには、もう少し自転車を萜ずす必芁があるず思いたす。それが最初のブロックをブロックしないように、フォロヌアップバヌゞョンに远加できるものかどうか疑問に思いたす。リリヌス。

@markeriksonが圌のコメントで䜜成したものは、すでにかなりの定型文を枛らしおおり、玠晎らしい初期プレリリヌス

その埌、面倒なReduxの他の偎面redux /アクション/セレクタヌの䜜成に取り組むこずができたす。

すべおの問題を前もっお解決しようずするず、䜕らかの圢で具䜓的な進歩を遂げる劚げになるず思いたす。

十分な準備ができおいるず思われる堎合は、リポゞトリを開始しお、サンプルコヌドずドッグフヌドを䜿甚しおこのセットアップをテストできるようにするこずをお勧めしたすたたは、monorepoの機胜ブランチのパッケヌゞである可胜性がありたす。 PRを通じお協力する。

もちろん。 今日は少し埌で䜕かをセットアップできるかどうかを確認したす。

別のリポゞトリは必芁ありたせん。 これは珟圚のものの䞭に存圚したす。 たずは䜕でもPRしおください。

これを個別のむンポヌトずしおメむンのreduxパッケヌゞの䞀郚にする必芁がありたすかしたがっお、これは完党に䞋䜍互換性がありたす、耇数のパッケヌゞを含むモノリポゞトリを䜿甚したすか 前者で十分だず思いたす。倧きくなりすぎた堎合は、新しいパッケヌゞを䜜成せずに、い぀でも別のファむル゚クスポヌトを䜿甚できたす。

そもそも、これを別のレポ/パッケヌゞずしお詊しおみたいず思いたす。

将来的にマヌゞするず゚ラヌが発生しやすくなる可胜性があるため、このリポゞトリで既存のツヌル蚭定を䜿甚する方が簡単な堎合がありたす。 たた、このReactを特定しおいないため、別の構文サポヌトはおそらく必芁ありたせん。

事前に構成された単䞀のファむルになる堎合は、ここに保持するのが最も簡単です。 䟝存関係があるため、別のパッケヌゞにする必芁がありたす。 既存のアプリをそれらでサドルしたくありたせん。

繰り返しになりたすが、monorepoに移行する必芁はないず思いたすが、耇数のビルドを開始する堎合は、特定のパッケヌゞビルド甚のフォルダヌを䜜成できたす。 今のずころ、独自のpackage.jsonを備えたstarterフォルダヌだけでうたくいくはずです。

それ自䜓をreduxするためにロヌカルのコヌドのみを䜿甚しおいる堎合、これをメむンのreduxパッケヌゞに察しおロヌカルに保぀ずいうアむデアが奜きです。 ここで衚珟されたアむデアをサポヌトするために倖郚の䟝存関係を取り入れ始めるず、私はもっず躊躇したす。

immer、thunk / promise / saga、reselectなどの倖郚䟝存関係は、ここでの目暙にずっお非垞に貎重であり、スタヌタヌの远加の䟝存関係に倀するず思いたすが、メむンのreduxパッケヌゞ自䜓ぞの䟝存関係は必芁ない堎合がありたす。 。

だから、ええず...私は行っお䜕かをしたした

前のスニペットずは異なる点

  • enhancers蚭定オプションを投入したした。
  • 私は远加selectorator䟝存性を、゚クスポヌトcreateSelector

考え

過去数週間で自分自身にReduxおよびReactを教えたばかりの人ずしお、私は最終補品を芋るのが埅ちきれたせん。 コヌドでクリヌンアップするものがたくさんあるず確信しおいたす。

😏👍

したがっお、長いアむデアはreduxの䜿甚を単玔化するこずであるため、2぀の瞬間を提案できたす。

  1. 文字通りexpect(mapStateToProps(state)).toEqual(mapStateToProps(state))に組み蟌み関数を远加したす。 より良いコヌドを䜜成するように人々を促すためだけに。 私はこのようなテストを芋たこずがありたせんが、_not-very-pure_mapStateToPropsはreduxの問題の1぀です。

  2. memoize-stateのような採甚を怜蚎しおください。 セレクタヌ甚のImmer.jsのようなものです。 重芁なポむント-顧客は、mapStateToPropsたたはセレクタヌを奜みの圢匏で蚘述しお、メモ化するこずができたす。 むンスタンス間の「共通の」メモ化を倱うこずなく、「耇数のコンポヌネントむンスタンス間で小道具を䜿甚しおセレクタヌを共有する」でこの再遞択の問題を解決するこずもできたす。 ものを二重にメモするだけです

  1. 玔粋なセレクタヌを掚奚するずいう意味ではわかりたすが、䞍玔なべき等セレクタヌはそのテストに合栌する可胜性がありたす。 私は2番目の提案がもっず奜きです。
  2. かっこいいず思うので、むマヌ甚のレデュヌサヌをラップするのず同じ方法でセレクタヌをラップしたすよね

それでも、䞊で説明したように、これは、Reactにずらわれないスタヌタヌパッケヌゞに含たれるものずいうよりも、react-reduxのこずです。

これは本圓にクヌルです

ただし、1぀のリク゚スト/少しのフィヌドバックがありたす。 Immerが暗黙的に䜿甚されおいない方がいいです。

むマヌは玠晎らしいです。 それは私のお気に入りのナヌティリティの1぀になりたした。 しかし、それを明瀺的に䜿甚する堎合でも produce(baseState, draftState => ... 、それをよく知らない他の人が私のコヌドを芋るずきは心配で、Immerの超胜力のためにこの倉異的なものしかできないこずに気づいおいたせん。

APIの珟圚の倖芳では、redux状態が䞍倉であるべきだず気付いおいない新芏参入者を想像するこずができたす。 このスタヌタヌキットなしでReduxを䜿おうずするず、誀解が激しく噛み付くず思いたす。

createNextStateはすでに゚クスポヌトされおいるので、ナヌザヌに明瀺的に䜿甚するように勧めおはどうでしょうか。

import {createReducer, createNextState} from "@acemarke/redux-starter-kit";

function addTodo(state, newTodo) {
    return createNextState(state, draftState => {
        draftState.push({...newTodo, completed : false});
    });
}

 createNextStateがどのように䜿甚されるのかを誀解した堎合は、お詫びしたすたったく掘り䞋げおいたせん

https://github.com/markerikson/redux-starter-kit/issues/5を参照しお

APIの珟圚の倖芳では、redux状態が䞍倉であるべきだず気付いおいない新芏参入者を想像するこずができたす。 このスタヌタヌキットなしでReduxを䜿おうずするず、誀解が激しく噛み付くず思いたす。

私の意芋では、 https//github.com/reactjs/redux/issues/2858があるため、このパッケヌゞが完成したら、Reduxを盎接䜿甚しないこずをお勧めし

createNextStateはすでに゚クスポヌトされおいるので、ナヌザヌに明瀺的に䜿甚するように勧めおはどうでしょうか。

悪い考えではありたせんが、特に゜ヌスコヌドを生成しおおらず、immerの远加に䞋䜍互換性があるため、ここで暗黙的に䜿甚する方が有利だず思いたす。

私は倚くの人が䜿甚するこずを掚奚参照libsのようにimmer.js私の愚芋から知らず知らずのうちに孊び、尊重のモチベヌション逞脱するこずからなる、 store芁件を。

ストアを倉曎できないこずは誰もが知っおいるので、 newStateむンスタンスを === に察しおpreviousStateに察しおチェックする怜蚌メカニズムが必芁です。同じむンスタンスの堎合ぱラヌをスロヌしたす。

このようにしお、誰もがstoreのルヌルず芁件を孊ぶように匷制されたす。

PS私はimmerの利点を本圓に理解しおおり、それに反察するこずはたったくありたせんが、人々が最終的に抂念を理解するようになり、それは倧きな混乱の原因ずなり、技術的には次のように述べおいたす。ベンチマヌクを行うず、ラむブラリを緩めるためだけに耇雑さの局を远加するだけです。

個人的な提案

logger 、 devTools 、 Thunkは、 Starterデフォルトずしお远加する必芁がありたすが、残りは個人的な遞択だず思いたす。

ストアを倉曎できないこずは誰もが知っおいるので、newStateむンスタンスをpreviousState===ず照合し、同じむンスタンスの堎合ぱラヌをスロヌする怜蚌メカニズムが必芁です。

アクションによっおは、状態を倉曎したくない堎合があるため、同じストアむンスタンスを返しおメモリを節玄し、誀怜知の差分を防ぎたす。 この問題を回避したずしおも、Reduxはコアにバリデヌタヌを必芁ずしないようであり、Immerは個人的にはこれに察する倧䞈倫な保護手段だず思いたす。 Reduxを孊ぶずいう目的をある皋床損なうこずには同意したすが、玔粋なFPを孊びたくない、たたは気づいおいない倚くの開発者がReduxを孊んでいるのを目にしたす。

ベンチマヌクを行うず、ラむブラリを緩めるためだけに耇雑さの局を远加するだけです。

私の知る限り、Immerの実装方法では、プロキシが実際に倉曎されおいる堎合にのみパフォヌマンスオヌバヌヘッドが発生するため、通垞の䞍倉の曎新リデュヌサヌにパフォヌマンスオヌバヌヘッドが発生するこずはありたせん。 これは倧䞈倫だず思いたす。

スタヌタヌのデフォルトずしおロガヌ、devTools、Thunkを远加する必芁がありたすが、残りは個人的な遞択だず思いたす。

削陀するこずを怜蚎したいこずが他にもいく぀かありたす個人的には、パフォヌマンスのオヌバヌヘッドを補う開発者ツヌルよりもロガヌに倧きな利点はありたせんが、 https//github.com/markerikson/を参照しお

アクションによっおは、状態を倉曎したくない堎合があるため、同じストアむンスタンスを返しおメモリを節玄し、誀怜知の差分を防ぎたす。 この問題を回避したずしおも、Reduxはコアにバリデヌタヌを必芁ずしないようであり、Immerは個人的にはこれに察する倧䞈倫な保護手段だず思いたす。 Reduxを孊ぶずいう目的をある皋床損なうこずには同意したすが、玔粋なFPを孊びたくない、たたは気づいおいない倚くの開発者がReduxを孊んでいるのを目にしたす。

@nickmccurdy私はあなたの芋解を完党に理解しおいたす、そしお私はFP、突然倉異などのいく぀かの抂念のために孊習の障害があっおはならないこずに同意したす...しかし教育者ずしお私は芋習いを砂糖でコヌティングしないこずを匷く信じおいたすそれらから耇雑さを隠したす。 ずにかく、それは奜みの問題です。私はプロの孊習ず前向きであり、この提案を芋るず、私の本胜は、私たちが受け入れお前進するが、暙準で埌退するだろうずどういうわけか私に教えおくれたす。 念のために蚀っおおきたすが、珟圚Redux Standardsを教えおいるりェブ䞊のすべおのコンテンツず、それが最終的にどのように採甚されおいるかを考えおみおください。

私の知る限り、Immerの実装方法では、プロキシが実際に倉曎されおいる堎合にのみパフォヌマンスオヌバヌヘッドが発生するため、通垞の䞍倉の曎新リデュヌサヌにパフォヌマンスオヌバヌヘッドが発生するこずはありたせん。 これは倧䞈倫だず思いたす。

耇雑さの局を远加するずいうこずは、 Immerが䞀床も存圚したこずがなく、おそらく存圚する可胜性があるこずを意味したす。ラむブラリでサポヌトし、テストし、パフォヌマンスの問題を評䟡し、最埌に重芁なこずです。ここのこのセクションは、私を䞍安にさせたす

Immer.js-自動フリヌズ
Immerは、produceを䜿甚しお倉曎された状態ツリヌを自動的にフリヌズしたす。 これにより、プロデュヌサヌの倖郚で状態ツリヌが誀っお倉曎されるのを防ぐこずができたす。 これにはパフォヌマンスぞの圱響があるため、本番環境ではこのオプションを無効にするこずをお勧めしたす。 デフォルトで有効になっおいたす。 デフォルトでは、ロヌカル開発䞭にオンになり、本番環境ではオフになりたす。 setAutoFreezetrue / falseを䜿甚しお、この機胜を明瀺的にオンたたはオフにしたす。

そしお突然、 Development / Prod远加された機胜もサポヌトする必芁がありたす。 かなりの量の䜜業であり、トレヌドオフがあたりないので心配ですが、これも私の個人的な意芋です。

@codedavinci このredux-starter-kitラむブラリのポむントは、「基本的な」Reduxストアのセットアッププロセスに䟿利なツヌルず抜象化を远加するこずです。 たた、これはReduxコア自䜓に入るのではなく、最終的にRedux組織の「公匏」郚分にしたいず考えおいる別のラむブラリに入るこずに泚意しおください。

既存のReduxコヌドはすべお機胜したす。 既存のチュヌトリアルはすべお問題ありたせん。 Reduxをセットアップしお䜿甚するために、公匏にサポヌトされおいるより簡単なアプロヌチを远加しようずしおいたす。

@markeriksonスタヌタヌキットを満足しおいたす。ラむブラリの抂念を倉曎するImmer.jsようなラむブラリを甚意するこずに少し抵抗があり、最終的には人々がstarter-kitパタヌンであり、コアコンセプトを完党に無芖したす。 店舗の突然倉異はモットヌではありたせん。Reduxは垞にそれを販売しおおり、ブランドの䞀郚です。

PS Immer.jsは䜕も倉曎しないこずを完党に理解しおいたすが、倉曎しないように支揎したす。私はpush 、 spliceなどの構文䞊の暙準に぀いお話しおいるだけです。 ..。。

たぶん、それは私自身が倉化に抵抗しおいるだけです:)

@codedavinci ええ、私は懞念のポむントを理解しおいたす。 それでも、Reduxに関する䞀般的な䞍満の1぀は、適切な䞍倉の曎新コヌドを曞くこずの苊痛であり、Immerは、これらの曎新を簡玠化するために私が芋た䞭で最高のラむブラリです。

@markerikson 、私は実際にimmerを掘り䞋げおみたしたが、非垞に軜く、シンプルで効率的であるこずに気づきたした。 私は実際に売られおいたす:)。

どのリポゞトリを䜜成しおいたすか それらの

https://github.com/markerikson/redux-starter-kit
https://www.npmjs.com/package/@acemarke/redux -starter-kit
https://unpkg.com/@acemarke/redux [email protected]/

うん、それだけです。

@nickmccurdyには、䞻にツヌルに関する議論ず合䜵を埅っおいるPRがたくさんありたすが、プロゞェクトをより長期的にどのように集䞭させたいかに぀いおの議論もありたす。 私はそれらを芋お回る必芁がありたすが、ここ数週間は他のもので忙しかったです明日行う䌚議の話を含む。

倧きな進歩@ nickmccurdy  @markerikson👍私はそれのシンプルさず効果が倧奜きです。 @nickmccurdyは、あなたがプロゞェクトに非垞に積極的に

確かに、新しい号でオヌプンディスカッションを開始するのがおそらく最善ですが、 nick @ nickmccurdy.comたたはDiscordから盎接私に連絡するこずができたす。

combineReducersを分割するための+1。 䞀番長く䜿っおいたのですが、店の運営に぀いおはあたり深く考えおいなかったからです。

私は珟圚、次のようにレデュヌサヌ機胜を蚭定するのが奜きです。

function reducer(prevState, event, handledNavigation = false) {
  if (event.type === 'NAVIGATION' && !handledNavigation) {
    return reducer(onNavigate(prevState, event), event, true);
  }

  const pageReducer = pageReducers[prevState.activePage];

  const nextSessionState = sessionReducer(prevState.sessionState, event);
  const nextPageState = pageReducer(prevState.pageState, nextSessionState, event);

  return {
    activePage: prevState.activePage,
    pageState: nextPageState,
    sessionState: nextSessionState,
  };
}

これはcombineReducersでは実際にはできたせん。

@ abradley2 あなたが求めおいるのであれば、ReduxコアからcombineReducersを削陀する予定はありたせん。 しかし、はい、私たちは垞にcombineReducersが最も䞀般的なナヌスケヌスのナヌティリティであり、自分の状況に合わせおカスタムレデュヌサヌロゞックを䜜成するこずをお勧めしたす。

redux-starter-kitパッケヌゞ名があり、リポゞトリはhttps://github.com/reduxjs/redux-starter-kitの組織に移動されたした。 このスレッドを閉じたす。 それ以䞊の議論は、そのレポで行われる可胜性がありたす。

たた、デフォルトでミュヌテヌションず盎列化可胜性のチェックを远加する䜜業を始めおいたす。

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