1
- CLIツール作成のための環境設定
2
- =========================================
1
+ ===============================================
2
+ CLIツール・ウェブサーバー作成のための環境設定
3
+ ===============================================
3
4
4
- TypeScriptを使ってNode.jsのためのCLIツールを作成するための環境構築方法を紹介していきます 。
5
+ TypeScriptを使ってCLIツールやウェブサーバーなどのNode.jsやDenoがある環境で動作するソフトウェアを作成するための環境構築方法を紹介していきます。2つ方法があります 。
5
6
6
- 作業フォルダを作る
7
- ------------------------
7
+ * Node.jsがインストールされている環境向け
8
+ * Denoががインストールされている環境向け
8
9
9
- ライブラリの時は、ES2015 modulesとCommonJSの2通り準備しましたが、CLIの場合はNode.jsだけ動かせば良いので、出力先もCommonJSだけで十分です 。
10
+ どちらも、TypeScriptをJavaScript変換して1ファイルにまとめたファイルを作成します 。
10
11
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
+ ------------------------
12
23
13
- $ mkdir dist # commonJSだけなので1つだけ
24
+ フォルダを作成し、JavaScriptのいつものプロジェクトのように \ `` npm init -y `` \ を実行して \ `` package.json `` \ を作成しましょう。
14
25
15
- ` ` .gitignore` ` も、出力先フォルダを1つだけに修正しましょう 。
26
+ ライブラリの時は、ES2015 modulesとCommonJSの2通り準備しましたが、CLIの場合はNode.jsだけ動かせば良いので、出力先は一つになります。コンパイルしたファイル置き場は \ `` dist `` \ フォルダになりますが、コンパイル時に自動で作られるので作成しておく必要はありませんが、 \ `` .gitignore ``\ には登録しておきましょう 。
16
27
17
28
ビルド設定
18
29
---------------------------
19
30
20
- Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファイルは入れておきましょう。
31
+ まずは@zeit/nccをインストールします。
32
+
33
+ Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファイルは入れておきましょう。TypeScriptはnccにバンドルされていますが、バンドルされている処理系のバージョンが古いことがあります。インストールしてあるTypeScriptを優先的に使ってくれるので入れておくと良いでしょう。
21
34
22
35
コマンドラインで良く使うであろうライブラリを追加しておきます。
23
36
カラーでのコンソール出力、コマンドライン引数のパーサ、ヘルプメッセージ表示です。
@@ -27,12 +40,15 @@ Node.jsの機能を使うことになるため、Node.jsのAPIの型定義ファ
27
40
28
41
.. code-block :: bash
29
42
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
+
32
45
$ npm install --save-dev @types/node @types/cli-color
33
46
@types/command-line-args @types/command-line-usage
34
47
@types/source-map-support
35
48
49
+ $ npm install --save cli-color command-line-args
50
+ command-line-usage source-map-support
51
+
36
52
TypeScriptのビルド設定のポイントは、ブラウザからは使わないので、ターゲットのバージョンを高くできる点にあります。
37
53
ローカルでは安定版を使ったとしてもNode.js 10が使えるでしょう。
38
54
@@ -73,13 +89,48 @@ TypeScriptのビルド設定のポイントは、ブラウザからは使わな
73
89
"awesome-cmd" : " dist/index.js"
74
90
},
75
91
"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" ,
77
95
"lint" : " eslint ." ,
78
96
"fix" : " eslint --fix ."
79
97
}
80
98
}
81
99
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/
83
134
84
135
CLIツールのソースコード
85
136
-----------------------------------
@@ -106,59 +157,9 @@ TypeScriptはシェバング(#!)があると特別扱いしてくれます。
106
157
107
158
main();
108
159
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の互換ライブラリを使わないようにもできます。
116
160
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
+ -------------------
162
163
163
164
コマンドラインツールの場合は、npmで配布する場合はライブラリ同様、バンドラーを使わずに、TypeScriptだけを使えば大丈夫です。
164
165
ここにある設定で、次のようなことが達成できました。
@@ -173,6 +174,9 @@ npmコマンドを使って行うことができます。すべてライブラ
173
174
174
175
.. code-block :: bash
175
176
177
+ # ビルドして実行
178
+ $ npm start
179
+
176
180
# ビルドしてパッケージを作成
177
181
$ npm run build
178
182
$ npm pack
@@ -186,3 +190,12 @@ npmコマンドを使って行うことができます。すべてライブラ
186
190
# フォーマッター実行
187
191
$ npm run fix
188
192
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