初学者としてJavaScriptを学ぶ
はじめに
僕が以前書いたModern JavaScript 概観、そして Electron へは、読んで貰えただろうか?
あれは初学者には全く向いてないエントリだ。
あのエントリは、僕の理解したモダンな JavaScript 全体について概観することを目的としているからね。
あれを読んで、「今の JavaScript ってこんなに大変なのか…」と感じた人は多いだろう。
しかし、ある程度のソフトウェアを開発するために技術全般を概観しようとすれば、ああいう分量になるのは致し方ない。
と言う訳で、今回はちゃんと初心者向けのエントリを書いた。
少し多く感じるかもしれないが、丁寧に説明しようとしたからだと好意的に解釈して欲しい。
開発環境
Thinkpad X1 Carbon 2016 年モデルに Windows10 をインストールしてある。
ハードウェアスペックは、こうだ。
- CPU i7 6600U @ 2.6GHz
- メモリ 16GB
- ストレージ SAMSUNG NVMe SSD 950 PRO 512GB
少し高級かもしれないけど開発者用のマシンとしては普通 だよね。
Node をインストールしよう
Windows に Node をインストールする方法は色々あるんだけど、scoop を使ってほしい。
Scoop をインストールするには、以下のコマンドを Powershell で実行する。
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
scoop のインストールが終わったら、以下のコマンドを入力する。
scoop install nodejs
そうすると、細かいバージョンやディレクトリ名は違うかもしれないが、こういうメッセージが出力されるはずだ。
Installing 'nodejs' (8.5.0).
node-v8.5.0-win-x64.7z (8.7 MB) [=============================================================================] 100%
Checking hash of node-v8.5.0-win-x64.7z... ok.
Extracting... done.
Linking ~\scoop\apps\nodejs\current => ~\scoop\apps\nodejs\8.5.0
Persisting bin
Persisting cache
Running post-install script...
'nodejs' (8.5.0) was installed successfully!
これで、最新版の Node がインストールされた。
バージョンアップする時は、Powershell で以下のようなコマンドを実行すればいい。
scoop update nodejs
Node はかなり頻繁に新しいバージョンがリリースされるから、定期的にアップデートして欲しい。
パフォーマンスが改善したり、細かい問題が解決されたりしているかもしれないからね。
VS Code をインストールする
Node のランタイムをインストールしたら次はエディタをインストールしよう。
世の中 JavaScript を快適に書けるエディタは色々あるけど、今はVS Codeがおススメだ。
ここから、自分の OS に合ったインストーラをダウンロードして実行しよう。
リファレンスをブックマークする
エディタをインストールしたの で、さぁコードを書こうと言いたいところだけど、まだ少しやる事がある。
ちゃんとしたリファレンスサイトをブラウザでブックマークして、困った時はそこを見るようにしてほしいんだ。
Mac には、Dashって便利なアプリがあると聞いた覚えがあるのだけど、僕は使ったことが無いので分からない。
プロジェクトを構成する
プロジェクトをきちんとセットアップするのは、面倒だと感じるかもしれないけど便利なことが多いから少し頑張ってほしい。
まずは、作業用のディレクトリを作ろう。好きなパスにディレクトリを作ってくれればいい。
ここでは、C:/dev/js/projects/js_for_beginner
というディレクトリを作った。
エクスプローラで、このディレクトリを右クリックすると Open with Code
というメニューを選ぶ。
VS Code が起動したら、Ctrl キーを押しながら@キーを押す。これで、VS Code 内に PowerShell が起動するはずだ。
ここで以下のようなコマンドを入力する。
npm init -y
これでデフォルトのpackage.json
が生成される。
Babel を導入する
Node は ES2015 の構文が殆ど使えるので、Babel を使う強いモチベーションはimport
文を使いたいかどうかだけなんだけども、まぁ、使いたい。
Babel を導入するために、以下のようなコマンドを VS Code 上に開いた PowerShell で入力する。
npm install babel-cli babel-preset-env -D
このコマンドが終了するとpackage.json
の中身はこういう風になっているはずだ。
{
"name": "js_for_beginner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {},
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-preset-env": "^1.2.2"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
ここに Babel 用の設定を追加すると、こうなる。
{
"name": "js_for_beginner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"source-map-support": "^0.4.14"
},
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-preset-env": "^1.2.2"
},
"scripts": {
"compile": "babel src --out-dir .",
"exec": "node -r babel-register src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"babel": {
"sourceMaps": "inline",
"presets": [
["env", { "targets": {"node": 7}, "useBuiltIns": true}]
]
}
}
npm script にcompile
タスクとexec
タスクを追加した。併せて、babel
というエントリを一番最後に追加した。
compile
タスクは実行すると、src ディレクトリにある JavaScript がコンパイルされてプロジェクトのルートディレクトリに出力される。
exec
タスクを実行する、コンパイルせずに直接 src ディレクトリにある index.js を動かせる。
babel
エントリのsourceMaps
は、コンパイルした JavaScript の末尾にデバッグ用の SourceMap を付加するという設定だ。
presets
のenv
は、Node と最新の JavaScript の差分だけをコンパイル時に取り込むようにする設定だ。これによってコンパイル後のモジュールが不用意に大きくなるのを避けられる。
Source Map Support の導入
Babel を導入するだけだと、エラーが起きた時のスタックトレースが自分の書いたコードと合わないので、source-map-support
も導入する。
npm install source-map-support -S
src ディレクトリに、index.js というファイルを以下の内容で作ってみよう。
import "source-map-support/register";
import * as fs from "fs";
console.log(fs.readFileSync("package.json").toString());
throw new Error();
これを動かすには、VS Code の PowerShell で以下のコマンドを入力する。
npm run exec
一行目のimport "source-map-support/register";
をコメントアウトした時と、そうでない時でスタックトレースの行番号が微妙に変わるので確認して欲しい。
AVA を導入する
最後は、テスティングフレームワークの導入だ。これで最後なので頑張ってほしい。
いい加減なスクリプティングで言語を勉強するよりは、テストコードを動かしながら言語を勉強した方がよりよい作法が身につくからね。
npm install ava -D
モジュールをインストールしたら、package.json
に AVA 用の設定を追加する。
{
"name": "js_for_beginner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"source-map-support": "^0.4.14"
},
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-preset-env": "^1.2.2"
},
"scripts": {
"compile": "babel src --out-dir .",
"exec": "node -r babel-register src/index.js",
"test": "ava"
},
"author": "",
"license": "ISC",
"babel": {
"sourceMaps": "inline",
"presets": [
["env", { "targets": {"node": 7}, "useBuiltIns": true}]
]
},
"ava": {
"files": [ "test/**/*.js" ],
"source": [ "src/**/*.js" ]
}
}
npm script のtest
タスクの中身を AVA を実行するように変更した。
併せて、AVA がテスト実行する際に、テスト対象コートと、テストコードをどういう基準で探すのかをava
エントリに定義する。
test ディレクトリに、index.js というファイルを以下の内容で作ってみよう。
import test from "ava";
test(async t => {
let foo = Promise.resolve("foo");
t.is(await foo, "foo");
});