Redux: Redux4の重大な変更

作成日 2016年02月01日  ·  33コメント  ·  ソース: reduxjs/redux

この問題を作成して、一度にリリースしたい重大な変更の山を維持します。 これは、私たちが多くの重大な変更を行うことを計画しているという意味ではありません! これが、この問題が存在する理由です。

  • [x]更新されたTypeScriptバインディング(TS 2.0以降の場合)
  • [x] createStoreエクスポートからActionTypesを削除します。 パブリックAPIの一部になることを意図したものではありませんでした。 reduxをインポートしていることはわかりませんが、 redux/lib/*インポートが正式にサポートされているため、 redux/lib/createStoreからのActionTypesエクスポートを停止する必要があります。
  • [x] INIT名前がランダムであることを確認してください(https://github.com/reactjs/redux/issues/1736#issuecomment-219484915)
  • [x] cjsモジュールとesモジュールをバンドルする(#2358)
  • [x] babel-preset-envに切り替えて、IE <11のサポートを終了します。
  • [x] lodash依存関係を削除#2599
  • [x]ミドルウェアセットアップ内のディスパッチを修正しました。 または、この動作を文書化します。 #1240。
  • [x]レデューサーの実行中はsubscribe()getState()を禁止します: https
discussion

最も参考になるコメント

製品を嫌うことは、技術的な決定を下すための生産的な場所ではありません。 😉
このスレッドに焦点を合わせたままにして、これ以上逸脱しないようにしましょう。

全てのコメント33件

redux/lib/*インポートをサポートするようになりました

しますか? 私は常にmain外部からのインポート(基本的にスラッシュ付きのインポート)をプライベートAPIにアクセスしていると見なしていました。 mainは、ライブラリによって提供されるパブリックAPIのリストである必要があります。 唯一の例外は、バンドルサイズを縮小することです(ES6モジュールビルダーがより簡単に利用できるようになるまで)が、パブリックAPIから何かをインポートした後、最適化ステップとしてこれを実行します。

IE8のサポートを終了します。

それでは、最終的に#1123をインポートできますか? :笑顔:

唯一の例外は、バンドルサイズを縮小することです(ES6モジュールビルダーがより簡単に利用できるようになるまで)が、パブリックAPIから何かをインポートした後、最適化ステップとしてこれを実行します。

はい、 3.0.6以降です。 /lib/は今日それを行うための実用的な方法であり、ES6対応のバンドラーが一般的になるまでそれを禁止する理由はありません。 トップレベルのAPIは安定しているので、サポートするのが面倒になるとは思いません。

それでは、最終的に#1123をインポートできますか?

今のところes3ifyPluginでこれを取り入れることを検討しています。 しかし、将来的には、そうです。

トップレベルのAPIは安定しているので、サポートするのが面倒になるとは思いません。

ええ、それも苦痛なことではないと思います。哲学的な問題です。 combineReducersそれらをインポートするにはどうすればよいですか? それらをutils移動し、そこからインポートしますか?

ウェルプ、私は先に進んで、PRとしてそれをしました:smile:あなたがそれを別の方法でやりたいのなら、心配はありません。

それらをutilsに移動し、そこからインポートしますか?

:+1:

reduxでの私の経験を少し共有したいと思います。 私は5か月かけてかなり大きなreduxアプリケーションに取り組みました。
Reduxは素晴らしい仕事をしました。 それにもかかわらず、開発の数週間後、「非同期アクションを処理する方法」の問題にぶつかりました。 最初はreduxthunkを使用して機能しましたが、アクションは急速に複雑になりました。
その時点で、ミドルウェアベースとジェネレーター関数を作成することにしました(redux sagaに似ていますが、それでもアクションでした)。 次のログインアクションのような複雑なアクションを書くことができました

export function* login(login, password) {
  var {state} = yield {
    type: types.ON_DO_NOTHING
  };

  if (state.cursor == "wait")
    return {type: types.ON_DO_NOTHING};

  yield {type: types.ON_WAITCURSOR_START};

  var {state,result} = yield RestManager.Call({
    method: REST.METHODS.POST,
    url: REST.RESOURCES.SESSIONS,
    header: RestManager.getAuthenticationHeader(login, password)
  });

  if (result.status == "success") {

    yield  {
      type: types.ON_REQUEST_SESSION_ID_COMPLETED,
      sessionID: result.data.content.sessionId,
    };

    var {state,result} = yield RestManager.Call({
      method: REST.METHODS.GET,
      url: REST.RESOURCES.FEATURES + "/AIPLM_INTEGRATION/users/" + login,
      header: RestManager.getBasicHeader(REST.APPLICATION_TYPE.JSON)
    });

    if (result.status == "success") {

      yield {type: types.ON_GET_CURRENT_DOCUMENT};
    }
    else {

      yield {type: types.ON_DISCONNECT_YES};

      yield messagesAction.displayMessage("error", i18n.t("NO_FEATURE_MESSAGE"));
    }
  }
  else {

    yield messagesAction.displayMessage("error", result.data.content);
  }

  return {type: types.ON_WAITCURSOR_STOP};
}

そして、それが非同期アクションの問題をどのように解決したかです。

私は今、reduxが2つの異なるコンセプトを1つ、アクションとストアエフェクトとしてミックスしていると信じています。
•アクションは、ユーザーまたはコンピューターがトリガーするものである必要があります(例:ボタンをクリック、時計のチック、フォームの投稿...)
•ストア効果は、ストアを変更するアクションによってトリガーされる必要があります

@guijesuis

実世界のアプリで作業しているときにこのパターンを発見したのは素晴らしいことです。 これは素晴らしいアイデアのように思われることに同意します。 実際、これはまさにhttps://github.com/yelouafi/redux-sagaが提供するものです。

ああ、待って、あなたはそれを言った。 ええ、私がそれを見た今、それはまったく同じではありません。 これは、Reduxの祝福と呪いの両方です。快適に感じる抽象化を選択できます。

Redux-saga付与デーモン。 デーモン内では、アクションとディスパッチ効果を追跡できます(ただし、これらの効果はreduxでのアクションのままです)。 これら2つを分離する(ストアエフェクトディスパッチャーとアクションエフェクトディスパッチャーを独自のミッドウェアパイプで取得する)ことで、将来のreduxを改善できると思いませんか。

ところで、 ${package}/lib/${module}の形式のインポートは理想的ではないと思いますが、最も簡単な方法です。 特に、ツリーシェイクが機能する別のESモジュールビルドがある場合は、プロジェクトのGitルートではなくサブディレクトリをnpm publishすることで、それらを${package}/${module}インポートとして公開する必要があります。

@monolithed :実際に何を求めているのかわからない。 サンクは非常に単純です。関数が関数を返すだけです。 そして、それらはReduxの必須部分でさえありません。

@markerikson

あなたが実際に何を求めているのかわからない。

大声で考えているだけです😄

関数を返す関数だけ

ええ、私はstore => next => action => ...と他の運ばれた関数を意味しました。 それを見ると目に痛みを感じます...😪

そして、それらはReduxの必須部分でさえありません。

分かりました

それらは運ばれる機能ではありません。 それらは高階関数と呼ばれます。 高階コンポーネントに似ています。 これらは、データとロジックの両方をカプセル化する手段です。 そして矢印関数はそれらを非常に口当たりの良いものにします:)

TypeScriptはそのチェックリストに載っていますが、Flowには載っていないことに気づきました。 知っている誰かがそこでそれを働かせる可能性はありますか? 🙏

@rsolomonは#1887ですでに行われています

型付けをTypeScript2.1に移行し、 combineReducers null-safetyと厳密にマップされた型を導入することもできます。

バージョンについて言及する代わりに、「IEはサポートしていません」と言っていただければ幸いです。

どうして?

それでも合理的である最も極端なオプションは、IE <11のサポートを終了することです。すべての最新のJS機能(ただし、Proxyとnew.target)はポリフィルすることができます。

IE8、OTOHは、オブジェクトの静的メソッドを使用するとクラッシュしやすいため、リスクがあります...これは、トランスパイルされたクラスやモジュールで常に発生します。

それらがまだ使用されている唯一の理由は、誰もがそれらをサポートし続けるということです。 Internet Explorerのユーザーは、Internet Explorerが突然機能しなくなった場合でも、コンピューターの使用を停止することはありません。 IEで物事がどのように機能するかを考えるのは時間の無駄です。 なぜそれが親指を立てる価値があったのか理解できません。

ただし、IEで実行する必要のあるものを作成する必要がある場合もあります。 reduxがそれをサポートしていない場合、これらのプロジェクトではreduxは使用されません。 もしそうなら、私は仕事でreduxを使うことができませんでした。 そして、IE11はそれほど悪くはありません。

IEは、特に米国の企業環境において、依然として大きな市場シェアを持っています。 主要な汎用JSパッケージが完全にサポートを終了することはありません。 これはReduxでは考慮されておらず、トピックから外れています。

なぜIEに言及するのですか? IE8は8年前にリリースされたので、気にする必要はないと思います。 本当にIE8を以前のバージョンのままにしておきたい場合。

皆さん、IE8のサポートを終了すると言っただけです。 他のバージョンはありません。 そのバージョンのサポートが必要な場合は、引き続き3.xを使用できます。 4.0のリリースでそのバージョンを非公開にすることはなく、現在と同様に引き続き正常に機能します。

すべての新しいリリースにすぐにアップグレードする必要はありません。 少し古いバージョンのものを実行しても問題ありません。 私がどのように知っているか知りたいですか? このWebサイトGitHubは、この時点で約5年前のバージョンのRailsで実行されています。 そして、それは大丈夫です。

笑、私はフォーラムの議論を始めました。 申し訳ありません。 私はIEが嫌いです

製品を嫌うことは、技術的な決定を下すための生産的な場所ではありません。 😉
このスレッドに焦点を合わせたままにして、これ以上逸脱しないようにしましょう。

nextブランチを更新して10か月以上古くならないようにしました😉コミットは4つしかないため、今でははるかに管理しやすい開始点になるはずです。

https://github.com/reactjs/redux/compare/master...next

甘い! いつものようにあなたの努力に感謝します。 (私は近い将来、それを自分で何もするつもりはありませんが、クリーンなブランチを使用できるようにしておくことは常に素晴らしいことです。)

ここに含めるべきだと思う#2298を追加しました。

エンハンサーのオーバーホールはかなり広範であり、概念実証段階を超えて実際に進められていないため、これからエンハンサーのオーバーホールを削除します。 他の重大な変更をプッシュするためのブロッカーであってはなりません。 後のメジャーに含めることができます。

これをまとめていきたいと思います。 TSの人々は、 nextブランチがいつマスターに着陸するかについて私に怒鳴るのにおそらくうんざりしています:)しかし、また、より段階的な動きで破壊的な変更を加えることを恐れてはいけません。 これまでのところ、 nextそれほど劇的なものは見られないので、物事をクリーンアップして技術的負債を回避するための良い方法です。 変更する余裕がない場合は、React Routerの場合と同様に、3.xバージョンを無期限にサポートできます。

OK、IEサポートを変更して、babel-preset-envを使用することでより実用的になりました。 これに切り替えて、ブラウザとノードのバージョンのサポートについて明示する必要があります。 誰も望んでいない場合はそれを取ることができますが、誰かが貢献したい場合は比較的簡単なPRになるはずです。

おい! babel-preset-envに切り替えて手を貸していただければ幸いです。まもなくPRが始まります。

ありがとう@hmillison! #2599を理解する必要があります。アルファ版の準備ができていると思います。 🥇

OK、次にマスターにマージします。 4.0.0-beta.1がまもなく利用可能になります™!

このページは役に立ちましたか?
0 / 5 - 0 評価