小さいながらも便利なNode.jsパッケージ
フロントエンドパイオニア
yargs
yargsは、コマンドラインパラメータを処理するためのパッケージです。これは、自分で設定したコマンドラインフラグや、ブール値、浮動小数点数、文字列など、あらゆる種類の入力データを処理するのに役立ちます。このパッケージは非常にシンプルで明確であり、プロジェクトに多くの定型コードを記述していません。
Yargsは、「usage help」出力の処理に役立ち、プログラムの使用時に入力する必要のあるオプション(必要なオプションなど)をユーザーに簡単に伝えることができます。
var argv = require('yargs')
.usage('Usage: $0 -x [num] -y [num]')
.demand(['x','y'])
.argv;
console.log('Pow(x, y):', Math.pow(argv.x, argv.y));
上記のコードをindex.jsとして保存し、コマンドラインでノードindex.js -x 3を実行すると、次のメッセージが表示されます。
Usage: index.js -x [num] -y [num]
Options:
-x [required]
-y [required]
Missing required argument: y
yargsは、コマンドラインから欠落しているパラメーターを教えてくれます。必要なのは、.usage()メソッドと.demand()メソッドを呼び出すだけです。
あまりにも忙しい
これは非常に実用的なパッケージです。Nodeイベントループをポーリングし、リクエストの完了に必要な時間を追跡します。遅延時間が長すぎることが判明した場合、toobusyが通知し、HTTP503の「ServiceUnavailable」ステータスコードをクライアントに返すことができます。
サーバーがビジー状態になるほど、リクエストの待機時間が長くなるため、この処理は非常に重要です。これはすぐに非常に複雑な問題になり、時間が経つにつれてますます深刻になります。そのままにしておくとサービスが崩壊します。一部のリクエストの処理を時間内に停止してHTTP503を返すことができれば、少なくとも一部のリクエストを処理できます。
npmコマンドを使用すると、toobusyを簡単にインストールできます。
npm install toobusy
次に、Expressのようなものと統合します。
var toobusy = require('toobusy'),
express = require('express');
var app = express();
// 如果服务器压力过大将会阻止请求
app.use(function(req, res, next) {
if (toobusy()) {
res.send(503, "Too many users!");
} else {
next();
}
});
var server = app.listen(3000);
process.on('SIGINT', function() {
server.close();
toobusy.shutdown(); // 正常退出
process.exit();
});
独自のプロジェクトに継承するために、多くのコードや構成を記述する必要はありません。
チョーク
コマンドラインウィンドウのみがユーザーとの対話に使用されるため、コマンドラインで便利なユーザーインターフェイスを開発することは困難です。では、どのようにしていくつかの重要な情報を促しますか?これは、出力テキストに書式を追加するための良い方法です。Expressは典型的な例であり、その出力から、重要な情報をすばやく簡単に見つけることができます。
以下は、chalkでサポートされているスタイルのリストです。
</>修飾子
- 大胆な
- 下線を引く
- 薄暗い
- リセット
- 隠された
- 逆
- イタリック(すべての環境でサポートされているわけではありません)
- 取り消し線(どの環境でもサポートされていません)
</>色
- 赤
- 黒
- 緑
- 白い
- 黄
- 青(通常の青は認識が難しいため、Windowsでは明るいバージョンが使用されます)
- シアン
- グレー
- 赤紫色
</>背景色
- bgBlue
- bgBlack
- bgRed
- bgGreen
- bgCyan
- bgYellow
- bgWhite
- bgMagentaは
公式にはこれらの色のみをサポートしていますが、xterm標準に準拠する端末はすべて完全な8ビットカラーコードを使用できます。
文字列を色付けまたはフォーマットに使用される関数に渡すことにより、テキストを簡単にフォーマットできます。ユーザーに重大なエラーメッセージを通知する必要がある場合は、次の形式を使用できます。
var chalk = require('chalk');
var str = chalk.red.bold('ERROR: ') + chalk.bold('Everything just blew up...');
console.log(str);
ノードインスペクター
便利なデバッガー、特に便利なGUIを備えたデバッガーを見つけるのは困難です。Node-inspectorは、コードのデバッグに役立つWebGUIを提供します。ブレークポイント、シングルステップ実行、終了コード、変数チェックなど、標準デバッガーのすべての機能を備えています。あまり一般的に使用されない機能もいくつかありますが、これらの機能はCPUやヒープ分析などの非常に便利です。ネットワーククライアントリクエスト実行中のコードをリアルタイムでチェックおよび編集する機能。
node-inspector
ただし、node-inspectorは、Blink Developer Toolsを使用し、Nodeと互換性があるため、ChromeとOperaとのみ互換性があります。
私は常にデバッグのためにコンソール出力に大きく依存してきましたが、これには多くの時間がかかります。GUIを使用すると、デバッグ時間を大幅に節約できます。
ターミナルキット
Nodeプログラムが、コマンドラインでの単純なテキスト入力と出力以外の他の操作をサポートする必要がある場合は、terminal-kitが必要です。terminal-kitは、ユーザーと対話する多くのことを簡素化し、プログラム内の重要なコンテンツの開発に集中できるようにします。ターミナルキットの主な機能は次のとおりです。
- テキストスタイル(チョークによく似ています)
- 編集画面
- プログレスバー
ターミナルツールキットに適したユーザー入力の例はたくさんあります。たとえば、インターネットからコンテンツをダウンロードする必要がある場合は、ユーザーにプログレスバーを表示する必要があります。次のコードは、仮想プログレスバーを表示するために使用されます。
var terminal = require( 'terminal-kit' ).terminal;
var progressBar;
var progress = 0;
function updateProgress() {
// 产生一个随机的进度值
progress += Math.random() / 10;
progressBar.update(progress);
// 检查是否完成
if (progress >= 1) {
setTimeout(function() {
terminal('\n');
process.exit();
}, 250);
}
else {
setTimeout(updateProgress, 100 + Math.random() * 500);
}
}
progressBar = terminal.progressBar({
width: 80,
title: 'Downloading file:',
eta: true,
percent: true
});
updateProgress();
上記のコードは、次の効果を生み出します。
ターミナルキットプログレスバー
バリデーター
バリデーターは、一連の一般的な文字列検証(たとえば、電子メールアドレス、電話番号、IPアドレスなど)の実行に役立ちます。ユーザーからの入力を受け取るときはいつでも、そのようなパッケージは不可欠です。ユーザーは間違いを犯し、テキストボックスに非常に奇妙なことを入力するため、データの破損やサーバーのクラッシュを回避するために、入力を確認するパッケージが必要です。
一般的に使用されるバリデーターは次のとおりです。
- isEmail(str [、options])
- isIP(str [、バージョン])
- isMobilePhone(str、local)
- isURL(str [、options])
バリデーターは、入力文字列を正規化、削除、またはエスケープできる検出器も提供します。たとえば、ユーザーが送信したコンテンツをクリーンアップして、ユーザーが悪意のあるHTMLまたはJavaScriptコードを入力しないようにします。
一般的に使用される検出器は次のとおりです。
- ブラックリスト(入力、文字)
- エスケープ(入力)
- normalizeEmail(email [、options])
- whitelist(input、chars)
normalizeEmail()メソッドは、電子メールアドレスがすべて小文字であることを保証し、無視する必要のある文字を削除することさえできます。電子メール[email protected]があるとすると、normalizeEmail()はそれを[email protected]に正規化します。
手ごわい
formidableは、マルチパートパーサー、ディスクへのファイルの書き込み、エラー処理など、ファイルアップロードのすべてのステップを処理するのに役立ちます。これは私のお気に入りのバッグの1つです。車輪の再発明をしたくない場合は、試してみてください。
以下は、通常のHTTPサーバーで手ごわいものを使用する例です。コードは、パッケージ自体に含まれている例から変更されています。
var http = require('http');
var util = require('util');
var formidable = require('formidable');
var path = require('path');
var PORT = 8080;
var root = path.join(__dirname, '../');
exports.dir = {
root : root,
lib : root + '/lib',
fixture : root + '/test/fixture',
tmp : root + '/test/tmp',
};
var server = http.createServer(function(req, res) {
if (req.url == '/') {
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/post" method="post">' +
'<input type="text" name="title"><br>' +
'<input type="text" name="data[foo][]"><br>' +
'<input type="submit" value="Submit">' +
'</form>'
);
} else if (req.url == '/post') {
var form = new formidable.IncomingForm(),
fields = [];
form
.on('error', function(err) {
res.writeHead(200, {'content-type': 'text/plain'});
res.end('error:\n\n' + util.inspect(err));
})
.on('field', function(field, value) {
console.log(field, value);
fields.push([field, value]);
})
.on('end', function() {
console.log('-> post done');
res.writeHead(200, {'content-type': 'text/plain'});
res.end('received fields:\n\n ' + util.inspect(fields));
});
form.parse(req);
} else {
res.writeHead(404, {'content-type': 'text/plain'});
res.end('404');
}
});
server.listen(PORT);
console.log('listening on http://localhost:' + PORT + '/');
shelljs
shelljsは、Windows、Linux、Macを問わず、あらゆるシステムで一般的なUnixコマンドを使用できるようにするパッケージです。これにより、プロジェクト用に個別のbashスクリプトとバッチスクリプトを作成する必要がなくなります。shelljsはUnixライクな環境を提供します。テストを実行したり、コードを送信したり、サーバーで起動したりするためのスクリプトを作成する必要がある場合は、一度だけ作成する必要があります。
次のコマンドを使用して、同様の操作を実行できます。
require('shelljs/global');
ls('*.js').forEach(function(file) {
sed('-i', 'BUILD_VERSION', 'v2.0.3', file);
sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
sed('-i', /.*REPLACE_THIS_LINE.*\n/, cat('macro.js'), file);
});
一般的なコマンドを実行します。
require('shelljs/global');
mkdir('-p', 'release/data');
cp('-R', 'data/*', 'release/data');
利用可能なバイナリを確認します。
require('shelljs/global');
if (!which('git')) {
echo('This script requires git!');
exit(1);
}
bashスクリプトのようにコマンドを実行することもできます。
if (exec('git commit -am "Release commit"').code !== 0) {
echo('Error: Git commit failed!');
exit(1);
}
便利なパッケージを知っていますか?コメント欄にメッセージを残してください。