JavaScript >> Javascript 文檔 >  >> JavaScript

您可能不知道的有用節點包

簡介

你們中的一些 Node 老手可能以前聽說過其中一些包,但我希望從這篇文章中你會發現一些你從未聽說過的真正有用的包,就像我一樣。我傾向於忘記那裡有這麼多包,所以我做了一些探索並玩了一些。這些是我最喜歡的一些。

yargs

yargs 包簡單直接,它將使您不必在所有項目中編寫樣板代碼。它為您處理命令行參數,因此用戶可以設置標誌並輸入任何類型的數據,包括布爾值、浮點數和字符串。

yargs 甚至會處理您的“使用”輸出,因此您可以輕鬆地告訴用戶您的程序採用哪些選項,包括哪些選項是必需的。

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));

因此,使用上面的代碼,如果我們嘗試僅使用 node 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 將通知您,使您能夠向客戶端返回 HTTP 503“服務不可用”代碼。

這很重要,因為您的服務器越忙,等待時間就越長。這很快就會成為一個複雜的問題,隨著時間的推移只會變得更糟。如果您什麼都不做,該服務將為所有人關閉(又名崩潰)。但是,如果您提前停止處理以返回 HTTP 503,那麼至少會處理一些請求。有總比沒有好,對吧?

您可以使用 toobusy 通過安裝它:

npm install toobusy

然後將其與 Express 之類的東西集成,如下所示:

var toobusy = require('toobusy'),
    express = require('express');
    
var app = express();
    
// Block requests if we get too busy 
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();	// Allow us to exit normally

	process.exit();
});

它真的不需要那麼多代碼,甚至更少的配置,所以你可以很容易地把它打包成一個很好的中間件,並將它包含在你所有的 Express 項目中。只要確保您沒有切斷任何具有高優先級的關鍵請求或包含關鍵數據的請求。

粉筆

喜歡 toobusy ,我並沒有真正意識到chalk的用處 直到我真的花了一些時間來思考它以及我在哪裡看到它使用過。命令行上的用戶界面很難創建,因為您與用戶交互的只是一個用於顯示文本的窗口和一個單一的文本輸入。那麼如何讓重要信息脫穎而出呢?最好的方法之一是為您的文本添加格式。 Express 就是一個很好的例子。從他們的輸出中,您可以輕鬆地立即找到最重要的信息,因此您永遠不會錯過任何重要的信息。

這是 chalk 的所有不同類型樣式的完整列表 支持:

修飾符
  • bold
  • underline
  • dim
  • reset
  • hidden
  • inverse
  • italic (並非所有地方都支持)
  • strikethrough (並非所有地方都支持)
顏色
  • red
  • black
  • green
  • white
  • yellow
  • blue (在 Windows 上使用較亮的版本,因為正常的藍色難以辨認)
  • cyan
  • gray
  • magenta
背景顏色
  • 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 的忠實粉絲。該調試器通過向您展示一個網頁 GUI 來調試您的代碼。它具有標準調試器的所有功能,如斷點、代碼的單步執行和變量檢查。它還具有一些非常有用的不常見功能,例如 CPU 和堆分析、網絡客戶端請求檢查以及實時編輯運行代碼的能力。最後一個功能是我最喜歡的功能之一,因為它可以為您節省大量時間。

請注意,Node Inspector 僅與 Chrome 和 Opera 兼容,因為它使用 Blink 開發工具,這是您看到的 JavaScript 調試器界面,並且與 Node 兼容。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

很長一段時間以來,我非常依賴使用控制台來輸出我的調試信息,這最終花費了大量時間來添加、編輯和刪除我的調試語句。使用 GUI 確實為我節省了數小時的調試時間。現在,調試器已經不是什麼新鮮事了,但有些比其他的更難使用,這是一個很好的選擇。

終端工具包

如果您的 Node 應用程序使用命令行而不是一些簡單的文本輸入/輸出,那麼您可能應該使用終端工具包。 terminal-kit 簡化了與用戶交互的許多方面,因此您可以專注於構建應用程序中的重要內容。 terminal-kit 所做的一些事情是:

  • 文本樣式(很像 chalk )
  • 編輯屏幕
  • 進度條
  • 用戶輸入

有很多用例適用於終端套件。例如,如果你從互聯網上下載了一些東西,那麼向用戶顯示一個進度條會很有幫助,這樣他們就知道應用程序並沒有停止。要顯示一個虛擬進度條,您只需執行以下操作:

var terminal = require( 'terminal-kit' ).terminal;

var progressBar;
var progress = 0;

function updateProgress() {
    // Add random progress
    progress += Math.random() / 10;
    progressBar.update(progress);
    
    // Check if we're done
    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();

上面的代碼會產生類似這樣的東西,取自終端工具包自述文件:

驗證器

validator 軟件包有助於進行一系列常見的字符串驗證(如電子郵件地址、信用卡、IP 地址等)。每當您從用戶那裡獲得輸入時,這樣的包都是必不可少的。你幾乎可以認為你的用戶是你產品的最大威脅。他們會犯錯誤並在文本框中輸入一些非常奇怪的東西,因此您需要一個經過驗證的包來為您驗證輸入並避免數據損壞或服務器崩潰。

一些最有用的驗證器是:

  • isEmail(str [, options])
  • isIP(str [, version])
  • isMobilePhone(str, locale)
  • isURL(str [, options])

validator 還具有消毒劑,可以規範化、刪除或轉義您的輸入字符串。例如,您可能想要清理用戶的評論以避免他們輸入惡意 HTML/JavaScript。這是最常見的用例之一,因為攻擊者很容易創建一個機器人來為他們在數千個站點上測試這種攻擊。

validator 提供的一些有用的消毒劑 分別是:

  • blacklist(input, chars)
  • escape(input)
  • normalizeEmail(email [, options])
  • whitelist(input, chars)

normalizeEmail() 方法是一個有趣的方法。它將確保電子郵件地址是小寫的,它甚至會從 GMail 地址的用戶名中刪除被忽略的字符。所以,如果你有電子郵件 [email protected] , normalizeEmail() 將其規範化為 [email protected] 因為 GMail 會忽略點 (. ) 和標籤。

強大

我過去處理過的最困難的任務之一是處理文件上傳,這就是 formidable 的原因 列了名單。 formidable 處理上傳的每個部分,包括多部分解析器、將文件寫入磁盤和錯誤處理。儘管許多 web 應用程序不允許用戶上傳巨大的圖像和視頻,但許多 web 應用程序確實允許使用個人資料圖片,這意味著您必須處理接收圖像、驗證它並將其寫入磁盤,這可能不是一件容易的事,具體取決於關於你的約束。

這是我非常喜歡的軟件包之一,因為我真的不想重新發明輪子。它只做一項工作,而且做得非常好。

這是一個使用 formidable 的示例 僅使用一個普通的 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 是一個包,可讓您在任何系統上使用通用 Unix 命令,無論是 Windows、Linux 還是 Mac。這樣你就不需要同時編寫 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/batch 腳本中一樣運行本機命令:

if (exec('git commit -am "Release commit"').code !== 0) {
  echo('Error: Git commit failed!');
  exit(1);
}

結論

希望您從本文中找到一些您從未聽說過的有用工具,或者可能意識到其中一些軟件包的有用性。快速搜索或只是瀏覽一些開源項目可能會產生一些好的發現,所以請睜大眼睛。 npmjs.com 上有 190,000 多個(截至 2015 年 10 月 1 日)包,所以你要找的可能都在那裡。

你最喜歡的“未知”包是什麼?請在評論中告訴我們!


Tutorial JavaScript 教程
  1. 如何在 azure 搜索建議器上使用 select

  2. 防止在子元素上觸發點擊事件

  3. 哪些瀏覽器支持 <script async=async />?

  4. 自動注入 Vue 路由路由

  5. 反饋1:保持簡單

  6. 大 O 符號

  7. 使用 Jasmine、Travis 和 Karma 測試 JavaScript

  1. 將復雜的 JavaScript 對象轉換為點符號對象

  2. 打字稿。她很狡猾,只是我的類型......腳本。分解 tsconfig

  3. Node.js 設計模式和常見用例

  4. 你無法解決的最簡單的問題。

  5. JavaScript / TypeScript 中的分號:優點和缺點

  6. 重新設計我的投資組合......使用 Angular? 🤔

  7. 是否可以在同一個文件中訪問其他模塊導出功能?

  1. 如何使用 Next.js 處理 JWT 和 Http-Only Cookies 身份驗證

  2. 如何使用 React、Spotify 和 Fauna 構建音樂播放列表

  3. 介紹一款免費且全面的加密和解密開源工具 - EncryptLab - EN

  4. 我試圖用 30 個字用 Javascript 解釋一切。