Almin 0.15リリース
ステート管理ライブラリのAlmin 0.15をリリースしました。
🌟 Features
UseCase#shouldExecute
をサポート
UseCase#shouldExecute
はユースケースを実行するかどうかの事前条件を定義できます。
今までの問題として、ユースケースを宣言的に実行するかどうかを決めることができませんでした。
動作としてはUseCase#execute()
が実行されたときに条件が合ってなければreturnすれば機能としては同じです。
しかし、almin-loggerなどのイベント的には”実行した”という記録が残ってしまうのでイマイチでした。
class MyUseCase extends UseCase {
execute(args){
if(condition){
return; // Should not execute this UseCase
}
// do something
}
}
UseCase#shouldExecute
ではこのケースを宣言的に表現できます。
UseCase#shouldExecute
でfalse
を返せば、そのユースケースを実行しません。
class MyUseCase extends UseCase {
shouldExecute(args): boolean {
return false; // if this usecase should not execute
}
execute(args){
// do something
}
}
この”実行しなかった”というログは別途onWillNotExecuteEachUseCase
イベントで取得できるのできます。
詳しくはLifeCycleEventHub · Alminをみてください。
📝 Documentation
AlminのサイトをOSSドキュメントツールのdocusaurusで作り直した | Web Scratchで書いたようにAlminのドキュメントサイトを作り直しました。
また、いくつかのドキュメントを追加したり修正しています。
Thanks to @koba04.
まだチュートリアルの前段階の所がイマイチなので直していきたいです。
Alminは必要なレイヤー分けをするために必要なものを置くために、Reduxなどに比べると登場人物が多いです。これは、特別な記法などを増やしてまで減らすことは目的ではなく、必要なものはちゃんと見える形にすることが目的にあるからです。
そのためこの辺の知識などを補完するためのドキュメントがもっとあるといいなという感じがしています。 (ライブラリに依存したものというよりは、よくあるレイヤードアーキテクチャなどにもでてくるような知識。HanamiとかTERASOLUNA Server Frameworkのようなそのライブラリ利用者以外にも役立つとより良い。)
🔥 Breaking Change
破壊的な変更が一部ありますが、almin/migration-toolsでマイグレーションできたり、TypeScriptの型の問題になっています。
TypeScript
Payload
のtype
プロパティの型定義を改善しましたPayload
クラスを継承してる人だけに影響があります。
Before:
今まではよくないものが型エラーになっていませんでした。
// OK
class P1 extends Payload{
type = "P1"
}
// OK
class P2 extends Payload {
type: string;
constructor() {
super({ type: "P2" });
}
}
// OK
class P3 extends Payload{
constructor() {
super({ type: "P2" });
}
}
// OK - It is a bug
class P4 extends Payload{
// no type
}
After:
0.15で型チェックが厳密になりました。
// OK
class P1 extends Payload{
type = "P1"
}
// OK
class P2 extends Payload {
type: string;
constructor() {
super({ type: "P2" });
}
}
// NG - Need to defined `type: string`
class P3 extends Payload{
constructor() {
super({ type: "P2" });
}
}
// NG: Fix a bug #295
class P4 extends Payload{
// no type
}
♻️ Remove deprecated API
Context#on*
APIなどをContext#events.on*
へ移動ChangedPayload
を削除 https://github.com/almin/almin/issues/285
この2つに変更は@almin/migration-toolsで自動的にマイグレーションできます。
How to migrate?
@almin/migration-tools
をインストールして、対話式で移行したバージョンを指定すれば後はコードを自動的に変換してくれます。
npm install -g @almin/migration-tools
almin-migration-tools "src/**/*.js"
実際には次のようなコード変更が行われます。
import { UseCase, ChangedPayload } from "almin";
export class ExampleUseCase extends UseCase {
execute() {
this.context.useCase(new ChangedPayload()).execute();
}
}
to
import { UseCase } from "almin";
export class ExampleUseCase extends UseCase {
execute() {
this.context.useCase({ type: "ChangedPayload" }).execute();
}
}
くわしくは@almin/migration-toolsを見てください。
また、このようなマイグレーションツールを作るためのライブラリも作りました。
code-migrator
を使えば、1.0.0
-> 2.0.0
への移行というような対話CLIを簡単につくれます。実際にマイグレーションする処理はjscodeshiftなどの任意のcodemodツールを使えるので、code-migrator
自体は選択されたバージョンに対するスクリプトを起動するだけです。
- facebook/jscodeshift: A JavaScript codemod toolkit.
- square/babel-codemod: babel-codemod rewrites JavaScript using babel plugins.
- KnisterPeter/tscodeshift: tscodeshift is a toolkit for running codemods over multiple TS files
その他
kukerに対応したAlminのDevToolsを作ったりしています。kukerはイベントのログビューア拡張なので、イベントをちゃんと定義してるAlminなどとは相性がいいです。(Redux-DevTools版のalmin-devtoolsもある)
また、Alminはいつでもコントビュートを募集しています。
label:"good first issue"
というラベルがついたIssueなどが手が出しやすいかもしれません。
また、Alminはalmin-react-containerというReact連携用のライブラリを公開しています。(自分がReactを使うことが多いので作った) 最近、Reactが新しいContext APIやRender Propsのドキュメント追加などパターンに変化が見られます。そのためReactとの連携をするalmin-react-containerを新しく作り直そうとしています。(別物を作るイメージ)
この辺に興味がある人は次のIssueを見てみると面白いかもしれません。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。