JavaScript Plugin ArchitectureというJavaScriptのプラグイン設計についての電子書籍を書きました。

この書籍はJavaScriptのライブラリやツールにおけるプラグインアーキテクチャについて見ていく事を目的としたものです。

以下の形式で読むことができます。

GitHub上にソースコードも公開されているでので直接Markdownファイルを読むこともできます。 MarkdownよりはWeb版の方が見やすいのでそちらをオススメします。

Twitterのハッシュタグは#js_plugin_book

更新情報はRSSリリースノートから見ることができます。

v1.0.0

最初に書くと決めたプラグインアーキテクチャが揃ったので1.0.0としてリリースしました。 JavaScript Promiseの本の時と同じく、継続的に更新できる仕組みを色々入れてあるので新しいプラグインアーキテクチャのProposalが出たら書いていく感じになると思います。

このツール/ライブラリで使われてるプラグインの仕組みは面白いというようなものがあれば、ProposalをIssueに書いてみてください。 CONTRIBUTING.mdにProposalの書き方を載せています。

はじめに

JavaScriptの世界では1つの大きなライブラリよりも小さいなものを組み合わせていくようなスタイルが多く見られます。 小さなものを組み合わせて作るためには、プラグインと呼ばれるような拡張の仕組みが必要となります。 またそのようなプラグインがたくさんあるエコシステムの土台を作るには、プラグインアーキテクチャが重要になると言えます。

ソフトウェアの構造に「プラグイン機構」を設け、ユーザコミュニティから開発者コミュニティへの質的な転換を図るのは、ソフトウェア設計からエコシステム設計へとつながる
-- OSS開発の活発さの維持と良いソフトウェア設計の間には緊張関係があるのだろうか? - t-wadaのブログ

この書籍では、JavaScriptにおけるプラグインアーキテクチャやそのエコシステムを形成してるライブラリやツールなどの実装を学ぶことが目的となっています。

何も断りなしにECMAScript 2015で書いてて、JavaScriptの文法の説明は基本的にしてないのでご了承ください。

この書籍の内容について

現状の書籍の概要をまとめてると以下のようなライブラリやツールについて書かれています。 大体の章はProposalに沿って書いていたので、次のような項目になっています。

  • どう書ける?
  • どういう仕組み?
  • 実装してみよう
  • どういう用途に向いている?
  • どういう用途に向いていない?
  • この仕組みを使っているもの
  • エコシステム

jQuery

jQueryのプラグインについて解説しています。 <script>タグをベースとしたプラグインアーキテクチャについて解説しています。

ESLint

ESLintのルールを拡張する仕組みについて解説しています。 ESLintではJavaScriptのコードをパースして作成されたASTを元にコードのLintを行います。 実際にESLintのルールを解釈できる小さな実装を作りながらプラグインの仕組みについて学びます。

Connect

Connectの middleware と呼ばれるプラグインアーキテクチャについて解説しています。 Node.js以外においてもRackなどHTTPサーバーでよく見られるプラグインを使った階層構造について学びます。

gulp

タスク自動化ツールとして知られるgulpのプラグインアーキテクチャについて解説しています。 gulpではデータの流れとして既存のNode.js Streamを使い、そこで流すデータとしてvinylオブジェクトを利用します。 実際にgulpプラグインを書きながら、gulpのプラグインの仕組みについて学びます。

Redux

アプリケーションのStateを管理ライブラリのReduxのプラグインアーキテクチャについて解説しています。 Reduxでは Middleware と呼ばれる拡張の仕組みを持っていますが、Connectとの類似点や相違点があります。 小さなReduxの実装を作りながら Middleware の仕組みについて学びます。

Contributing

この書籍は無料で読むことができ、同時に修正や新しいページを書く権利があります。

CONTRIBUTING.mdに、書籍で扱うべきプラグインアーキテクチャのProposalの書き方や Pull Request、コミットのやりかたなどが書かれています。

間違いやライブラリのアップデートへの追従など何かあれば、IssueやPull Requestをよろしくお願いします。

ソースコードは全てGitHubに公開されています。

License

MIT/CC BY-NC © azu

  • コードはMITライセンスで利用できます
  • 文章はCC BY-NC 4.0で利用できます

もう一つの目的

この書籍のテーマは、先ほど書いたようにプラグインの仕組みについて学ぶという目的を持っています。 しかし、この書籍を書くことにした目的はまた別にあります。

以下のIssueがこの書籍の起点となっています。

このIssueよりさらに前に、電子書籍の開発環境について考えるというIssueが目的の半分です。

目的: もっと気軽に書ける電子書籍 もっと簡単に色々自動化できる電子書籍の書き方についてを考える。

この書籍を書きながら考えた電子書籍のセットアップや継続的な開発については以下などで発表しています。

いつもどおり手段と目的が逆転しているので、 textlintの開発を進めるためにこの書籍を開発していた部分も大きいです。

textlintで日本語の文章をチェックするために論文やRedPenなど既存のLinterを参考に色々なルールを実装しましたが、ルールの実験場としてJavaScript Plugin Architectureを使っていました。

自分が実装するtextlintのルールはfalse positiveにならない事を目標にしています。 そのルールに問題ないかを測ることができ、ある程度量があり、自由にいじれる文章が欲しかったのでJavaScript Plugin Architectureを書いていた部分もあります。

なので、JavaScript Plugin Architectureの.textlintrcはいろんなルールが詰め込まれています。 (後で整理してプリセットとか作るかもしれません。)

技術文書をソフトウェア開発する話でも書いてましたが、自然言語はプログラミング言語と違って正解がないので、汎用的なルールを作るのは結構難しいです。

自然言語処理のほとんどの技術は形態素解析が正しく行われていることを前提に設計されているので、 (中略) 文字レベルで誤った日本語入力に対する校正の大部分は当面困難と予想する。 残念ながら誤った日本語入力に対する形態素解析の研究はきわめて少ないのが現状 -- https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_view_main_item_snippet&index_id=8404&pn=1&count=20&order=7&lang=japanese&page_id=13&block_id=8

とか書かれてるぐらいなので、textlintではルールを簡単に作って公開できる所に注力しています。 オレオレルール設定プリセットなどをどんどん公開するといいです。

また、textlint自体もデフォルトでルールを持っていなかったり、プラガブルな実装になっています。

ルールを処理する仕組みはESLintと同じですが、パーサルール、ルールのエラーを無視する範囲を決めるフィルタールールフィルター実現するロジック出力フォーマッターなど大部分がプラガブルな実装です。

そういうプラグインの実装方法についてもJavaScript Plugin Architectureでは書いているので、興味がある人は見てみてください。

継続的に書く

継続的に書くにはやっぱりCIを回してテストしないと辛いので、JavaScript Plugin Architectureでは次のようなテストが走っています。

この辺をすぐ使えるGitBookのスターターキットも公開してるので興味がある人は触ってみると面白いかもしれません。

おわりに

JavaScript Plugin Architectureをひとまずリリースしました。 世の中にはまだまだおもしろいプラグインの仕組みがあるので、面白いものがあったらProposalのIssueを書いていただけると更新される気がします。

JavaScriptのライブラリを書くときにいろんなプラグインの仕組みをぱっと読めるものがあると便利なので、 他にも面白い仕組みの話を追加してくれる人も募集中です。

最近、プラガブルなロガーライブラリを実装していて、Connect · JavaScript Plugin ArchitectureWeb Audio APIを参考にしたので、こういうのがあると便利です。

今現在、電子書籍を書く環境は簡単に揃います。 ブログでは収まらなそうなちょっとした内容を電子書籍という体裁でまとめてみたりすると面白いかもしれません。

技術書は一日で書き終わらない 途中で飽きてしまう問題 -- 技術書を書く環境はできたが… | 技術文書をソフトウェア開発する話

今はまた別のJavaScript本を書いていますが、継続的に文書開発できる環境についてはまだまだ考える事が多そうです。