Skip to content

Commit 6ed90f4

Browse files
committed
前書きとかその周辺修正
1 parent cc0b0b2 commit 6ed90f4

9 files changed

+296
-129
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ node_modules
44
docs/.doctrees
55
_build/latex
66
.DS_Store
7+
node_modules

baseenv.rst

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@
66
プロジェクトでのコーディングであれば、誰が書いても同じスタイルになるなど、コード品質の統一が大切になりますので、単なる個人用の設定ではなく、それをシェアできるというのも目的として説明していきます。
77
ここでは、基本的にすべてのプロジェクトでJest、ESLint、Prettierなどを選択しています。まあ、どれも相性問題が出にくい、数年前から安定して存在している、公式で推奨といった保守的な理由ですね。きちんと選べば、「JSはいつも変わっている」とは距離を置くことができます。
88

9-
.. todo::
10-
11-
ESLintのTypeScript対応はまだまだ開発途上で厳しそうなのでTSLintに書き戻す?
12-
139
* Jest
1410

1511
テスティングフレームワークはたくさんありますが、avaとJestがテスト並列実行などで抜きん出ています。JestはTypeScript用のアダプタが完備されています。avaはBabel/webpackに強く依存しており、単体で使うなら快適ですが、他のBabel Configと相性が厳しくなるのでJestにしています。
1612

1713
* ESLint
1814

19-
公式が押しているのでこれですね。
15+
公式が押しているのでこれですね。かつてはTSLintというツールがデファクトスタンダードでしたが、最適化の限界があることなどを理由に、TypeScriptが公式にESLintをメインのLinterとすることが宣言されました。よほどの理由がないかぎりはESLintを使うべきです。
16+
17+
ESLintはプラグインを使うことでさまざまなルールを足せますし、プラグインを通じて設定を一括で変更できます。これはツール同士の干渉を避けるためだったり、推奨のルールセットを配布する手段として利用されています。
2018

2119
* @typescript-eslint/eslint-plugin
2220

@@ -211,4 +209,7 @@ Visual Stuido Codeでフォルダを開いたときに、eslintの拡張と、ed
211209
"files.autoSave": "off"
212210
}
213211
214-
.. todo:: tsdocとかドキュメントツールを紹介
212+
.. todo:: tsdocとかドキュメントツールを紹介
213+
214+
.. todo:: eslintやテストの書き方の紹介
215+

clienv.rst

+79-66
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
1-
CLIツール作成のための環境設定
2-
=========================================
1+
===============================================
2+
CLIツール・ウェブサーバー作成のための環境設定
3+
===============================================
34

4-
TypeScriptを使ってNode.jsのためのCLIツールを作成するための環境構築方法を紹介していきます
5+
TypeScriptを使ってCLIツールやウェブサーバーなどのNode.jsやDenoがある環境で動作するソフトウェアを作成するための環境構築方法を紹介していきます。2つ方法があります
56

6-
作業フォルダを作る
7-
------------------------
7+
* Node.jsがインストールされている環境向け
8+
* Denoががインストールされている環境向け
89

9-
ライブラリの時は、ES2015 modulesとCommonJSの2通り準備しましたが、CLIの場合はNode.jsだけ動かせば良いので、出力先もCommonJSだけで十分です
10+
どちらも、TypeScriptをJavaScript変換して1ファイルにまとめたファイルを作成します
1011

11-
.. code-block:: bash
12+
Node.jsの環境構築
13+
===============================
14+
15+
Node.js向けには@zeit/nccを利用します。
16+
17+
@zeit/nccはTypeScriptに最初から対応したコンパイラで、コマンドラインツールやウェブサーバーなどのNode.jsアプリケーションを1ファイルにするために作られています。@zeit/ncc自体も自分自身を使ってバンドル化されており、ごく小さいサイズですばやくインストールできます。Goを参考にしており、\ ``tsconfig.json``\ 以外の設定は不要です。もちろん、
18+
19+
他に実績のあるツールとしてはBrowserifyがあります。これも、tsifyというプラグインと併用することでTypeScript製アプリケーションをバンドルして1ファイルにできます。このツールはメインの目的としてはNode.js製アプリケーションをブラウザでも動くようにするために作られました。後発の@zeit/nccに比べると設定が多いのと、TypeScriptの設定を変えてcommon.js形式のパッケージにしないと扱えないのがnccと比べると煩雑です。また、\ ``tsc``\ を使いバンドルせずにTypeScriptをJavaScriptに変換するだけを行って配布する方法もありますが、バンドルをしないとさまざまなファイルが入ってくるため、配布サイズも大きくなりがちです。
20+
21+
作業フォルダを作る
22+
------------------------
1223

13-
$ mkdir dist # commonJSだけなので1つだけ
24+
フォルダを作成し、JavaScriptのいつものプロジェクトのように\ ``npm init -y``\ を実行して\ ``package.json``\ を作成しましょう。
1425

15-
``.gitignore`` も、出力先フォルダを1つだけに修正しましょう
26+
ライブラリの時は、ES2015 modulesとCommonJSの2通り準備しましたが、CLIの場合はNode.jsだけ動かせば良いので、出力先は一つになります。コンパイルしたファイル置き場は\ ``dist``\ フォルダになりますが、コンパイル時に自動で作られるので作成しておく必要はありませんが、\ ``.gitignore``\ には登録しておきましょう
1627

1728
ビルド設定
1829
---------------------------
1930

20-
Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファイルは入れておきましょう。
31+
まずは@zeit/nccをインストールします。
32+
33+
Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファイルは入れておきましょう。TypeScriptはnccにバンドルされていますが、バンドルされている処理系のバージョンが古いことがあります。インストールしてあるTypeScriptを優先的に使ってくれるので入れておくと良いでしょう。
2134

2235
コマンドラインで良く使うであろうライブラリを追加しておきます。
2336
カラーでのコンソール出力、コマンドライン引数のパーサ、ヘルプメッセージ表示です。
@@ -27,12 +40,15 @@ Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファ
2740

2841
.. code-block:: bash
2942
30-
$ npm install --save cli-color command-line-args
31-
command-line-usage source-map-support
43+
$ npm install --save-dev @zeit/ncc typescript
44+
3245
$ npm install --save-dev @types/node @types/cli-color
3346
@types/command-line-args @types/command-line-usage
3447
@types/source-map-support
3548
49+
$ npm install --save cli-color command-line-args
50+
command-line-usage source-map-support
51+
3652
TypeScriptのビルド設定のポイントは、ブラウザからは使わないので、ターゲットのバージョンを高くできる点にあります。
3753
ローカルでは安定版を使ったとしてもNode.js 10が使えるでしょう。
3854

@@ -73,13 +89,48 @@ TypeScriptのビルド設定のポイントは、ブラウザからは使わな
7389
"awesome-cmd": "dist/index.js"
7490
},
7591
"scripts": {
76-
"build": "tsc --project .",
92+
"build": "ncc build main.ts --minify --v8-cache --source-map",
93+
”watch": "ncc build main.ts --watch",
94+
"start": "ncc run main.ts",
7795
"lint": "eslint .",
7896
"fix": "eslint --fix ."
7997
}
8098
}
8199
82-
テストの設定、VSCodeの設定は変わりません。
100+
``ncc build``\ でビルドします。\ ``ncc run``\ でビルドして即座に実行します。設定ファイルはありません。必要十分な機能が揃っています。オプションで指定できるものは以下の通りです。
101+
102+
* ``--minify``: ミニファイしてファイルを小さくする
103+
* ``--source-map``: ソースマップを出力
104+
* ``-e, --external [mod]``: バンドルをスキップするモジュール
105+
* ``--watch``: 変更を検知してビルド
106+
* ``--v8-cache``: V8のコンパイルキャッシュを生成
107+
108+
テストの設定、VSCodeの設定は他の環境の設定と変わりません。
109+
110+
もし、バイナリを入れる必要のあるライブラリがあると、ビルド時にエラーになります。その場合は、そのパッケージを ``--external パッケージ名`` で指定してバンドルされないようにします。
111+
ただし、この場合は配布環境でこのライブラリだけはnpm installしなければなりません。
112+
113+
.. note::
114+
115+
**Node.js/Deno以外の処理系**
116+
117+
また、low.js [#]_ という、ES5しか動かないもののNode.jsと一部互換性があるモジュールを提供し、ファイルサイズがごく小さいインタプリタがありますが、これと一緒に使うこともできます。
118+
119+
low.jsはES5までしか対応しないため、出力ターゲットをES5にする必要があります。
120+
121+
.. code-block:: json
122+
:caption: tsconfig.json (low.jsを使う場合)
123+
124+
{
125+
"compilerOptions": {
126+
"target": "es5", // もしlow.jsを使うなら
127+
"lib": ["dom", "es2017"] // もしlow.jsで新しいクラスなどを使うなら
128+
}
129+
}
130+
131+
これで、TypeScript製かつ、必要なライブラリが全部バンドルされたシングルファイルなスクリプトができあがります。
132+
133+
.. [#] https://www.lowjs.org/
83134
84135
CLIツールのソースコード
85136
-----------------------------------
@@ -106,59 +157,9 @@ TypeScriptはシェバング(#!)があると特別扱いしてくれます。
106157
107158
main();
108159
109-
バンドラーで1つにまとめる
110-
-------------------------------
111-
112-
npmで配るだけであればバンドルは不要ですが、ちょっとしたスクリプトをTypeScriptで書いてDockerサーバーで実行したいが、コンテナを小さくしたいのでnode_modulesは入れたくないということは今後増えていくと思いますので、そちらの方法も紹介します。
113-
また、low.js [#]_ という、ES5しか動かないもののNode.jsと一部互換性があるモジュールを提供し、ファイルサイズがごく小さいインタプリタがありますが、これと一緒に使うこともできます。
114-
115-
バンドラーでは一番使われているのは間違いなくwebpackですが、昔ながらのBrowserifyは設定ファイルレスで、ちょっとした小物のビルドには便利です。BrowserifyはNode.jsのCommonJS形式のコードをバンドルしつつ、Node.js固有のパッケージは互換ライブラリを代わりに利用するようにして、Node.jsのコードをそのままブラウザで使えるようにするものです。オプションでNode.jsの互換ライブラリを使わないようにもできます。
116160
117-
webpackでもちょっと設定ファイルを書けばいけるはずですが、TypeScript対応以外に、shebang対応とかは別のプラグインが必要だったり、ちょっと手間はかかります。
118-
119-
Browserifyをインストールします。tsifyはBrowserifyプラグインで、TypeScriptのコードを変換します。
120-
バンドルしてしまうので、バイナリのインストールが必要なパッケージ以外の各種ライブラリはすべて--save-devで入れても大丈夫です。
121-
122-
.. code-block:: bash
123-
124-
$ npm install --save-dev browserify tsify
125-
126-
``tsconfig.json`` に関してはそのままで問題ありません。この手のバンドラーから使われる時は、.tsと.jsの1:1変換ではなくて、複数の.tsをメモリ上で.jsに変換し、そのあとにまとめて1ファイルにするn:1変換になります。そのため、個別の変換ファイルを出力しないnoEmit: trueをつけたりdistDirを消したりする必要がありますが、そのあたりはtsifyが勝手にやってくれます。
127-
128-
ただし、ES5しか動作しないlow.jsを使う場合は、出力ターゲットをES5にする必要があります。
129-
130-
.. code-block:: json
131-
:caption: tsconfig.json (low.jsを使う場合)
132-
133-
{
134-
"compilerOptions": {
135-
"target": "es5", // もしlow.jsを使うなら
136-
"lib": ["dom", "es2017"] // もしlow.jsで新しいクラスなどを使うなら
137-
}
138-
}
139-
140-
ビルドスクリプトは次の形式になります。
141-
``--node`` をつけないと、ブラウザ用のコードを生成しますが、ファイル入出力などが使えなくなりますので、CLIでは ``--node`` を忘れずにつけます。
142-
TypeScript変換のために、 ``-p`` で ``tsify`` を追加しています。
143-
もしminifyとかしたくなったら、minifyifyなどの別のプラグインを利用します。
144-
145-
.. code-block:: json
146-
147-
{
148-
"scripts": {
149-
"build": "browserify --node -o dist/script.js -p [ tsify -p . ] src/index.ts"
150-
}
151-
}
152-
153-
もし、バイナリを入れる必要のあるライブラリがあると、Browserifyがエラーになります。その場合は、そのパッケージを ``--exclude パッケージ名`` で指定してバンドルされないようにします。
154-
ただし、この場合は配布環境でこのライブラリだけはnpm installしなければなりません。
155-
156-
これで、TypeScript製かつ、必要なライブラリが全部バンドルされたシングルファイルなスクリプトができあがります。
157-
158-
.. [#] https://www.lowjs.org/
159-
160-
まとめ
161-
--------------
161+
Node.jsのまとめ
162+
-------------------
162163

163164
コマンドラインツールの場合は、npmで配布する場合はライブラリ同様、バンドラーを使わずに、TypeScriptだけを使えば大丈夫です。
164165
ここにある設定で、次のようなことが達成できました。
@@ -173,6 +174,9 @@ npmコマンドを使って行うことができます。すべてライブラ
173174

174175
.. code-block:: bash
175176
177+
# ビルドして実行
178+
$ npm start
179+
176180
# ビルドしてパッケージを作成
177181
$ npm run build
178182
$ npm pack
@@ -186,3 +190,12 @@ npmコマンドを使って行うことができます。すべてライブラ
186190
# フォーマッター実行
187191
$ npm run fix
188192
193+
Deno
194+
============
195+
196+
Denoは新しい処理系です。Node.jsと同じくV8をベースとしている兄弟処理系ですが、TypeScriptにデフォルトで対応していたり、ネイティブコード部分はRustを使って実装されています。
197+
サードパーティのパッケージはnpmコマンドではなくdenoコマンドを使ってダウンロードします。
198+
199+
Node.jsを置き換えるものかというと、現時点ではまだパッケージやツールが足りていません。特にNode.jsのnpmはウェブフロントエンドのライブラリなどの配布にも使われており、ウェブフロントエンドの開発のためのプラットフォームとしても活用されています。Denoはコマンドラインツールやウェブサービスの開発に特化しています。
200+
201+
こちらもGoを参考にしたコマンドを持っています。それ単体でビルドして配布できます。

0 commit comments

Comments
 (0)