• Stars
    star
    320
  • Rank 128,165 (Top 3 %)
  • Language
    JavaScript
  • Created almost 8 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

複雑なJavaScriptアプリケーションを作るために考えること

複雑なJavaScriptアプリケーションを作るために考えること

Patterns For Large-Scale JavaScript Application Architecture Build Status

クライアントサイドJavaScriptで複雑なアプリケーションを作るにおける議論した内容をまとめたものです。

同名のスライドをベースに、実際のものに近い開発ガイドや雑多な内容を追加しています。

作成するアプリケーションによって必要な構造は異なるため、この構成がよいということを主張するものではありませんが、 何か参考になるものがあれば幸いです。

Written by azu github twitter

140文字でOK

140文字しか表示されない環境向けのサマリです。

JavaScriptで複雑なアプリケーションを作る構成と実践ガイド。 ドメインモデルをどのように考えて作っていくかについて。 Babel、React、Almin、PostCSSがベース。

目的

  • 難しいものを簡単に作れないため、難しいものは考えて作るしかない
  • 考えて作るためには、議論できる言語化されたもの(コード)が必要
    • 長期的にメンテナンスするならこの傾向はより必要
  • ルールは明確に、でも最初から明確なワケではない
  • 議論できるベースをどのように作っていくかについて

複雑なものってどんなもの?

ここでは、ライブラリ抜きで数万LOC(lines of code)以上ぐらいを目安に考えている。

基本構成

アーキテクチャ解説

開発ガイド

具体的なコーディングルールなどの開発ガイドのドキュメントは次を読む。

実装例

意見や疑問点

Create New Issue.

Issue作ってそこに書くか、Twitterとか適当に聞いてください。


以下は考え始めたときに「こういう情報を教えてくれる人がいれば助かったのにな」というのを書いたものです。

Inspired by https://github.com/tokuhirom/java-handbook

無理なく理解

Alminはできるだけクラスで書けるようにした。 色々な言語のバックグラウンドをもつ人にとってクラスで書けたほうが直感的に理解ができるため。

Reduxのように関数を主軸した方が柔軟性やImmutabilityとの相性がいい。 しかし、プロジェクトに新しく入る人が読みやすいコードとはまた異なる印象のものができあがる。 また素のJavaScriptだとPayloadオブジェクトなどに型を付けにくいという問題がある。

JSDocでは、オブジェクトに対して型を付けるよりも、クラスのインスタンスとした方が型を扱いやすい。(JSDocのtypedefの使い勝手の問題も大きい)

これはTypeScriptやFlowなどを使えば解決し易いが、あくまでJavaScriptとして書いたときの理解を優先している。

小さくより小さく

問題が複雑化していくほど1つのモデルでは線形的に複雑度が上がっていく。 モデルを小さく分けていくことは、線形的に上昇する複雑度を軽減するためのパターン。

役割分担 - ドメイン、API、View、デザイン、人

小さなプロジェクトなら分割の単位は大きくてもあまり問題は起きない。 プロジェクトが大きくなり、人が増えてきた場合に色々問題が起きやすい。 単純にファイルのコンフリクトする可能性が上昇する。

無意味に分ける必要はないが、分けられるなら積極的に分けた方がよい。 役割が分担され、複数人で並行的に開発がしやすくなる。

たとえば、コンポーネントは小さく作り、そのコンポーネントをレイアウトするコンポーネントを作って配置する。 UseCaseはUseCaseごとにファイルとして分け、むやみにUseCaseをまとめないようにするなど。

また、ファイルという単位ではなくレイヤーという大きな単位で分けることは、変更の影響範囲を限定しリファクタリングをしやすくする。

アーキテクチャで重要なものとしてレイヤー化があるが、優れたレイヤー化とは何か? レイヤーに変更を加えても他のレイヤーに影響しないこと

UseCase

1UseCase1ファイル

  • use-case/ ディレクトリを見たときに、誰(アクター)が何をしたいのかが把握しやすい
  • 1つファイルに複数のことが書かれていると読むときのノイズとなりやすい

UseCaseの名前は能動的

参考: オブジェクト開発の神髄 P189

UseCaseはアクターから見た能動的な名前にし、受動的な名前を避ける。

  • ✗「ゼミは学生に指定される」
  • ◯「学生はゼミを指定する」

UseCaseの目的は、アクターがシステムをどうしたいかを理解するため。 なので、受動的よりも能動的な表現で理解した方が望ましいため。

この問題はDOMの状態をシステムへ反映するときによく考える必要がある。 システムが変更されたからDOMに反映されるではなく、DOMのイベントを起因としてシステムを変更するという形のとき、 UseCaseを受動的にしたくなってしまう。 そこを堪えて能動的な名前にした方がよいと気がしている。(混ざってしまうのを避けたい)

UseCaseはシナリオを書く

参考: オブジェクト開発の神髄 P189

UseCaseにはそのユースケースにおけるアクションの一連の流れを書く。 機能をUseCaseに書くのではなく、あくまでどのような流れなのかを書く。

実際の機能と呼ばれるロジックはドメインモデルに書き、 UseCaseはそのドメインモデルを使った流れを記述する場所です。

UseCaseの事前条件

UseCaseの事前条件はできるだけクリアにしておく。 そうすることでUseCase自体はスッキリと実装できる。

そうでない場合は、UseCase内容として無駄なチェックが増えてしまい本質として何がしたいのかがわからなくなる。

たとえば、アプリの初期化が済めば必ず存在するデータをUseCaseで触るケースについて考えてみる。 このときに、そのデータがあるかの判定をUseCaseに含めるとif文の記述が増えてしまいます。 そのため、そのUseCaseの事前条件として、そのデータは存在しているとして書いたほうがシンプルになる。

もちろんそのUseCaseにそのような事前条件があるということは、コメントや仕組みとして書いた方がいいです。

ビジネスロジックはどこへ?

ドメインへ。

ドメインを考えられることができる

ドメインを作るのは難しい

すごい難しい。 そのドメインのしごと、ライフサイクル、複雑度合いなどを考慮してドメインを分ける。 チームメンバーと相談し、都度判断する。

逆にいえば、相談して作れない作りになっていたらおかしい。

Plain Old JavaScript Object

ドメインはできる限りPlain Old JavaScript Object - ただのJavaScriptで書く。 これはドメインの独立性を維持し、コアドメインに集中するためでもある。

Dateやデータ構造的な問題でJavaScriptに足りない機能がある場合はこの限りではない。

フレームワーク独立

Alminというフレームワーク?を作って導入しているが、そのフレームワークはドメインに対して影響は与えない。 フレームワークとビジネスドメインは独立してないといけないため。 それをかんたんに推し量る目安として、ドメインはPlain Old JavaScript Objectで書けるというものがある(ライブラリ依存してない)

システムの状態(ドメイン)とViewの状態(State)

ドメインとStateを分けたことで、アプリケーションの状態(ドメイン)とViewの状態(State)を分けて考えられます。 この場合に、Stateは一時的な状態として扱い、信頼的できる唯一の情報としてはドメインを利用します。Stateをドメインから作成できるようにしておくと、Stateを作り直すことが簡単になります。

たとえば、history.pushStateでページ切り替えを行う際に、Stateをリセットしたいことが多いはずです。

逆に、Viewでしか利用しない状態などはStateだけで管理しておきます。 (アニメーションやメニューを開いているなどの状態)

この問題は実際のアプリケーションを作る際に置いて選択を迫られることが多いです。

  • <video>は右クリックからUIの状態を変えられるが、システムの状態に齟齬が出たときにどちらを優先するか?
  • エラー表示の状態をStateで管理した際に、pushStateでのページ切り替えをおこなった際にStateはリセットすべきなのか?

この問題は、パフォーマンスや体験などの問題からトレードオフが発生します。 多くの場合において、ドメインよりもStateの方が作り直すことは簡単です。 そのため、基本的にはドメインを信頼できる情報源として、StateはViewのための状態とした方がよいです。

エラーから始める

React Componentもまずは、すべてのpropTypesをisRequiredな状態で書き始める。 optionalだと型が違った場合にエラーがでないので、typoもエラーにならない。

    static propTypes = {
        src: React.PropTypes.string.isRequired
    };

ドメインなども同様にエラーとなるテストを書くところから始める。

気付けることはいいこと

開発中はできるだけデバッグログをだし、どこで動作がおかしくなったのかを追跡できるようにしているといい。 そのため、デフォルトは厳しくし、不要なら例外的に外すような作りにしていく必要がある。

気づけないことはよくないこと

  • デバッグログが増えすぎると埋もれてしまい無視してしまうことがある。
  • Lintを増やすと警告がでてるのを無視してしまうことがある。
  • JSDocの型が嘘をついていて気づかないうちに不正な値が入ってる。

完全に機械的な処理は無理なのでレビューもする必要がある。

など気づけるような仕組みを少しづつでも取り入れていく。

気づけないルールは動かないルール

ドキュメントに書いてあっても、気づけないならそれは形骸化する可能性がある。

React Contextのルール

たとえば、React ContextはContainer Componentのみが使えるというルールにしている。(component.mdを参照) このルールを知らない人は、Project componentでもContextを使った方が楽なので使ってしまう。

そのため、eslint-plugin-no-allow-react-contextというESLintのルールを書いて、Contextを使える場所を限定している。

このようなルールは機械的に判断して、間違った書き方をしたらエラーとなるようにした方がいい。

UseCaseとFactoryのルール

たとえば、UseCaseクラスは次のルールで実装するというルールにもなっている。

  • ファイル名と同名のUseCaseクラスをexportしている
  • ファイル名+FactoryのUseCaseのFactoryクラスをexportしている

このようなルールはできるだけ機械的にチェックする。 JavaScriptで静的なチェックが難しいなら、メタなテストとして実行してテストする。

こういうことができるようにレイヤーを分けているはずなので、機械的なチェックのしやすさもルールの基準とする。

'use strict';
import assert from 'assert';
import glob from 'glob';
import path from 'path';
import interopRequire from 'interop-require';
const srcDir = path.join(__dirname, '../src/');
const useCaseFiles = glob.sync(`${srcDir}/js/use-case/**/*UseCase.js`);
describe('MetaUseCase testing', () => {
  useCaseFiles.forEach((filePath) => {
    // UseCaseはファイル名と同じUseCaseクラスを定義している
    const UseCaseName = path.basename(filePath, '.js');
    // ES6 modules と CommonJSどちらでも読めるように
    const UseCaseModule = interopRequire(filePath) || require(filePath);
    describe(`${UseCaseName}`, () => {
      it('UseCaseファイルはクラスをexportsしてる', () => {
        assert(UseCaseModule, `UseCaseファイルはexportsしてる: ${filePath}`);
      });
      it('UseCaseファイルはファイル名と同名のUseCaseを持つ', () => {
        const UseCase = UseCaseModule[UseCaseName];
        assert(typeof UseCase === 'function', 'UseCaseクラスが存在する');
      });
      it(`UseCaseファイルは ${UseCaseName}Factory クラスを持つ`, () => {
        const Factory = UseCaseModule[`${UseCaseName}Factory`];
        assert(typeof Factory === 'function', 'Factoryクラスが存在する');
        assert(typeof Factory.create === 'function', 'Factory.create()が実装されている');
      });
    });
  });
});

ESLintなどのプラグインを書けば、静的にチェックできる部分も多いはずなので、 1時間以内に書けそうな感じならさっさと書いてしまう方がよい。

レビューで指摘する前に、機械的にチェックして落とした方が全体として良くなる。

JavaScriptはESLint、CSSはstylelintで簡単に独自のルールが作れる。 機械的にチェックできることを発見したらルールを書いてみると、その利益を受け取れる人は複数人いるため効果が分かりやすい。

一人が頑張れば受益者が多いという構図は物事を良い方向に向かわせる起爆剤にはなるので、違いを意識しておくと良いと思います。 -- @t_wada

CoCはできるだけ減らす

DDDはCoC(convention over configuration)と相性が良くないという話もある。 それとは関係なく、CoCが増えるとプロジェクトに参加する人が覚えることは増える。 そのため、できるだけ覚えることは減らすようにしたほうがよい。

たとえば、babel-preset-es2015だけの変換だと、エラーを継承したカスタムエラーは作れない。

class CustomError extends Error {
}

エラーのようなオブジェクトを実装して使うというルールを入れるのもいいが、 覚えることが増えるのでツール側で解消できるなら、そちらのほうがよい。

ツールで解決した方がいいことは、せっかく標準化されていること対して現状では問題がおきた場合の話。 そのときに微妙な回避方法を取るよりは、ツール側で頑張ってみるということ。 (webpackでCSSもrequireしましょうとかではない)

assertは外せるので積極的に入れる

Node.jsのassertは積極的使っていきたい。 unassertを使えばproduction時に外すことが可能なので、開発中はassertをもっと使っていいはず。

CSSは賢くやりすぎない

これはECSSの考えの中に書いてあったことを参考にしている。 "賢く"とは、Sassなどでネストや関数などを使ってスクリプトのように書くことを言っている。 つまり、CSSはDRYではなくていいと考えている。この考え方はECSSの影響を受けている。

最終的にCSSはCSSと出力されるので、CSSのメタレイヤーで賢くやりすぎるのも問題があると考えている。 "賢く"やるより、必要がなくなったらすぐに消せるかを判断できるCSSの方が望ましいと考えている。

原則は絶対ではない

特にCSSでは例外が出てきやすい。 そのため、原則が守れないと崩壊してしまうルールよりは、例外を規定することで原則を守れるルールの方がよい。

CSSの詳細度は一定にする

SUIT CSSなどのルールを使っているのは、詳細度を一定にするためという面が多い。 詳細度を考えてCSSを書くのはとてもむずかしいので、普通に書いたら普通になるという状態を目指しておきたい。 そのために、特別でないものはすべて一定の詳細度にしていく。

Stateは必然的に詳細度が上がるので優先されるなどがちゃんと機能する状態を作るためにも詳細度は一定にする。

簡単にいえば、それぞれの要素には一意なクラスを付けてそれを使えば詳細度は大体安定する。 SUIT CSSはそういうことを決めた命名規則。

BEMなども同じような仕組みを持っている。

パターンはパターン

パターンは作り出すものじゃないという話をどっかで読んだ。

ドメインモデルは常に同じパターンで実装されるとは限らない

Alt: すべてのアプリケーションに同一のアーキテクチャは適応できない。

このパターンが最強!みたいなものは存在しない。

Single source of truth

ショッピングカートを実装してみると必要性が分かる。

1F

ユーザの入力に対して1F以内に反応を適用しないと体験が良くないケースはある。

例としてストップウォッチのようなものなどが該当する。

  • 押してから1フレーム以内に表示が止まってほしい

Flux的なフローだと一周回してから反映するため、常に非同期に回す設計だとこの問題への対処が難しい。 そのため、同期的に一周回せるルートを用意しておくと、このような例外的なケースも同じ一方通行のデータフローで書けるはず。

Stateは更新されたら新しいオブジェクトにする

StateはImmutableである方がよい。 ReactのshouldComponentUpdateを信用して、shallowEqualで更新判定ができるように作っていたほうがいい。

パフォーマンスは更新判定をちゃんとやれば問題なく、StateのMutableに扱うとバグの原因なりやすいため。

StateはViewのため型

  • Container Componentが受け取る
  • こうすることでpropTypesがReact.propTypes.instanceOfのチェックだけでよくなる
import ViewState from "../path/to/store/ViewState";
export default class ContainerComponent extends React.Component {
    static propTypes = {
        view: React.PropTypes.instanceof(ViewState).isRequired
    };
}

AlminだとこのStateクラスをパターン化したalmin-reduce-storeというライブラリがあります。

Container Component

Project Componentやui-kitを使ってページをレイアウトするコンポーネント。

  • React Contextを参照してよい
  • 逆にここ以外でもReact Contextを参照するとどこでもグローバルに値を取り出せてしまう

Project Component

プロジェクト固有のUIコンポーネント。

どこから書き始めるか

UIがあるならステートレスなコンポーネントとしてUIから作るのもいい。 その後でUseCaseやドメイン、State作りを実際にアプリケーションを動かせばいい。

ドメインやUseCaseをどう書くべきか迷った場合は、まずUseCaseから考えてみるとよい。 まずは、アクターがシステムに対して何をしたいのかを書き出してみると、どのようなドメインがあって何をするべきかがでてくるはず。

Start from the Use Cases
The best place to start when trying to understand a new domain is by mapping out use cases. A use case lists the steps required to achieve a goal, including the interactions between users and systems. Work with business users to understand what users do with the current system, be it a paper‐based process or one that’s computerized. Be careful to listen for domain terminology, because this forms the start of your shared language for describing and communicating the problem domain. It’s also useful to read back the use case to the domain expert in your own understanding, so they can validate that you do understand the use case as they do. Remember: capture a process map of reality, understand the work ow as it is, and don’t try to jump to a solution too quickly before you truly understand and appreciate the problem. -- Patterns, Principles, and Practices of Domain-Driven Design

翻訳

メッセージの翻訳は仕組み上色々漏れが生まれやすい。 漏れが生まれにくい仕組みにすることが重要。

サーバに習う

AlminとReactを使ったアーキテクチャは、 サーバ側のようなデータフローを行えるようになってる。 なので、「この場合はどうするのがいいんだろ?」というときにサーバ側ではどうやってるかを考えるのも参考になる。

たとえばルーティングとかをクライアントサイドでやる場合に、サーバではどのようにやるのが一般的なのかを考えるなど。

More Repositories

1

promises-book

JavaScript Promiseの本
HTML
1,347
star
2

awesome-commit-english

コミット英語についての記事まとめ
848
star
3

NSDate-Escort

NSDate utility library that is compatible with NSDate-Extensions API.
Objective-C
269
star
4

url-cheatsheet

URL manipulation cheatsheet for JavaScript
JavaScript
182
star
5

monorepo-utils

A collection of utilities for monorepo/lerna. Tools for TypeScript project references etc..
TypeScript
161
star
6

github-label-setup

📦 Setup GitHub label without configuration.
JavaScript
152
star
7

mdline

Markdown timeline format and toolkit.
HTML
147
star
8

lerna-monorepo-github-actions-release

Lerna + monorepo +GitHub Actions Release Flow
JavaScript
147
star
9

kvs

Lightweight key-value storage library for Browser, Node.js, and In-Memory.
TypeScript
139
star
10

github-reader

[node-webkit] GitHub client app - Viewer for Notifications and News Feed.
JavaScript
136
star
11

browser-resources

A Collection of official Resources/Status/Issues for browsers.
132
star
12

github-sponsors-tax

GitHub Sponsorsの確定申告手順
128
star
13

book-review

本を読んだ感想を書くブログです。
TypeScript
127
star
14

irodr

RSS reader client like LDR for Inoreader.
TypeScript
115
star
15

multi-stage-sourcemap

multi-level source map processing library.
JavaScript
104
star
16

parcel-typescript-example

A minimum TypeScript app with Parcel Bundler.
HTML
101
star
17

license-generator

A Command line tool that generate `LICENSE` file.
Rust
99
star
18

har-extractor

A CLI that extract har file to directory.
TypeScript
90
star
19

gitbook-starter-kit

GitBook Starter Kit.
JavaScript
84
star
20

create-validator-ts

Create JSON Schema validator from TypeScript.
TypeScript
83
star
21

faao

Faao is a GitHub issue/pull-request client on Electron.
TypeScript
75
star
22

material-flux

No magic flux implementation library.
JavaScript
75
star
23

kuromojin

Provide a high-level wrapper for kuromoji.js. Cache/Promise API
CSS
75
star
24

codemirror-console

Web Console UI for JavaScript.
JavaScript
72
star
25

can-npm-publish

A command line tool that check to see if `npm publish` is possible.
JavaScript
66
star
26

commonjs-to-es-module-codemod

Codemod that convert CommonJS(require/exports) to ES Modules(import/export) for JavaScript/TypeScript
JavaScript
66
star
27

pdf-markdown-annotator

[nw.js] pdf viewer + markdown editor
CSS
62
star
28

git-commit-push-via-github-api

Git commit and push by using GitHub API. No depended on Git binary.
TypeScript
62
star
29

mu-epub-reader

Epub viewer on Electron that support text translation.
JavaScript
61
star
30

open-job-letter

[PR] Open Job Application Letter
JavaScript
61
star
31

opml-to-markdown

[node.js]Convert OPML(Outline) to Markdown
JavaScript
60
star
32

ui-event-observer

Provide performant way to subscribe to browser UI Events.
JavaScript
60
star
33

ecmascript-version-detector

ECMAScript Version Detector
JavaScript
59
star
34

immutable-array-prototype

A collection of Immutable Array prototype methods(Per method packages).
TypeScript
59
star
35

eventmit

Simple EventEmitter. A single event object per an event.
TypeScript
57
star
36

babel-plugin-jsdoc-to-assert

Runtime type checking for JSDoc
JavaScript
57
star
37

mini-flux

mini flux implementation
JavaScript
54
star
38

rc-config-loader

Load config from .{product}rc.{json,yml,js} file
TypeScript
52
star
39

MarkdownSyntaxEditor

[iOS] NSAttributedString + UITextView + Markdown Syntax highlighting.
Objective-C
52
star
40

Coveralls-iOS

iOS/Objective-C: minimum setup for Coveralls.
Shell
50
star
41

company-introduction-jp

日本の会社紹介スライドのまとめです。
TypeScript
50
star
42

wait-for-element.js

This library provide a function which wait until an element is visible.
JavaScript
49
star
43

power-doctest

JavaScript Doctest for JavaScript, Markdown and Asciidoc.
TypeScript
48
star
44

hatebupwa

Hatena Bookmark search app.
TypeScript
45
star
45

azu

azu 's issue todo
JavaScript
42
star
46

tsconfig-to-dual-package

Node.js dual package tool that add package.json to tsconfig's `outDir`
TypeScript
42
star
47

hubmemo

Private/Public Memo system based on GitHub.
TypeScript
42
star
48

github-search-rss

GitHub Search Results as RSS Feeds via GitHub Actions.
TypeScript
42
star
49

service-worker-updatefound-refresh-dialog

A library show refresh dialog/banner when the service worker found updated.
JavaScript
41
star
50

memory-note

Fast memory note on CDN edge. Cloudflare Workers KV/GitHub Projects as backend.
TypeScript
41
star
51

gitbook-plugin-include-codeblock

GitBook plugin for including file
JavaScript
40
star
52

fz-browse

fzf-like fuzzy finder tool but view search results on browser.
JavaScript
40
star
53

safe-marked

Markdown to HTML using marked and DOMPurify. Safe by default.
TypeScript
40
star
54

missue

A Toolkit helps you to management your TODO based on GitHub Issues.
JavaScript
39
star
55

jsdoc-to-assert

JSDoc to assert
JavaScript
38
star
56

mumemo

Mumemo is screenshot-driven note application.
TypeScript
38
star
57

set-env-to-github_env

A migration tools convert `::set-env`/`::set-output`/`::save-state` to $GITHUB_ENV/$GITHUB_OUTPUT/$GITHUB_STATE on GitHub Actions.
TypeScript
36
star
58

mytweets

Search all your tweets.
TypeScript
36
star
59

release-changelog

[Deprecated] Easy to use conventional-changelog and release-it.
JavaScript
36
star
60

babel-plugin-strip-function-call

Babel plugin strip any function call.
JavaScript
36
star
61

ni.zsh

Alternative `ni` written in zsh
Shell
36
star
62

podspec-bump

A command line tools to bump podspec version for Cocoapods.
JavaScript
36
star
63

OperationPromise

NSOperation(NSOperationQueue) dependency manager library.
Objective-C
36
star
64

pdf.js-controller

Provide presentation interface using pdf.js
JavaScript
36
star
65

philan.net

Public Donation Management webservice for Philanthropist.
TypeScript
35
star
66

NumericKeypad

NumericKeypad for iPad
Objective-C
33
star
67

express-router-dependency-graph

A static code analysis tool that creates a dependency graph for express routing.
TypeScript
33
star
68

monorepo-release-changesets

A monorepo use yarn + lerna + changesets + GitHub Actions.
JavaScript
32
star
69

technical-word-rules

JavaScript中心のIT技術用語のLint用辞書
JavaScript
31
star
70

how-to-learn-es6

📝 How to learn ECMAScript2015 for Beginner?
HTML
30
star
71

slide

スライド置き場
HTML
29
star
72

express-lazy-router

Lazy loading for express router
TypeScript
29
star
73

slide-pdf.js

Presentation tools for pdf file in browser.
JavaScript
29
star
74

korefile

File System API for Local/GitHub.
TypeScript
29
star
75

JSONAccelerator

Get in, get out — nice and neat
Objective-C
29
star
76

github-sponsorable-in-japan

A list of GitHub users who are living in Japan and are sponsor-able.
TypeScript
27
star
77

watch-rss

Subscribe your watched GitHub Repository's releases as RSS feeds on Inoreader
TypeScript
27
star
78

eslint-plugin-typescript-compat

ESLint rule for browser compatibility of your TypeScript code
TypeScript
27
star
79

promise-test-helper

Helper JavaScript library for promises testing.
JavaScript
27
star
80

voicod

Voice note editor
TypeScript
27
star
81

voting-badge

👍 voting badge like Travis CI
JavaScript
27
star
82

delete-tweets

Twitterのアーカイブから削除候補のTweetsを抽出する補助ツールと削除するツール。
TypeScript
27
star
83

events-to-async

Treat EventEmitter-like object using Async/Await, Async Iterator.
TypeScript
26
star
84

emscripten-example

emscripten wasm example in node.js
JavaScript
26
star
85

ios-practice

iOSアプリ開発におけるプラクティス
Objective-C
25
star
86

postem

Cross posting client for twitter, hatebu, and own services.
JavaScript
25
star
87

reftest-runner

Reftest runner with WebDriver API.
JavaScript
24
star
88

github-issue-widget

Showcase your Github(repository)'s issue list via iframe.
JavaScript
24
star
89

negaposi-analyzer-ja

形態素解析したtokenからネガティブ/ポジティブを判定したスコアを返すJavaScriptライブラリ
JavaScript
23
star
90

mic-mutebar

Tiny GUI app that show microphone status
HTML
22
star
91

github-actions-badge

Generate GitHub Actions badge Markdown code.
TypeScript
22
star
92

shallow-equal-object

Shallow equal check object that support TypeScript.
TypeScript
22
star
93

github-funding-yml-updater

Update multiple repositories's `.github/FUNDING.yml` via GitHub API
TypeScript
21
star
94

exponential-backoff-generator

Exponential backoff generator. Provide robust retry function.
TypeScript
21
star
95

vite-react-example

Example: Vite + React + TypeScript
TypeScript
21
star
96

github-ribbon-generator

GitHub Ribbon Generator on Web.
Vue
21
star
97

dynamic-import-assets

Dynamic Imports for JavaScript and CSS.
TypeScript
20
star
98

eslint-cjs-to-esm

ESLint wrapper for migration from CJS to ESM.
JavaScript
20
star
99

searchive

Search All My Documents{PDF}.
JavaScript
20
star
100

running-on-streetview

Virtual Running on Google Street View.
TypeScript
20
star