PromisesはECMAScriptであることを元に進めるが、現実的に非同期な処理がECMAScriptには少ないのでDOM APIも使用する。
Promisesが実装されていない環境もあるため、core-jsをPolyfillとして利用する。
大きな区分けとして各チャプターごとにディレクトリを分けている。
それぞれのディレクトリにサンプルコードのソース、テスト、画像等リソースを配置する
できるだけ、一つのasciidocファイル単体でも見られる形にする。
- src/
- サンプルコードのソースが入る
- lib/
- サンプルコードで共通に使うライブラリ的な役割のコードが入る
- test/
- サンプルコードのテストコードが入る
- img/
- 画像等のリソースファイルが入る
各ディレクトリにはその章の序文と各節をinclude
するREADME.adocファイルが置かれる。
サンプルコードは必ずテストコードが必要となる。 読者がコピペして実行するようなコードにはテストを書くべきである。
テストは大きく分けて2種類の実装があるため、どちらかの方法でサンプルコードに対してテストを実装する必要がある
- UnitTest
- DocTest
この書籍では、サンプルコードのソースコード(lib/
)と表示用のコード(embed/
)を分けている。
基本的にはlib/
からembed/
がビルド時に生成され、書籍にはembed/
のコードが埋め込まれる。。
lib/
のコードはCommonJSのコードとして書かれていて、モジュールとしてテストしたい機能をmodule.exports
している。
そのため、UnitTestは通常のNode.jsのコードとしてテストコードをtest/
に実装している。
lib/
からembed/
に生成するコードは、inlining-node-requireを使ってrequire
で読み込んでいるファイルをインライン化している。(一部制約がある)
仕組みについては、次のページも参照してください。
一部の章では、インラインコードに対してpower-doctestを使ったDocTestが実装されている。 実際に有効になってる章(ディレクトリ)は次のテストファイルで定義されている。
Asciidoc中のインラインコードブロックに、次のような[source,javascript]
の言語が指定されたCodeBlockに対してpodtestが行われる。
[source,javascript]
----
const str = "string";
console.log(str); // => "string"
----
次のように// => 値
というコメントを書いた部分が、assert
関数に変換されテストされる。
これにより、サンプルコードのコメントに書いた評価結果と実際の出力が一致するかをテストされている。
詳しい実装は次のドキュメントを参照してください。
サンプルコードはできるだけ最小限で具体的かつ知名度の高いAPIを利用する。
<1>
等のアノテーションを使った説明用のコードは、そのままインラインで埋め込んでもよい。
できうる限り、インラインで直接書かないで、外部ファイルとして置いたものを読み込んで使用する。
非同期APIとしては下記を中心的に利用する
setTimeout
XMLHTTPRequest
- Polyfill : ykzts/node-xmlhttprequest
- node の Coreモジュール
実行環境は基本的にNode.jsでテストするようになっているが、 できるだけブラウザとNode.jsで同じようなコードにする方針とする。 (固有の箇所は環境を明示すればよい)
test/test-helper.js
にグローバル空間に Promise
や XHRが入るようにしている。
(そのためMochaを経由しない場合、Node環境ではサンプルコード単体が動かない場合がある…)
文章の表現をできる限り統一したいため、迷う表現については以下で方針を決めている。 追加したい表現がある場合は、以下に書き込めばよい。
❎ Promises
Promiseという機能についていう時は大文字の単数を使う。
例外としてES PromisesやPromises/A+の仕様について言及する際はsをつけてもよい。
小文字で始まるpromiseはpromiseオブジェクトのみにする。
- それぞれの用語の日本語の対応は resolve = 成功時 、 reject = 失敗時 とする。
- resolveした時 ≠ 解決した時 としない(解決という言葉は紛らわしいので避けるべき)
- "promiseオブジェクトがFulfilled または Rejectedとなった時" と表記する
- 必ず大文字で Fulfilled とする
- "処理が成功した時" or "処理が失敗した時" という表現を使う場合、曖昧さが残らないように気をつける
- たとえば、"処理が成功した場合は
onFulfilled
が呼ばれますが" というようにその結果についても触れる
- たとえば、"処理が成功した場合は
new Promise
の処理について述べるなら、"resolveした時" と書いてもよい。- "resolveされた時" とは書かない
then
でのメソッドチェーン等、new Promise
と直接関係ないケースの場合にはFulfilled,Rejectedを使う
例) Promise.race
は、promiseオブジェクトがどれか一つでもFulfilled または Rejectedになったら次の処理を実行します。
Asciidocでこの書籍は書かれているが、Asciidoctorに依存した機能や表現を使用してよい。 シンタックスについては以下を参考にする。
AngularJSのGit Commit Guidelinesをベースとする。
以下のような形で1行目に概要、3行目から本文、最後に関連するIssue(任意)を書く。
feat(ngInclude): add template url parameter to events
The `src` (i.e. the url of the template to load) is now provided to the
`$includeContentRequested`, `$includeContentLoaded` and `$includeContentError`
events.
Closes #8453
Closes #8454
scope commit title
commit type / /
\ | |
feat(ngInclude): add template url parameter to events
body -> The 'src` (i.e. the url of the template to load) is now provided to the
`$includeContentRequested`, `$includeContentLoaded` and `$includeContentError`
events.
referenced -> Closes #8453
issues Closes #8454
commit typeには以下のような種類がある。
BREAKING CHANGE:
破壊的な変更 - メジャーアップデートが必要feat:
新しい機能の追加 - マイナーアップデートが必要fix:
リリースノートに含めるような修正 - パッチアップデートが必要refactor:
リファクタリングstyle:
コードスタイル、スペースの調整などtest:
テストの追加、修正chore:
その他
1行目のfeat
やfix
といったcommit typeは、迷ったらとりあえずchore
と書いて、scope
も省略して問題ないので、以下のような形でも問題ない。
chore: コミットメッセージ
Releases · azu/promises-book を自動生成するために設けているルールである。
BREAKING CHANGE
, feat
, fix
というcommit typeがリリースノートに自動的に含まれる。
Pull Requestの場合は、マージ時にコミットメッセージを入れられるため、それぞれのコミットで細かく気にする必要はない。
(わからない場合はとりあえずchore
を使うか、ルール外のコミットメッセージをいれてもよい)