From 0744fdcd4f3d5ec41311e91a95928d3325c2d7cb Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 17:49:49 +0900 Subject: [PATCH 1/9] =?UTF-8?q?fix(prh):=20Web=E3=83=96=E3=83=A9=E3=82=A6?= =?UTF-8?q?=E3=82=B6=20->=20=E3=82=A6=E3=82=A7=E3=83=96=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=82=A6=E3=82=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prh.yml | 3 +++ source/basic/module/README.md | 8 ++++---- source/use-case/nodecli/helloworld/README.md | 14 +++++++------- source/use-case/setup-local-env/README.md | 4 ++-- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/prh.yml b/prh.yml index 0de7611cea..bee9548197 100644 --- a/prh.yml +++ b/prh.yml @@ -295,6 +295,9 @@ rules: - expected: ローカルサーバー patterns: - /ローカルサーバ(?!ー)/ + - expected: ウェブブラウザ + patterns: + - Webブラウザ # 一致とマッチ ## 一致は === diff --git a/source/basic/module/README.md b/source/basic/module/README.md index fc181ba316..7f4935e0a6 100644 --- a/source/basic/module/README.md +++ b/source/basic/module/README.md @@ -154,9 +154,9 @@ ECMAScriptモジュールには名前付きとデフォルト以外にもいく ## ECMAScriptモジュールを実行する {#run-es-modules} -作成したECMAScriptモジュールを実行するためには、起点となるJavaScriptファイルをECMAScriptモジュールとしてWebブラウザに読み込ませる必要があります。 -Webブラウザは`script`タグによってJavaScriptファイルを読み込み、実行します。 -次のように`script`タグに`type="module"`属性を付与すると、WebブラウザはJavaScriptファイルをECMAScriptモジュールとして読み込みます。 +作成したECMAScriptモジュールを実行するためには、起点となるJavaScriptファイルをECMAScriptモジュールとしてウェブブラウザに読み込ませる必要があります。 +ウェブブラウザは`script`タグによってJavaScriptファイルを読み込み、実行します。 +次のように`script`タグに`type="module"`属性を付与すると、ウェブブラウザはJavaScriptファイルをECMAScriptモジュールとして読み込みます。 ```html @@ -170,7 +170,7 @@ import { foo } from "./my-module.js"; `type="module"`属性が付与されない場合は通常のスクリプトとして扱われ、ECMAScriptモジュールの機能は使えません。 スクリプトとして読み込まれたJavaScriptで`import`文や`export`文を使用すると、シンタックスエラーが発生します。 -Webブラウザの環境では、インポートされるモジュールの取得はネットワーク経由で解決されます。 +ウェブブラウザの環境では、インポートされるモジュールの取得はネットワーク経由で解決されます。 そのため、モジュール名はJavaScriptファイルの絶対URLあるいは相対URLを指定します。 詳しくは[Todoアプリのユースケース][]を参照してください。 diff --git a/source/use-case/nodecli/helloworld/README.md b/source/use-case/nodecli/helloworld/README.md index 6ae9e970ec..6d9bbf13e5 100644 --- a/source/use-case/nodecli/helloworld/README.md +++ b/source/use-case/nodecli/helloworld/README.md @@ -12,14 +12,14 @@ description: "Hello Worldアプリケーションを通じてNode.jsのCLIアプ まずはNode.jsでHello Worldアプリケーションを作ってみましょう。 -具体的には、実行すると標準出力に"Hello World!"という文字列を表示するCLIアプリケーションを記述します。 +具体的には、実行すると標準出力に`"Hello World!"`という文字列を表示するCLIアプリケーションを記述します。 はじめに用意するのは、アプリケーションのエントリポイントとなるJavaScriptファイルです。 適当なディレクトリに`main.js`という名前でファイルを作成し、次のように記述します。 -[import main.js](src/main.js) +[import, title:"main.js"](src/main.js) -Webブラウザの実行環境では、`console.log`関数の出力先はブラウザのコンソールでしたが、 -Node.js環境では標準出力になります。 +ウェブブラウザの実行環境では、`console.log`関数の出力先はブラウザの開発者ツールのコンソールでした。 +Node.js環境では、`console.log`関数の出力先は標準出力になります。 このコードは、標準出力に`Hello World!`という文字列を出力するものです。 @@ -33,7 +33,7 @@ Hello World! ``` Node.jsの基本は、エントリポイントとなるJavaScriptファイルを作成し、そのファイルを`node`コマンドの引数に渡して実行するという流れです。 -また、WebブラウザのJavaScriptと同じく、コードは1行目から順に実行されます。 +また、ウェブブラウザのJavaScriptと同じく、コードは1行目から順に実行されます。 ## Node.jsとブラウザのグローバルオブジェクト {#global-objects} @@ -43,7 +43,7 @@ Node.jsはChromeと同じV8エンジンを利用しているため、ECMAScript ECMAScriptで定義されているグローバルオブジェクトはブラウザとNode.jsどちらの環境にも存在します。 たとえば`Boolean`、`String`などのラッパーオブジェクトや、`Map`、`Array`、`Promise`のようなビルトインオブジェクトがそれにあたります。 -Webブラウザ環境のグローバルオブジェクトは`window`オブジェクトですが、Node.jsでは[global][]と呼ばれるオブジェクトがグローバルオブジェクトになります。 +ウェブブラウザ環境のグローバルオブジェクトは`window`オブジェクトですが、Node.jsでは[global][]と呼ばれるオブジェクトがグローバルオブジェクトになります。 ブラウザの`window`オブジェクトにはたとえば次のようなプロパティや関数があります。 - [document][] @@ -69,7 +69,7 @@ Webブラウザ環境のグローバルオブジェクトは`window`オブジェ - `main.js`ファイルを作成した - `node`コマンドで`main.js`を実行し、標準出力にログが出力されるのを確認した -- グローバルオブジェクトについて、WebブラウザとNode.jsで実行環境による違いがあることを理解した +- グローバルオブジェクトについて、ウェブブラウザとNode.jsで実行環境による違いがあることを理解した [document]: https://developer.mozilla.org/ja/docs/Web/API/Document [XMLHttpRequest]: https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest diff --git a/source/use-case/setup-local-env/README.md b/source/use-case/setup-local-env/README.md index 0c9c53ad6a..9e0df0540c 100644 --- a/source/use-case/setup-local-env/README.md +++ b/source/use-case/setup-local-env/README.md @@ -6,7 +6,7 @@ description: "アプリケーション開発のためにNode.jsとnpmのイン # アプリケーション開発の準備 {#setup-local-env} これまでに学んだJavaScriptの基本構文は、実行環境を問わずに使えるものです。 -しかしこの後に続くユースケースの章では、具体的な実行環境としてWebブラウザと[Node.js][]の2つを扱います。 +しかしこの後に続くユースケースの章では、具体的な実行環境としてウェブブラウザと[Node.js][]の2つを扱います。 また、ブラウザで実行するアプリケーションであっても、その開発にはツールとしてのNode.jsが欠かせません。 このセクションではユースケースの学習へ進むために必要なアプリケーション開発環境の準備をおこないます。 @@ -14,7 +14,7 @@ description: "アプリケーション開発のためにNode.jsとnpmのイン [Node.js][]はサーバーサイドJavaScript実行環境のひとつで、次のような特徴があります。 -- WebブラウザのChromeと同じ[V8][] JavaScriptエンジンで動作する +- ウェブブラウザのChromeと同じ[V8][] JavaScriptエンジンで動作する - オープンソースで開発されている - OSを問わずクロスプラットフォームで動作する From 735487c3162b56b936470fbc3b06fe79949eeb4f Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 18:05:07 +0900 Subject: [PATCH 2/9] =?UTF-8?q?fix(nodecli/helloworld):=20=E3=83=AA?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/use-case/nodecli/helloworld/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/use-case/nodecli/helloworld/README.md b/source/use-case/nodecli/helloworld/README.md index 6d9bbf13e5..b7ffc2bcc2 100644 --- a/source/use-case/nodecli/helloworld/README.md +++ b/source/use-case/nodecli/helloworld/README.md @@ -20,7 +20,7 @@ description: "Hello Worldアプリケーションを通じてNode.jsのCLIアプ ウェブブラウザの実行環境では、`console.log`関数の出力先はブラウザの開発者ツールのコンソールでした。 Node.js環境では、`console.log`関数の出力先は標準出力になります。 -このコードは、標準出力に`Hello World!`という文字列を出力するものです。 +このコードは、標準出力に`"Hello World!"`という文字列を出力するものです。 @@ -37,14 +37,16 @@ Node.jsの基本は、エントリポイントとなるJavaScriptファイルを ## Node.jsとブラウザのグローバルオブジェクト {#global-objects} -Node.jsはChromeと同じV8エンジンを利用しているため、ECMAScriptで定義されている基本構文はほとんどブラウザと同じように使えます。 -ただし、ブラウザ環境とNode.js環境では利用できるグローバルオブジェクトが違うため、アプリケーションを開発するときにはその違いを理解しなくてはなりません。 +Node.jsはChromeと同じV8というJavaScriptエンジンを利用しています。 +そのため、ECMAScriptで定義されている基本構文はブラウザと同じように使えます。 +しかし、ブラウザ環境とNode.js環境では利用できるグローバルオブジェクトが違うため、アプリケーションを開発するときにはその違いを理解しなくてはなりません。 ECMAScriptで定義されているグローバルオブジェクトはブラウザとNode.jsどちらの環境にも存在します。 -たとえば`Boolean`、`String`などのラッパーオブジェクトや、`Map`、`Array`、`Promise`のようなビルトインオブジェクトがそれにあたります。 +たとえば`Boolean`や`String`などのラッパーオブジェクト、`Map`や`Promise`のようなビルトインオブジェクトはどちらの環境にも存在します。 -ウェブブラウザ環境のグローバルオブジェクトは`window`オブジェクトですが、Node.jsでは[global][]と呼ばれるオブジェクトがグローバルオブジェクトになります。 -ブラウザの`window`オブジェクトにはたとえば次のようなプロパティや関数があります。 +しかし、実行環境によって異なるオブジェクトもあります。 +たとえばウェブブラウザ環境のグローバルオブジェクトは`window`オブジェクトですが、Node.jsでは[global][]と呼ばれるオブジェクトがグローバルオブジェクトになります。 +ブラウザの`window`オブジェクトには次のようなプロパティや関数があります。 - [document][] - [XMLHttpRequest][] @@ -58,7 +60,7 @@ ECMAScriptで定義されているグローバルオブジェクトはブラウ たとえば`window.document`プロパティは、グローバル変数の`document`としてもアクセスできます。 また、ECMAScriptで定義されたものではありませんが、ほぼ同等の機能と名前をもつプロパティや関数がブラウザとNode.jsどちらにもある場合もあります。 -たとえば次のようなものです。 +たとえば次のようなAPIは同等の機能を提供しますが、メソッドの種類や返り値が異なります。 - Console API - `setTimeout`関数 From 204361f26d0cfdcc57179afe56da31d79823561f Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 20:36:39 +0900 Subject: [PATCH 3/9] =?UTF-8?q?refactor(nodecli):=20CommonJS=E3=81=AE?= =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../use-case/nodecli/argument-parse/README.md | 69 +++++++++++-------- .../nodecli/argument-parse/src/cjs-import.js | 3 +- .../argument-parse/src/commander-param.js | 4 +- source/use-case/nodecli/helloworld/README.md | 2 +- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/source/use-case/nodecli/argument-parse/README.md b/source/use-case/nodecli/argument-parse/README.md index 5b0987fde9..ac34fcb5ec 100644 --- a/source/use-case/nodecli/argument-parse/README.md +++ b/source/use-case/nodecli/argument-parse/README.md @@ -16,9 +16,9 @@ description: "コマンドライン引数を受け取り、アプリケーショ 詳細は[公式ドキュメント](https://nodejs.org/dist/latest-v8.x/docs/api/process.html#process_process)を参照してください。 コマンドライン引数へのアクセスを提供するのは、`process`オブジェクトの`argv`プロパティで、文字列の配列になっています。 -例として、次のように`process-argv.js`を記述します。 +例として、次のように`process.argv`をコンソール出力するだけの`process-argv.js`を作成します。 -[import process-argv.js](src/process-argv.js) +[import title:"process-argv.js"](src/process-argv.js) このスクリプトを次のようなコマンドで実行します。 @@ -26,7 +26,7 @@ description: "コマンドライン引数を受け取り、アプリケーショ $ node process-argv.js one two=three four ``` -すると、出力結果は次のようになります。 +このコマンドの実行結果は次のようになります。 ``` [ @@ -56,7 +56,7 @@ commanderは[npm][]の`npm install`コマンドを使ってインストールで npmでパッケージをインストールする前に、まずは`pacakge.json`というファイルを作成しましょう。 `package.json`とは、アプリケーションが依存するパッケージの種類やバージョンなどの情報を記録するJSON形式のファイルです。 `package.json`ファイルのひな形は、`npm init`コマンドで生成できます。 -通常は対話式のプロンプトによって情報を設定しますが、ここではすべてデフォルト値で問題ないため、`--yes`オプションを付与します。 +通常は対話式のプロンプトによって情報を設定しますが、ここではすべてデフォルト値で`pacakge.json`を作成する`--yes`オプションを付与します。 次のコマンドを実行して`pacakge.json`を作成しましょう。 ```shell-session @@ -65,7 +65,7 @@ $ npm init --yes 生成された`package.json`ファイルは次のようになっています。 -[import package.json](src/package.init.json) +[import, title:"package.json"](src/package.init.json) `package.json`ファイルが用意できたら、`npm install`コマンドを使ってcommanderパッケージをインストールします。 このコマンドの引数にはインストールするパッケージの名前とそのバージョンを`@`記号でつなげて指定できます。 @@ -78,50 +78,59 @@ $ npm install commander@2.9 インストールが完了すると、`package.json`ファイルは次のようになっています。 -[import package.json](src/package.json) +[import, title:"package.json"](src/package.json) また、npmのバージョンが5以上であれば `package-lock.json`ファイルが生成されています。 このファイルはnpmがインストールしたパッケージの、実際のバージョンを記録するためのものです。 さきほどcommanderのバージョンは`2.9`としましたが、実際にインストールされるのは`2.9.x`に一致する最新のバージョンです。 `package-lock.json`ファイルには実際にインストールされたバージョンが記録されています。 -これによって、ふたたび`npm install`を実行したときに異なるバージョンがインストールされることを防ぎます。 +これによって、ふたたび`npm install`を実行したときに、異なるバージョンがインストールされることを防ぎます。 ### CommonJSモジュール {#commonjs-module} インストールしたcommanderパッケージを使う前に、**CommonJSモジュール**のことを知っておきましょう。 [CommonJSモジュール][]とは、[Node.js][]環境で利用されているJavaScriptのモジュール化の仕組みです。 -CommonJSモジュールは基本文法で学んだ[ES Module](../../../basic/module/README.md)の仕様が策定されるよりもずっと古くから使われています。 +CommonJSモジュールは基本文法で学んだ[ECMAScriptモジュール][]の仕様が策定されるより前からNode.jsで使われています。 Node.jsの標準パッケージやnpmで配布されるパッケージは、CommonJSモジュールとして提供されていることがほとんどです。 先ほどインストールしたcommanderパッケージも、CommonJSモジュールとして利用できます。 CommonJSモジュールはNode.jsのグローバル変数である`module`変数を使って変数や関数などをエクスポートします。 -次のように`module.exports`プロパティに代入されたオブジェクトが、そのJavaScriptファイルからエクスポートされます。 -複数の名前付きエクスポートが可能なES Moduleと違い、CommonJSでは`module.exports`プロパティの値だけがエクスポートの対象です。 +CommonJSモジュールでは`module.exports`プロパティに代入されたオブジェクトが、そのJavaScriptファイルからエクスポートされます。 +複数の名前付きエクスポートが可能なES Moduleとは異なり、CommonJSでは`module.exports`プロパティの値だけがエクスポートの対象です。 -[import, commonjsExport.js](src/cjs-export.js) +次の例では、`cjs-export.js`というファイルを作成し、`module.exports`でオブジェクトをエクスポートしています。 -CommonJSモジュールをインポートするには、グローバル関数である[require関数][]を使います。 -次のように`require`関数にモジュール名を渡し、戻り値としてエクスポートされた値を受け取ります。 +[import, title:"cjs-export.js"](src/cjs-export.js) -[import, commonjsImport.js](src/cjs-import.js) +このCommonJSモジュールをインポートするには、グローバル関数である[require関数][]を使います。 +次のように`require`関数にインポートしたいモジュールのファイルパスを渡し、戻り値としてエクスポートされた値をインポートできます。 +インポートするファイルパスに拡張子が必須なES Moduleとは異なり、CommonJSの`require`関数では拡張子である`.js`が省略可能です。 -このユースケースで今後登場するモジュールはすべてCommonJSモジュールです。 -Node.jsではES Moduleもサポートされる予定ですが、現在はまだ安定した機能としてサポートされていません。 - -### commanderパッケージを使う {#use-commander} +[import, title:"cjs-import.js"](src/cjs-import.js) +また、`require`関数は相対パスや絶対パス以外にもnpmでインストールしたパッケージ名を指定することもできます。 `npm install`コマンドでインストールされたパッケージは、`node_modules`というディレクトリの中に配置されています。 -次のように`require`関数を使って、`node_modules`ディレクトリに配置されたcommanderパッケージを読み込みます。 +`require`関数にインストールしたパッケージ名を指定することで、`node_modules`ディレクトリに配置されたパッケージを読み込めます。 + +次の例では、先ほどインストールしたcommanderパッケージを`node_modules`ディレクトリから読み込んでいます。 ```js const program = require("commander"); ``` -commanderは`parse`メソッドを使ってコマンドライン引数をパースします。 +このユースケースで今後登場するモジュールはすべてCommonJSモジュールです。 +Node.jsではES Moduleもサポートされる予定ですが、現在はまだ安定した機能としてサポートされていません。 + +### commanderパッケージを使う {#use-commander} + +先ほどインストールしたcommanderパッケージを使ったコマンドライン引数のパース例を見ていきます。 + +次の`commander-flag.js`では、コマンドライン引数の`--foo`オプションを真偽値としてパースしています。 +commanderは`options`メソッドを使って、受け取りたいオプションを定義します。 +オプションの定義後に、`parse`メソッドに`process.argv`を渡してコマンドライン引数をパースします。 パースした後に`opts`メソッドを呼び出すと、定義したオプションと与えられた値をオブジェクトとして取り出すことができます。 -次の`commander-flag.js`では、値をもたないオプションを真偽値にパースしています。 -[import commander-flag.js](src/commander-flag.js) +[import title:"commander-flag.js"](src/commander-flag.js) このスクリプトを次のように実行すると、`--foo`オプションがパースされ、`options.foo`プロパティとして扱えるようになっています。 @@ -137,19 +146,20 @@ commanderパッケージのインストールに失敗しているので、パ Error: Cannot find module 'commander' ``` -値をもつオプションをパースする場合は、次の`commander-param.js`のように記述します。 +次の`commander-param.js`では、コマンドライン引数の`--bar`オプションに渡された値を受け取っています。 -[import commander-param.js](src/commander-param.js) +[import title:"commander-param.js"](src/commander-param.js) -`--foo`オプションに値を与えて実行すれば、文字列が`options.foo`プロパティにセットされていることがわかります。 +`--bar`オプションに値を与えて実行すれば、文字列が`options.bar`プロパティにセットされていることがわかります。 +`options`メソッドで、`--オプション名 <値の種類>`を定義することで、指定したオプション名に渡された値を取得できます。 ```shell-session -$ node commander-param.js --foo bar -bar +$ node commander-param.js --bar "value" +value ``` -このように、`process.argv`配列を直接扱うよりも、commanderのようなライブラリを使うことで簡単にコマンドライン引数を処理できます。 -次のセクションからは、こうして受け取ったコマンドライン引数を使って、CLIアプリケーションを作成していきます。 +このように、`process.argv`配列を直接扱うよりも、commanderのようなライブラリを使うことで宣言的にコマンドライン引数を定義し処理できます。 +次のセクションからは、同じようにコマンドライン引数を定義し、CLIアプリケーションを作成していきます。 ## このセクションのチェックリスト {#section-checklist} @@ -165,4 +175,5 @@ bar [Node.js]: https://nodejs.org/ja/ [require関数]: https://nodejs.org/dist/latest-v8.x/docs/api/modules.html#modules_loading_from_node_modules_folders [アプリケーション開発の準備]: ../../setup-local-env/README.md +[ECMAScriptモジュール]: ../../../basic/module/README.md [^1]: --saveオプションをつけてインストールしたのと同じ意味。npm 5.0.0からは--saveがデフォルトオプションとなりました。 diff --git a/source/use-case/nodecli/argument-parse/src/cjs-import.js b/source/use-case/nodecli/argument-parse/src/cjs-import.js index 70987e4ed9..fc640f8e07 100644 --- a/source/use-case/nodecli/argument-parse/src/cjs-import.js +++ b/source/use-case/nodecli/argument-parse/src/cjs-import.js @@ -1 +1,2 @@ -const myModule = require("../../../../basic/module/src/myModule.js"); +const myModule = require("./cjs-export.js"); +console.log(myModule.foo); // => "foo" diff --git a/source/use-case/nodecli/argument-parse/src/commander-param.js b/source/use-case/nodecli/argument-parse/src/commander-param.js index bb9b455595..c645170ff6 100644 --- a/source/use-case/nodecli/argument-parse/src/commander-param.js +++ b/source/use-case/nodecli/argument-parse/src/commander-param.js @@ -1,5 +1,5 @@ const program = require("commander"); -program.option("--foo "); +program.option("--bar "); program.parse(process.argv); const options = program.opts(); -console.log(options.foo); +console.log(options.bar); diff --git a/source/use-case/nodecli/helloworld/README.md b/source/use-case/nodecli/helloworld/README.md index b7ffc2bcc2..7c41d1e305 100644 --- a/source/use-case/nodecli/helloworld/README.md +++ b/source/use-case/nodecli/helloworld/README.md @@ -27,7 +27,7 @@ Node.js環境では、`console.log`関数の出力先は標準出力になりま JavaScriptのコードをNode.jsで実行するには、`node`コマンドを使用します。 次のコマンドを実行して、Node.jsで`main.js`を実行します。 -``` +```shell-session $ node main.js Hello World! ``` From e0d006e83be347b397a0828e650f38d67badf96c Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 21:34:20 +0900 Subject: [PATCH 4/9] =?UTF-8?q?fix(nodecli/read-file):=20=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/basic/json/README.md | 2 +- .../use-case/nodecli/md-to-html/src/main-0.js | 2 +- .../use-case/nodecli/md-to-html/src/main-1.js | 2 +- .../use-case/nodecli/md-to-html/src/main-2.js | 2 +- .../use-case/nodecli/md-to-html/src/main-3.js | 2 +- .../use-case/nodecli/md-to-html/src/main-4.js | 2 +- .../use-case/nodecli/md-to-html/src/main.js | 2 +- source/use-case/nodecli/read-file/README.md | 80 ++++++++++++------- source/use-case/nodecli/read-file/src/main.js | 2 +- .../nodecli/read-file/src/read-file-3.js | 4 +- .../refactor-and-unittest/src/main-last.js | 2 +- .../nodecli/refactor-and-unittest/src/main.js | 2 +- 12 files changed, 63 insertions(+), 41 deletions(-) diff --git a/source/basic/json/README.md b/source/basic/json/README.md index e640a15e80..75c1542c8b 100644 --- a/source/basic/json/README.md +++ b/source/basic/json/README.md @@ -68,7 +68,7 @@ console.log(JSON.parse(json)); // => [1, 2, 3] 与えられた文字列がJSON形式でパースできない場合は例外が投げられます。 また、実際のアプリケーションでJSONを扱うのは、外部のプログラムとデータを交換する用途がほとんどです。 外部のプログラムが送ってくるデータが常にJSONとして正しい保証はありません。 -そのため、`JSON.parse`メソッドは基本的にtry...catch文で例外処理をするべきです。 +そのため、`JSON.parse`メソッドは基本的に`try...catch`構文で例外処理をするべきです。 {{book.console}} ```js diff --git a/source/use-case/nodecli/md-to-html/src/main-0.js b/source/use-case/nodecli/md-to-html/src/main-0.js index 7e620d88b5..7725be4b84 100644 --- a/source/use-case/nodecli/md-to-html/src/main-0.js +++ b/source/use-case/nodecli/md-to-html/src/main-0.js @@ -8,7 +8,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } console.log(file); diff --git a/source/use-case/nodecli/md-to-html/src/main-1.js b/source/use-case/nodecli/md-to-html/src/main-1.js index 2b2ff79a49..f2aade0b9e 100644 --- a/source/use-case/nodecli/md-to-html/src/main-1.js +++ b/source/use-case/nodecli/md-to-html/src/main-1.js @@ -8,7 +8,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file); // HTML文字列に変換する diff --git a/source/use-case/nodecli/md-to-html/src/main-2.js b/source/use-case/nodecli/md-to-html/src/main-2.js index 9f9cdeebdf..87717729ed 100644 --- a/source/use-case/nodecli/md-to-html/src/main-2.js +++ b/source/use-case/nodecli/md-to-html/src/main-2.js @@ -8,7 +8,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file, { diff --git a/source/use-case/nodecli/md-to-html/src/main-3.js b/source/use-case/nodecli/md-to-html/src/main-3.js index 6c962b11e1..96c16abfc1 100644 --- a/source/use-case/nodecli/md-to-html/src/main-3.js +++ b/source/use-case/nodecli/md-to-html/src/main-3.js @@ -8,7 +8,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file, { diff --git a/source/use-case/nodecli/md-to-html/src/main-4.js b/source/use-case/nodecli/md-to-html/src/main-4.js index 26268d02e2..b39b014402 100644 --- a/source/use-case/nodecli/md-to-html/src/main-4.js +++ b/source/use-case/nodecli/md-to-html/src/main-4.js @@ -18,7 +18,7 @@ const markedOptions = { fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file, { diff --git a/source/use-case/nodecli/md-to-html/src/main.js b/source/use-case/nodecli/md-to-html/src/main.js index 058cc983f2..fe7133f802 100644 --- a/source/use-case/nodecli/md-to-html/src/main.js +++ b/source/use-case/nodecli/md-to-html/src/main.js @@ -8,7 +8,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file); diff --git a/source/use-case/nodecli/read-file/README.md b/source/use-case/nodecli/read-file/README.md index fe9e2abc92..63bb07944e 100644 --- a/source/use-case/nodecli/read-file/README.md +++ b/source/use-case/nodecli/read-file/README.md @@ -10,11 +10,14 @@ description: "Node.jsのfsモジュールを使ったファイルの読み込み ## ファイルパスを受け取る {#receive-file-path} -まずは読み込むファイルのパスを受け取ります。前回のセクションでインストールしたcommanderを使って、コマンドライン引数からファイルパスを取得しましょう。 -オプションでないコマンドライン引数は`program.args`配列から取得できます。 -次のように、ファイルパスを取得して標準出力に表示します。 +まずは読み込むファイルのパスを受け取ります。 -[import receive-path.js](src/receive-path.js) +前回のセクションでインストールしたcommanderを使って、コマンドライン引数からファイルパスを取得しましょう。 + +次のように、`receive-path.js`というファイルを作成しファイルパスを取得して標準出力に表示してみます。 +`commanderでパース後に、オプションとして定義していないコマンドライン引数は`program.args`配列から取得できます。 + +[import title:"receive-path.js"](src/receive-path.js) このスクリプトを次のように実行すると、引数に与えたファイルパスがそのまま表示されます。 @@ -29,28 +32,34 @@ sample.md Node.jsでファイルの読み書きをおこなうには、標準モジュールの[fsモジュール][]を使います。 まずは読み込むためのファイルを作成しましょう。`sample.md`という名前で`receive-path.js`と同じディレクトリに配置します。 -[import sample.md](src/sample.md) +[import title:"sample.md"](src/sample.md) ### fsモジュール {#fs-module} fsモジュールは、Node.jsでファイルの読み書きをおこなうための基本的な関数を提供するモジュールです。 -すべての関数は非同期形式と同期形式の両方が提供されています。 +fsモジュールのメソッドは非同期形式と同期形式の両方が提供されています。 + 非同期形式の関数は常にコールバック関数を受け取ります。 -コールバック関数の第1引数は必ずその処理で発生したエラーオブジェクトになっていて、処理の戻り値などがその後ろの引数につづきます。 -処理が成功したときには、第1引数は`null`または`undefined`になります。 -一方、同期形式の関数が処理に失敗したときは例外を発生させるので、try...catch文によって例外処理をおこなうことができます。 +コールバック関数の第1引数は必ずその処理で発生したエラーオブジェクトになり、残りの引数は処理の戻り値となります。 +処理が成功したときには、第1引数には`null`または`undefined`になります。 +一方、同期形式の関数が処理に失敗したときは例外を発生させるので、`try...catch`構文によって例外処理をおこなうことができます。 -次のサンプルコードは非同期形式の関数の例です。 +次のサンプルコードは、指定したファイルを読み込む非同期形式の`readFile`メソッドの例です。 ```js const fs = require("fs"); fs.readFile("sample.md", (err, file) => { + if (err) { + console.error(err); + } else { + console.log(file); + } }); ``` -そして、次のサンプルコードは同じ関数の同期形式の例です。 +そして、次のサンプルコードは、同じく指定したファイルを読み込む同期形式`readFileSync`メソッドの例です。 ```js @@ -59,23 +68,28 @@ const fs = require("fs"); try { const file = fs.readFileSync("sample.md"); } catch (err) { + // ファイルが読み込めないなどのエラーが発生したときに呼ばれる } ``` -Node.jsはシングルスレッドなので、ノンブロッキング処理である非同期形式のAPIを選ぶことがほとんどです。 +Node.jsはシングルスレッドなので、他の処理をブロックしにくい非同期形式のAPIを選ぶことがほとんどです。 Node.jsにはfsモジュール以外にも多くの非同期APIがあるので、非同期処理に慣れておきましょう。 ### readFile関数を使う {#use-readFile} -ファイルを読み込むには、fsモジュールの`readFile`関数を使います。 -`readFile`関数にはいくつかのオーバーロードがあります。 -次の例では、ファイルパスとコールバック関数だけを渡していますが、 -このときのコールバック関数の第2引数は`Buffer`インスタンスになります。 +fsモジュールの`readFile`メソッドを使いMarkdownファイルを読み込んでみます。 +`readFile`関数には引数によってファイルの読み込み方を指定できます。 -[import read-file-1a.js](src/read-file-1a.js) +次の`read-file-1a.js`では、ファイルパスとコールバック関数だけを渡しています。 +このときのコールバック関数の第2引数にはファイルの中身を表す`Buffer`インスタンスが渡されます。 + +[import title:"read-file-1a.js"](src/read-file-1a.js) `sample.md`を引数に渡した実行結果は次のようになります。 -`Buffer`インスタンスはファイルの中身をバイト列として保持していて、そのまま`console.log`関数に渡しても人間が読める文字列にはなりません。 +`Buffer`インスタンスはファイルの中身をバイト列として保持しています。 +そのため、そのまま`console.log`関数に渡しても人間が読める文字列にはなりません。 + +`read-file-1a.js`に`sample.md`を引数に渡した実行結果は次のようになります。 ```shell-session $ node read-file-1a.js sample.md @@ -83,25 +97,29 @@ $ node read-file-1a.js sample.md ``` `Buffer`インスタンスから文字列を取り出すには、`toString`メソッドを使います。 -`toString`メソッドはオプショナルな引数として文字エンコーディングを受け取れますが、 +`Buffer#toString`メソッドはオプショナルな引数として文字エンコーディングを受け取れますが、 何も指定しなかった場合は自動的にUTF-8として変換されます。 -次の例ではコールバック関数の中で`toString`メソッドを呼び出して、ファイルの中身をUTF-8の文字列として表示します。 -[import read-file-1b.js](src/read-file-1b.js) +次の`read-file-1b.js`では、`readFile`メソッドで読み込んだ`Buffer`インスタンスに対して`toString`メソッドを呼び出しています。 +`toString`メソッドを呼び出すことでファイルの中身をUTF-8の文字列へと変換し、その内容をコンソールに出力しています。 -`sample.md`を引数に渡した実行結果は次のようになります。 +[import title:"read-file-1b.js"](src/read-file-1b.js) + +`read-file-1b.js`に`sample.md`を引数に渡した実行結果は次のようになります。 ```shell-session $ node read-file-1b.js sample.md # sample ``` -ちなみに、次の例のように`readFile`関数の第2引数で文字エンコーディング形式を指定できます。 +毎回、`Buffer#toString`メソッドを呼び出すのは面倒であるため、`readFile`メソッドの引数で読み込むファイルの文字エンコーディングを指定できます。 + +次の`read-file-2.js`では、`readFile`関数の第2引数で文字エンコーディング形式として`utf8`を指定することで、UTF-8のファイルとして読み込みます。 このときのコールバック関数の第2引数は、指定した文字エンコーディングでエンコードされた後の文字列が渡されます。 -[import read-file-2.js](src/read-file-2.js) +[import title:"read-file-2.js"](src/read-file-2.js) -`sample.md`を引数に渡した実行結果は次のようになります。 +`read-file-2.js`に`sample.md`を引数に渡した実行結果は次のようになります。 ```shell-session $ node read-file-2.js sample.md @@ -110,14 +128,16 @@ $ node read-file-2.js sample.md ### エラーハンドリング {#error-handling} -先述のとおり、fsモジュールのコールバック関数の第1引数には常にエラーオブジェクトが渡されます。 +先ほどの例のようにfsモジュールのコールバック関数の第1引数には常にエラーオブジェクトが渡されます。 ファイルの読み書きは存在の有無や権限、ファイルシステムの違いなどによって例外が発生しやすいので、必ずエラーハンドリング処理を書きましょう。 -次の例は`err`オブジェクトが`null`または`undefined`ではないことだけをチェックするシンプルなエラーハンドリングです。 -エラーが発生していたときには表示し、`process.exit`関数を使って実行しているプロセスを異常終了させています。 -[import read-file-3.js](src/read-file-3.js) +次の`read-file-3.js`では、`err`オブジェクトが`null`または`undefined`ではないことだけをチェックするシンプルなエラーハンドリングです。 +エラーが発生していたときには表示し、`process.exit`関数に終了ステータスを指定してプロセスで終了しています。 +ここでは、一般的なエラーを表す終了ステータスの`1`でプロセスを終了しています。 + +[import title:"read-file-3.js"](src/read-file-3.js) -存在しないファイルである`notfound.md`を引数に渡すと、次のようにエラーが発生して終了します。 +`read-file-3.js`を存在しないファイルである`notfound.md`を引数に渡して実行すると、次のようにエラーが発生して終了します。 ```shell-session $ node read-file-3.js notfound.md diff --git a/source/use-case/nodecli/read-file/src/main.js b/source/use-case/nodecli/read-file/src/main.js index feaa752e13..04f16d2f43 100644 --- a/source/use-case/nodecli/read-file/src/main.js +++ b/source/use-case/nodecli/read-file/src/main.js @@ -7,7 +7,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } console.log(file); diff --git a/source/use-case/nodecli/read-file/src/read-file-3.js b/source/use-case/nodecli/read-file/src/read-file-3.js index feaa752e13..6dfb9a2262 100644 --- a/source/use-case/nodecli/read-file/src/read-file-3.js +++ b/source/use-case/nodecli/read-file/src/read-file-3.js @@ -7,8 +7,10 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + // 終了ステータス 1(一般的なエラー)としてプロセスを終了 + process.exit(1); return; } console.log(file); }); + diff --git a/source/use-case/nodecli/refactor-and-unittest/src/main-last.js b/source/use-case/nodecli/refactor-and-unittest/src/main-last.js index 26268d02e2..b39b014402 100644 --- a/source/use-case/nodecli/refactor-and-unittest/src/main-last.js +++ b/source/use-case/nodecli/refactor-and-unittest/src/main-last.js @@ -18,7 +18,7 @@ const markedOptions = { fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = marked(file, { diff --git a/source/use-case/nodecli/refactor-and-unittest/src/main.js b/source/use-case/nodecli/refactor-and-unittest/src/main.js index 2d382a9945..d90dd9df28 100644 --- a/source/use-case/nodecli/refactor-and-unittest/src/main.js +++ b/source/use-case/nodecli/refactor-and-unittest/src/main.js @@ -12,7 +12,7 @@ const filePath = program.args[0]; fs.readFile(filePath, "utf8", (err, file) => { if (err) { console.error(err); - process.exit(err.code); + process.exit(1); return; } const html = md2html(file, program.opts()); From ab2ac9b576952dfedf02ec4297984f60fc9c3664 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 21:54:06 +0900 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20main.js=E3=81=AE=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E5=90=8D=E3=82=92=E6=8C=87=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/use-case/nodecli/md-to-html/README.md | 30 +++++++++++--------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/source/use-case/nodecli/md-to-html/README.md b/source/use-case/nodecli/md-to-html/README.md index 1ea524ee3a..d3bed8fec9 100644 --- a/source/use-case/nodecli/md-to-html/README.md +++ b/source/use-case/nodecli/md-to-html/README.md @@ -20,29 +20,30 @@ $ npm install --save marked@0.6 インストールが完了したら、Node.jsのスクリプトから読み込みます。 前のセクションの最後で書いたスクリプトに、markedパッケージの読み込み処理を追加します。 -[import main.js](src/main-0.js) +[import title:"main.js"](src/main-0.js) -markedパッケージから取得した`marked`オブジェクトは、Markdown文字列を引数に取りHTML文字列を返す関数です。 +markedパッケージをインポートして取得した`marked`関数は、引数のMarkdown文字列をHTML文字列に変換して返します。 次のように`readFile`関数で読み込んだファイルの文字列を引数として渡せば、HTMLに変換できます。 -[import main.js](src/main-1.js) +[import title:"main.js"](src/main-1.js) ## 変換オプションを作成する {#create-convert-option} markedにはMarkdownの[変換オプション][]があり、オプションの設定によって変換後のHTMLが変化します。 いくつかのオプションについてアプリケーション中でのデフォルトの設定を決め、さらにコマンドライン引数から設定を切り替えられるようにしてみましょう。 -今回扱うオプションは次の2つです。 -* gfm -* sanitize +今回のアプリケーションでは次の2つのオプションを扱います。 + +- gfm +- sanitize ### gfmオプション {#gfm-option} `gfm`オプションは、GitHubにおけるMarkdownの仕様([GitHub Flavored Markdown][], GFM)に合わせて変換するかを決めるオプションです。 -markedのデフォルトでは`true`になっています。GFMは標準的なMarkdownにいくつかの拡張を加えたもので、代表的な拡張がURLの自動リンク化です。 +markedではこの`gfm`オプションがデフォルトで`true`になっています。GFMは標準的なMarkdownにいくつかの拡張を加えたもので、代表的な拡張がURLの自動リンク化です。 例として、次のようなMarkdownファイルを用意し、先ほどのスクリプトと、`gfm`オプションを`false`にしたスクリプトで結果の違いを見てみましょう。 -[import sample.md](src/sample.md) +[import, サンプルMarkdownファイル](src/sample.md) `gfm`オプションが有効のときは、URLの文字列が自動的に``タグのリンクに置き換わります。 @@ -80,7 +81,8 @@ https://jsprimer.net/

[import sample.md](src/sample-1.md) -`sanitize`オプションのデフォルト値は`false`なので、何も指定しなければMarkdownファイル中のHTMLはそのまま出力されるHTML中でもタグとして残ります。 +`sanitize`オプションのデフォルト値は`false`です。 +そのため、何も指定しなければMarkdownファイル中のHTMLはそのまま出力されるHTML中でもタグとして残ります。 ```html

サンプルファイル

@@ -94,8 +96,8 @@ https://jsprimer.net/

``` -ここで次のように`sanitize`オプションを有効にすると、`<`と`>`がエスケープされてHTMLタグとして機能しなくなります。 -自由なHTMLを書かれては困る場合に有用なオプションです。 +次のように`sanitize`オプションを有効にすると、`<`と`>`がエスケープされてHTMLタグとして機能しなくなります。 +自由にHTMLを書かれては困る場合に有用なオプションです。 [import sanitizeオプションを有効にする](src/main-3.js) @@ -134,7 +136,8 @@ program.parse(process.argv); アプリケーション側でデフォルト設定を持っておくことで、将来的にmarkedの挙動が変わったときにも影響を受けにくくなります。 markedのオプションはオブジェクトを渡す形式です。 -オブジェクトのデフォルト値を明示的な値で上書きするときには`...`(spread構文)を使うと便利です。([オブジェクトのspread構文](../../../basic/object/README.md#object-spread-syntax)を参照) +オブジェクトのデフォルト値を明示的な値で上書きするときには`...`(spread構文)を使うと便利です。([オブジェクトのspread構文][]を参照) + 次のようにデフォルトのオプションを表現したオブジェクトに対して、`program.opts`メソッドの戻り値で上書きします。 @@ -151,7 +154,7 @@ const markedOptions = { あとは`markedOptions`オブジェクトからmarkedにオプションを渡すだけです。 スクリプト全体は次のようになります。 -[import main.js](src/main-4.js) +[import title:"main.js"](src/main-4.js) 定義したコマンドライン引数を使って、Markdownファイルを変換してみましょう。 @@ -173,3 +176,4 @@ $ node main.js -S sample.md [marked]: https://github.com/chjj/marked [変換オプション]: https://marked.js.org/#/USING_ADVANCED.md#options [GitHub Flavored Markdown]: https://github.github.com/gfm/ +[オブジェクトのspread構文]: ../../../basic/object/README.md#object-spread-syntax \ No newline at end of file From 3ddcfdcdac3a850233431120f00514cf5212aef1 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 22:06:32 +0900 Subject: [PATCH 6/9] =?UTF-8?q?fix(use-case):=20=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AE=E6=96=87=E5=AD=97=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=A8=E6=94=B9=E8=A1=8C=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E6=8C=87=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #879 --- source/use-case/ajaxapp/entrypoint/README.md | 6 +++++- source/use-case/nodecli/argument-parse/README.md | 5 +++-- source/use-case/nodecli/helloworld/README.md | 16 +++++++++++++--- source/use-case/nodecli/read-file/README.md | 2 +- source/use-case/todoapp/entrypoint/README.md | 8 ++++---- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/source/use-case/ajaxapp/entrypoint/README.md b/source/use-case/ajaxapp/entrypoint/README.md index aae3949621..c79d809973 100644 --- a/source/use-case/ajaxapp/entrypoint/README.md +++ b/source/use-case/ajaxapp/entrypoint/README.md @@ -13,10 +13,14 @@ Webアプリケーションにおいては、常にHTMLドキュメントがエ ## プロジェクトディレクトリを作成 {#create-project-directory} -今回作成するアプリにはHTMLやJavaScriptなど複数のファイルが必要となります。そのため、まずそれらを置くためのディレクトリを作成します。 +今回作成するアプリにはHTMLやJavaScriptなど複数のファイルが必要となります。 +そのため、まずそれらのファイルを置くためのディレクトリを作成します。 ここでは `ajaxapp` という名前で新しいディレクトリを作成します。ここからは作成した`ajaxapp`ディレクトリ以下で作業していきます。 +またこのプロジェクトで作成するファイルは、必ず文字コード(エンコーディング)を**UTF-8**、改行コードを**LF**にしてファイルを保存します。 + + ## HTMLファイルの用意 {#preparing-html} エントリポイントとして、まずは最低限の要素だけを配置したHTMLファイルを`index.html`というファイル名で作成しましょう。 diff --git a/source/use-case/nodecli/argument-parse/README.md b/source/use-case/nodecli/argument-parse/README.md index ac34fcb5ec..cf58bb041e 100644 --- a/source/use-case/nodecli/argument-parse/README.md +++ b/source/use-case/nodecli/argument-parse/README.md @@ -53,11 +53,12 @@ $ node process-argv.js one two=three four commanderは[npm][]の`npm install`コマンドを使ってインストールできます。 まだnpmの実行環境を用意できていなければ、先に[アプリケーション開発の準備][]を参照してください。 -npmでパッケージをインストールする前に、まずは`pacakge.json`というファイルを作成しましょう。 +npmでパッケージをインストールする前に、まずは`pacakge.json`というファイルを作成します。 `package.json`とは、アプリケーションが依存するパッケージの種類やバージョンなどの情報を記録するJSON形式のファイルです。 `package.json`ファイルのひな形は、`npm init`コマンドで生成できます。 通常は対話式のプロンプトによって情報を設定しますが、ここではすべてデフォルト値で`pacakge.json`を作成する`--yes`オプションを付与します。 -次のコマンドを実行して`pacakge.json`を作成しましょう。 + +`nodecli`のディレクトリ内で、`npm init --yes`コマンドを実行して`pacakge.json`を作成しましょう。 ```shell-session $ npm init --yes diff --git a/source/use-case/nodecli/helloworld/README.md b/source/use-case/nodecli/helloworld/README.md index 7c41d1e305..48f239e46a 100644 --- a/source/use-case/nodecli/helloworld/README.md +++ b/source/use-case/nodecli/helloworld/README.md @@ -7,6 +7,16 @@ description: "Hello Worldアプリケーションを通じてNode.jsのCLIアプ 実際にアプリケーションを作成するまえに、まずはHello Worldアプリケーションを通じてNode.jsのCLIアプリケーションの基本を学びましょう。 +## プロジェクトディレクトリの作成 {#create-project} + +今回作成するNode.jsのCLIアプリケーションでは、JavaScriptやMarkdownファイルなど種類のファイルを扱います。 +そのため、まずそれらのファイルを置くためのディレクトリを作成します。 + +ここでは`nodecli`という名前で新しいディレクトリを作成します。 +ここからは作成した`nodecli`ディレクトリ以下で作業していきます。 + +またこのプロジェクトで作成するファイルは、必ず文字コード(エンコーディング)を**UTF-8**、改行コードを**LF**にしてファイルを保存します。 + ## Hello World {#hello-world} @@ -14,12 +24,12 @@ description: "Hello Worldアプリケーションを通じてNode.jsのCLIアプ まずはNode.jsでHello Worldアプリケーションを作ってみましょう。 具体的には、実行すると標準出力に`"Hello World!"`という文字列を表示するCLIアプリケーションを記述します。 はじめに用意するのは、アプリケーションのエントリポイントとなるJavaScriptファイルです。 -適当なディレクトリに`main.js`という名前でファイルを作成し、次のように記述します。 +`nodecli`ディレクトリに`main.js`という名前でファイルを作成し、次のように記述します。 [import, title:"main.js"](src/main.js) -ウェブブラウザの実行環境では、`console.log`関数の出力先はブラウザの開発者ツールのコンソールでした。 -Node.js環境では、`console.log`関数の出力先は標準出力になります。 +ウェブブラウザの実行環境では、`console.log`メソッドの出力先はブラウザの開発者ツールのコンソールでした。 +Node.js環境では、`console.log`メソッドの出力先は標準出力になります。 このコードは、標準出力に`"Hello World!"`という文字列を出力するものです。 diff --git a/source/use-case/nodecli/read-file/README.md b/source/use-case/nodecli/read-file/README.md index 63bb07944e..70eb234aad 100644 --- a/source/use-case/nodecli/read-file/README.md +++ b/source/use-case/nodecli/read-file/README.md @@ -87,7 +87,7 @@ fsモジュールの`readFile`メソッドを使いMarkdownファイルを読み `sample.md`を引数に渡した実行結果は次のようになります。 `Buffer`インスタンスはファイルの中身をバイト列として保持しています。 -そのため、そのまま`console.log`関数に渡しても人間が読める文字列にはなりません。 +そのため、そのまま`console.log`メソッドに渡しても人間が読める文字列にはなりません。 `read-file-1a.js`に`sample.md`を引数に渡した実行結果は次のようになります。 diff --git a/source/use-case/todoapp/entrypoint/README.md b/source/use-case/todoapp/entrypoint/README.md index 83a1c27229..397ed3d803 100644 --- a/source/use-case/todoapp/entrypoint/README.md +++ b/source/use-case/todoapp/entrypoint/README.md @@ -32,13 +32,13 @@ JavaScriptモジュールを別々の`script`タグで読み込むと、モジ ## プロジェクトディレクトリを作成 {#project-directory} - - 今回作成するアプリにはHTMLやJavaScriptなど複数のファイルが必要となります。 -そのため、まずそれらを置くためのディレクトリを作成します。 +そのため、まずそれらファイルを置くためのディレクトリを作成します。 ここでは`todoapp`という名前で新しいディレクトリを作成します。 -ここからは、プロジェクトのディレクトリは`todoapp`という名前になっている前提で進めていきます。 +ここからは作成した`todoapp`ディレクトリ以下で作業していきます。 + +またこのプロジェクトで作成するファイルは、必ず文字コード(エンコーディング)を**UTF-8**、改行コードを**LF**にしてファイルを保存します。 ## HTMLファイルの用意 {#preparing-html} From 111430d6e4a3e5f8d43fd01869c61ab6322e4366 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 22:40:15 +0900 Subject: [PATCH 7/9] =?UTF-8?q?fix(nodecli):=20unit=20test=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/use-case/nodecli/README.md | 2 +- .../nodecli/argument-parse/src/cjs-import.js | 2 +- source/use-case/nodecli/read-file/README.md | 22 +++--- .../nodecli/refactor-and-unittest/README.md | 75 ++++++++++++------- .../src/example/functions.js | 9 ++- .../refactor-and-unittest/src/package.json | 2 +- .../src/test/md2html-test.js | 2 +- 7 files changed, 67 insertions(+), 47 deletions(-) diff --git a/source/use-case/nodecli/README.md b/source/use-case/nodecli/README.md index 3cf97cb80f..eda4819d0d 100644 --- a/source/use-case/nodecli/README.md +++ b/source/use-case/nodecli/README.md @@ -26,7 +26,7 @@ Hello Worldアプリケーションを通じてNode.jsのCLIアプリケーシ ### [ファイルを読み込む](./read-file/README.md) {#read-file} -Node.jsのfsモジュールを使ったファイルの読み込みについて学びます。 +Node.jsの`fs`モジュールを使ったファイルの読み込みについて学びます。 ### [MarkdownをHTMLに変換する](./md-to-html/README.md) {#md-to-html} diff --git a/source/use-case/nodecli/argument-parse/src/cjs-import.js b/source/use-case/nodecli/argument-parse/src/cjs-import.js index fc640f8e07..eed862ba24 100644 --- a/source/use-case/nodecli/argument-parse/src/cjs-import.js +++ b/source/use-case/nodecli/argument-parse/src/cjs-import.js @@ -1,2 +1,2 @@ -const myModule = require("./cjs-export.js"); +const myModule = require("./cjs-export"); console.log(myModule.foo); // => "foo" diff --git a/source/use-case/nodecli/read-file/README.md b/source/use-case/nodecli/read-file/README.md index 70eb234aad..a4ead4781a 100644 --- a/source/use-case/nodecli/read-file/README.md +++ b/source/use-case/nodecli/read-file/README.md @@ -1,6 +1,6 @@ --- author: laco -description: "Node.jsのfsモジュールを使ったファイルの読み込みについて学びます。" +description: "Node.jsの`fs`モジュールを使ったファイルの読み込みについて学びます。" --- # ファイルを読み込む {#read-file} @@ -26,18 +26,18 @@ $ node receive-path.js sample.md sample.md ``` -## fsモジュールを使ってファイルを読み込む {#read-file-by-fs} +## `fs`モジュールを使ってファイルを読み込む {#read-file-by-fs} 取得したファイルパスをもとに、ファイルを読み込みます。 -Node.jsでファイルの読み書きをおこなうには、標準モジュールの[fsモジュール][]を使います。 +Node.jsでファイルの読み書きをおこなうには、標準モジュールの[`fs`モジュール][]を使います。 まずは読み込むためのファイルを作成しましょう。`sample.md`という名前で`receive-path.js`と同じディレクトリに配置します。 [import title:"sample.md"](src/sample.md) -### fsモジュール {#fs-module} +### `fs`モジュール {#fs-module} -fsモジュールは、Node.jsでファイルの読み書きをおこなうための基本的な関数を提供するモジュールです。 -fsモジュールのメソッドは非同期形式と同期形式の両方が提供されています。 +`fs`モジュールは、Node.jsでファイルの読み書きをおこなうための基本的な関数を提供するモジュールです。 +`fs`モジュールのメソッドは非同期形式と同期形式の両方が提供されています。 非同期形式の関数は常にコールバック関数を受け取ります。 コールバック関数の第1引数は必ずその処理で発生したエラーオブジェクトになり、残りの引数は処理の戻り値となります。 @@ -73,11 +73,11 @@ try { ``` Node.jsはシングルスレッドなので、他の処理をブロックしにくい非同期形式のAPIを選ぶことがほとんどです。 -Node.jsにはfsモジュール以外にも多くの非同期APIがあるので、非同期処理に慣れておきましょう。 +Node.jsには`fs`モジュール以外にも多くの非同期APIがあるので、非同期処理に慣れておきましょう。 ### readFile関数を使う {#use-readFile} -fsモジュールの`readFile`メソッドを使いMarkdownファイルを読み込んでみます。 +`fs`モジュールの`readFile`メソッドを使いMarkdownファイルを読み込んでみます。 `readFile`関数には引数によってファイルの読み込み方を指定できます。 次の`read-file-1a.js`では、ファイルパスとコールバック関数だけを渡しています。 @@ -128,7 +128,7 @@ $ node read-file-2.js sample.md ### エラーハンドリング {#error-handling} -先ほどの例のようにfsモジュールのコールバック関数の第1引数には常にエラーオブジェクトが渡されます。 +先ほどの例のように`fs`モジュールのコールバック関数の第1引数には常にエラーオブジェクトが渡されます。 ファイルの読み書きは存在の有無や権限、ファイルシステムの違いなどによって例外が発生しやすいので、必ずエラーハンドリング処理を書きましょう。 次の`read-file-3.js`では、`err`オブジェクトが`null`または`undefined`ではないことだけをチェックするシンプルなエラーハンドリングです。 @@ -149,8 +149,8 @@ Error: ENOENT: no such file or directory, open 'notfound.md' ## このセクションのチェックリスト {#section-checklist} - commanderを使ってコマンドライン引数からファイルパスを取得した -- fsモジュールの`readFile`関数を使ってファイルを読み込み、ファイルの中身をログ出力した +- `fs`モジュールの`readFile`関数を使ってファイルを読み込み、ファイルの中身をログ出力した - `readFile`関数の呼び出しにエラーハンドリング処理を記述した -[fsモジュール]: https://nodejs.org/api/fs.html +[`fs`モジュール]: https://nodejs.org/api/fs.html [Buffer]: https://nodejs.org/api/buffer.html diff --git a/source/use-case/nodecli/refactor-and-unittest/README.md b/source/use-case/nodecli/refactor-and-unittest/README.md index ae957bd3fa..fd3eddf061 100644 --- a/source/use-case/nodecli/refactor-and-unittest/README.md +++ b/source/use-case/nodecli/refactor-and-unittest/README.md @@ -8,58 +8,62 @@ description: "ユニットテストの導入とソースコードのモジュー このセクションでは、これまで作成したCLIアプリケーションにユニットテストを導入します。 ユニットテストの導入とあわせて、ソースコードを整理してテストがしやすくなるようにモジュール化します。 -## スクリプトをモジュールに分割する {#split-script} - 前のセクションまでは、すべての処理をひとつのJavaScriptファイルに記述していました。 ユニットテストを行うためにはテスト対象がモジュールとして分割されていなければいけません。 今回のアプリケーションでは、CLIアプリケーションとしてコマンドライン引数を処理する部分と、MarkdownをHTMLへ変換する部分に分割します。 -Node.jsでは、複数のJavaScriptファイル間で変数や関数などをやりとりするために、モジュールという仕組みを利用します。 -モジュールとは変数や関数などを外部にエクスポートするJavaScriptファイルのことです。 -モジュールであるJavaScriptファイルは、別のJavaScriptファイルからインポートできます。 -モジュールからオブジェクトをエクスポートするには、Node.jsのグローバル変数である[moduleオブジェクト][]を利用します。 +## CommonJSでのモジュール化 {#commonjs-module} + +実際にアプリケーションのモジュール化する前に、CommonJSでのモジュール化について簡単に振り返ります。 + +Node.jsでは、複数のJavaScriptファイル間で変数や関数などをやりとりするために、CommonJSモジュールという仕組みを利用します。 +CommonJSモジュールからオブジェクトをエクスポートするには、Node.jsのグローバル変数である[moduleオブジェクト][]を利用します。 `module.exports`オブジェクトは、そのファイルからエクスポートされるオブジェクトを格納します。 -次のコードは簡単な関数をエクスポートするモジュールの例です。 -[import, greet.js](src/example/greet.js) +次の`greet.js`というファイルは、`greet`関数をエクスポートするモジュールの例です。 -`require`関数は別のJavaScriptファイルをモジュールとしてインポートできます。 -次の例では先ほどのモジュールをインポートして、エクスポートされた関数を取得しています。 +[import, title:"greet.js"](src/example/greet.js) -[import, greet-index.js](src/example/greet-index.js) +`require`関数を使い指定したファイルパスのJavaScriptファイルをモジュールとしてインポートできます。 +次のコードでは先ほどの`greet.js`のパスを指定してモジュールとしてインポートして、エクスポートされた関数を取得しています。 -`module.exports`オブジェクトに直接代入するのではなく、そのプロパティとして任意の値をエクスポートできます。 -次の例では2つの関数を同じファイルからエクスポートしています。 +[import, title:"greet-index.js"](src/example/greet-index.js) -[import, functions.js](src/example/functions.js) +`module.exports`オブジェクトそのものに代入するのではなく、`module.exports`オブジェクトのプロパティに代入することでも任意の値をエクスポートできます。 +次の`functions.js`というファイルでは、`foo`と`bar`の2つの関数を同じファイルからエクスポートしています。 -このようにエクスポートされたオブジェクトは、`require`関数の戻り値のプロパティとしてアクセス可能になります。 +[import, title:"functions.js"](src/example/functions.js) -[import, functions-index.js](src/example/functions-index.js) +このようにエクスポートされたオブジェクトは、`require`関数の戻り値であるオブジェクトのプロパティとしてアクセスできます。 +次のコードでは先ほどの`functions.js`をインポートして取得したオブジェクトから`foo`と`bar`関数をプロパティとして取得しています。 + +[import, title:"functions-index.js"](src/example/functions-index.js) + +## アプリケーションをモジュールに分割する {#split-script} それではCLIアプリケーションのソースコードをモジュールに分割してみましょう。 `md2html.js`という名前のJavaScriptファイルを作成し、次のようにMarkdownの変換処理を記述します。 -[import md2html.js](./src/md2html.js) +[import title:"md2html.js](./src/md2html.js) このモジュールがエクスポートするのは、与えられたオプションをもとにMarkdown文字列をHTMLに変換する関数です。 アプリケーションのエントリポイントである`main.js`では、次のようにこのモジュールをインポートして使用します。 -[import main.js](./src/main.js) +[import title:"main.js"](./src/main.js) markedパッケージや、そのオプションに関する記述がひとつの`md2html`関数に隠蔽され、`main.js`がシンプルになりました。 そして`md2html.js`はアプリケーションから独立したひとつのモジュールとして切り出され、ユニットテストが可能になりました。 ## ユニットテスト実行環境を作る {#create-env} -ユニットテストの実行にはさまざまな方法がありますが、 +ユニットテストの実行にはさまざまな方法があります。 このセクションではテスティングフレームワークとして[Mocha][]を使って、ユニットテストの実行環境を作成します。 Mochaが提供するテスト実行環境では、グローバルに`it`や`describe`などの関数が定義されます。 `it`関数はその内部でエラーが発生したとき、そのテストを失敗として扱います。 つまり、期待する結果と異なるならエラーを投げ、期待どおりならエラーを投げないというテストコードを書くことになります。 -テストコード中でエラーを投げるために、今回はNode.jsの標準モジュールのひとつである[assertモジュール][]から提供される`assert`関数を利用します。 -`assert`関数は引数の評価結果がfalseであるとき、実行時にエラーを投げます。 +テストコード中でエラーを投げるために、今回はNode.jsの標準モジュールのひとつである[assertモジュール][]から提供される`assert.strictEqual`メソッドを利用します。 +`assert.strictEqual`メソッドは第1引数と第2引数の評価結果が`===`で比較して異なる場合に、例外を投げる関数です。 Mochaによるテスト環境を作るために、まずは次のコマンドで`mocha`パッケージをインストールします。 @@ -68,25 +72,24 @@ $ npm install --save-dev mocha@6 ``` `--save-dev`オプションは、パッケージを`devDependencies`としてインストールするためのものです。 -package.jsonの`devDependencies`には、そのパッケージを開発するときだけ必要な依存ライブラリを記述します。 +`package.json`の`devDependencies`には、そのパッケージを開発するときだけ必要な依存ライブラリを記述します。 ユニットテストを実行するには、Mochaが提供する`mocha`コマンドを使います。 -Mochaをインストールした後、package.jsonの`scripts`プロパティを次のように記述します。 +Mochaをインストールした後、`package.json`の`scripts`プロパティを次のように記述します。 ```json { ... "scripts": { - "test": "mocha" + "test": "mocha test/" }, ... } ``` -この記述により、`npm test`コマンドを実行したときに`mocha`コマンドが呼び出されます。 +この記述により、`npm test`コマンドを実行すると、`mocha`コマンドで`test/`ディレクトリ以下のファイルのテストを実行します。 試しに`npm test`コマンドを実行し、Mochaによるテストが行われることを確認しましょう。 -まだテストファイルを作っていないので、`Error: No test files found`と表示されます。 - +まだテストファイルを作っていないので、`Error: No test files found`というエラーが表示されます。 ```shell-session $ npm test @@ -107,7 +110,15 @@ Mochaのユニットテストは`test`ディレクトリの中にJavaScriptフ `test/fixtures`ディレクトリにはユニットテストで用いるファイルを配置しています。 今回は変換元のMarkdownファイルと、期待する変換結果のHTMLファイルの2つが存在します。 -ユニットテストを記述したら、もう一度改めて`npm test`コマンドを実行しましょう。1件のテストが通れば成功です。 +次のように変換元のMarkdownファイルを`test/fixtures/sample.md`に配置します。 + +[import, title:"test/fixtures/sample.md"](./src/test/fixtures/sample.md) + +そして、期待する変換結果のHTMLファイルを`test/fixtures/expected.html`に配置します。 + +[import, title:"test/fixtures/expected.html"](./src/test/fixtures/expected.html) + +ユニットテストの準備ができたら、もう一度改めて`npm test`コマンドを実行しましょう。1件のテストが通れば成功です。 ```shell-session $ npm test @@ -118,6 +129,12 @@ $ npm test 1 passing (18ms) ``` +ユニットテストが通らなかった場合は、次のことを確認してみましょう + +- `test/fixtures`ディレクトリに`sample.md`と`expected.html`というファイルを作成したか +- それぞれのファイルは文字コードがUTF-8で、改行コードがLFになっているか +- それぞれのファイルの末尾に余計な改行文字がはいっていないか + ## なぜユニットテストをおこなうのか {#reason-for-unit-test} ユニットテストを実施することには多くの利点があります。 @@ -136,7 +153,7 @@ $ npm test ## まとめ {#unit-test-summary} このユースケースの目標であるNode.jsを使ったCLIアプリケーションの作成と、ユニットテストの導入ができました。 -npmを使ったパッケージ管理や外部モジュールの利用、fsモジュールを使ったファイル操作など、多くの要素が登場しました。 +npmを使ったパッケージ管理や外部モジュールの利用、`fs`モジュールを使ったファイル操作など、多くの要素が登場しました。 これらはNode.jsアプリケーション開発においてほとんどのユースケースで応用されるものなので、よく理解しておきましょう。 ## このセクションのチェックリスト {#section-checklist} diff --git a/source/use-case/nodecli/refactor-and-unittest/src/example/functions.js b/source/use-case/nodecli/refactor-and-unittest/src/example/functions.js index db7c285521..94d0d53138 100644 --- a/source/use-case/nodecli/refactor-and-unittest/src/example/functions.js +++ b/source/use-case/nodecli/refactor-and-unittest/src/example/functions.js @@ -1,3 +1,6 @@ -// functions.js -module.exports.foo = function() { /**/ }; -module.exports.bar = function() { /**/ }; +module.exports.foo = function() { + console.log("foo関数が呼び出されました"); +}; +module.exports.bar = function() { + console.log("bar関数が呼び出されました"); +}; diff --git a/source/use-case/nodecli/refactor-and-unittest/src/package.json b/source/use-case/nodecli/refactor-and-unittest/src/package.json index 496bb85fcd..51d23e0501 100644 --- a/source/use-case/nodecli/refactor-and-unittest/src/package.json +++ b/source/use-case/nodecli/refactor-and-unittest/src/package.json @@ -4,7 +4,7 @@ "description": "", "main": "main.js", "scripts": { - "test": "mocha" + "test": "mocha test/" }, "keywords": [], "author": "", diff --git a/source/use-case/nodecli/refactor-and-unittest/src/test/md2html-test.js b/source/use-case/nodecli/refactor-and-unittest/src/test/md2html-test.js index 3fcff0b6e0..95ecd4b229 100644 --- a/source/use-case/nodecli/refactor-and-unittest/src/test/md2html-test.js +++ b/source/use-case/nodecli/refactor-and-unittest/src/test/md2html-test.js @@ -7,5 +7,5 @@ it("converts Markdown to HTML", () => { const sample = fs.readFileSync(path.resolve(__dirname, "./fixtures/sample.md"), "utf8"); const expected = fs.readFileSync(path.resolve(__dirname, "./fixtures/expected.html"), "utf8"); - assert(md2html(sample) === expected); + assert.strictEqual(md2html(sample), expected); }); From 9959258b38869a89ba8cbe2ac4b220f18ac86cf9 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 22:48:10 +0900 Subject: [PATCH 8/9] fix: code --- .../use-case/nodecli/argument-parse/README.md | 18 +++++++++--------- source/use-case/nodecli/read-file/README.md | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/use-case/nodecli/argument-parse/README.md b/source/use-case/nodecli/argument-parse/README.md index cf58bb041e..c55dc3e769 100644 --- a/source/use-case/nodecli/argument-parse/README.md +++ b/source/use-case/nodecli/argument-parse/README.md @@ -48,7 +48,7 @@ $ node process-argv.js one two=three four 文字列処理を自前で行うこともできますが、このような一般的な処理は既存のライブラリを使うと簡単に書けます。 今回は[commander][]というライブラリを使ってコマンドライン引数をパースします。 -### commanderパッケージをインストールする {#install-commander} +### `commander`パッケージをインストールする {#install-commander} commanderは[npm][]の`npm install`コマンドを使ってインストールできます。 まだnpmの実行環境を用意できていなければ、先に[アプリケーション開発の準備][]を参照してください。 @@ -68,7 +68,7 @@ $ npm init --yes [import, title:"package.json"](src/package.init.json) -`package.json`ファイルが用意できたら、`npm install`コマンドを使ってcommanderパッケージをインストールします。 +`package.json`ファイルが用意できたら、`npm install`コマンドを使って`commander`パッケージをインストールします。 このコマンドの引数にはインストールするパッケージの名前とそのバージョンを`@`記号でつなげて指定できます。 バージョンを指定せずにインストールすれば、その時点での最新の安定版が自動的に選択されます。 次のコマンドを実行して、commanderのバージョン2.9をインストールします。[^1] @@ -89,11 +89,11 @@ $ npm install commander@2.9 ### CommonJSモジュール {#commonjs-module} -インストールしたcommanderパッケージを使う前に、**CommonJSモジュール**のことを知っておきましょう。 +インストールした`commander`パッケージを使う前に、**CommonJSモジュール**のことを知っておきましょう。 [CommonJSモジュール][]とは、[Node.js][]環境で利用されているJavaScriptのモジュール化の仕組みです。 CommonJSモジュールは基本文法で学んだ[ECMAScriptモジュール][]の仕様が策定されるより前からNode.jsで使われています。 Node.jsの標準パッケージやnpmで配布されるパッケージは、CommonJSモジュールとして提供されていることがほとんどです。 -先ほどインストールしたcommanderパッケージも、CommonJSモジュールとして利用できます。 +先ほどインストールした`commander`パッケージも、CommonJSモジュールとして利用できます。 CommonJSモジュールはNode.jsのグローバル変数である`module`変数を使って変数や関数などをエクスポートします。 CommonJSモジュールでは`module.exports`プロパティに代入されたオブジェクトが、そのJavaScriptファイルからエクスポートされます。 @@ -113,7 +113,7 @@ CommonJSモジュールでは`module.exports`プロパティに代入された `npm install`コマンドでインストールされたパッケージは、`node_modules`というディレクトリの中に配置されています。 `require`関数にインストールしたパッケージ名を指定することで、`node_modules`ディレクトリに配置されたパッケージを読み込めます。 -次の例では、先ほどインストールしたcommanderパッケージを`node_modules`ディレクトリから読み込んでいます。 +次の例では、先ほどインストールした`commander`パッケージを`node_modules`ディレクトリから読み込んでいます。 ```js const program = require("commander"); @@ -122,9 +122,9 @@ const program = require("commander"); このユースケースで今後登場するモジュールはすべてCommonJSモジュールです。 Node.jsではES Moduleもサポートされる予定ですが、現在はまだ安定した機能としてサポートされていません。 -### commanderパッケージを使う {#use-commander} +### `commander`パッケージを使う {#use-commander} -先ほどインストールしたcommanderパッケージを使ったコマンドライン引数のパース例を見ていきます。 +先ほどインストールした`commander`パッケージを使ったコマンドライン引数のパース例を見ていきます。 次の`commander-flag.js`では、コマンドライン引数の`--foo`オプションを真偽値としてパースしています。 commanderは`options`メソッドを使って、受け取りたいオプションを定義します。 @@ -140,8 +140,8 @@ $ node commander-flag.js --foo true ``` -もし、次のようなエラーが表示されたときは、commanderパッケージが`node_modules`ディレクトリ内にないことを示しています。 -commanderパッケージのインストールに失敗しているので、パッケージのインストールからやり直してみましょう。 +もし、次のようなエラーが表示されたときは、`commander`パッケージが`node_modules`ディレクトリ内にないことを示しています。 +`commander`パッケージのインストールに失敗しているので、パッケージのインストールからやり直してみましょう。 ``` Error: Cannot find module 'commander' diff --git a/source/use-case/nodecli/read-file/README.md b/source/use-case/nodecli/read-file/README.md index a4ead4781a..503c2daa32 100644 --- a/source/use-case/nodecli/read-file/README.md +++ b/source/use-case/nodecli/read-file/README.md @@ -15,7 +15,7 @@ description: "Node.jsの`fs`モジュールを使ったファイルの読み込 前回のセクションでインストールしたcommanderを使って、コマンドライン引数からファイルパスを取得しましょう。 次のように、`receive-path.js`というファイルを作成しファイルパスを取得して標準出力に表示してみます。 -`commanderでパース後に、オプションとして定義していないコマンドライン引数は`program.args`配列から取得できます。 +`commander`でパース後に、オプションとして定義していないコマンドライン引数は`program.args`配列から取得できます。 [import title:"receive-path.js"](src/receive-path.js) From 62fd648b13d7e9c7e1458dfcad4c88c6a815dca8 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 3 Aug 2019 22:59:29 +0900 Subject: [PATCH 9/9] fix --- source/use-case/nodecli/refactor-and-unittest/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/use-case/nodecli/refactor-and-unittest/README.md b/source/use-case/nodecli/refactor-and-unittest/README.md index fd3eddf061..94cdbb9068 100644 --- a/source/use-case/nodecli/refactor-and-unittest/README.md +++ b/source/use-case/nodecli/refactor-and-unittest/README.md @@ -62,7 +62,7 @@ Mochaが提供するテスト実行環境では、グローバルに`it`や`desc `it`関数はその内部でエラーが発生したとき、そのテストを失敗として扱います。 つまり、期待する結果と異なるならエラーを投げ、期待どおりならエラーを投げないというテストコードを書くことになります。 -テストコード中でエラーを投げるために、今回はNode.jsの標準モジュールのひとつである[assertモジュール][]から提供される`assert.strictEqual`メソッドを利用します。 +今回はNode.jsの標準モジュールのひとつである[assertモジュール][]から提供される`assert.strictEqual`メソッドを利用します。 `assert.strictEqual`メソッドは第1引数と第2引数の評価結果が`===`で比較して異なる場合に、例外を投げる関数です。 Mochaによるテスト環境を作るために、まずは次のコマンドで`mocha`パッケージをインストールします。 @@ -87,7 +87,7 @@ Mochaをインストールした後、`package.json`の`scripts`プロパティ } ``` -この記述により、`npm test`コマンドを実行すると、`mocha`コマンドで`test/`ディレクトリ以下のファイルのテストを実行します。 +この記述により、`npm test`コマンドを実行すると、`mocha`コマンドで`test/`ディレクトリにあるテストファイルを実行します。 試しに`npm test`コマンドを実行し、Mochaによるテストが行われることを確認しましょう。 まだテストファイルを作っていないので、`Error: No test files found`というエラーが表示されます。 @@ -129,7 +129,7 @@ $ npm test 1 passing (18ms) ``` -ユニットテストが通らなかった場合は、次のことを確認してみましょう +ユニットテストが通らなかった場合は、次のことを確認してみましょう。 - `test/fixtures`ディレクトリに`sample.md`と`expected.html`というファイルを作成したか - それぞれのファイルは文字コードがUTF-8で、改行コードがLFになっているか