使用 Node.js 應該停止做的七件事
受到 Burke Holland 的 jQuery 你應該停止做的 5 件事的啟發,我決定開始討論並強調你應該立即停止使用 Node.js 做的 7 件事:
- 停止使用回調
- 停止使用
*
對於版本 - 停止使用
console.log
用於調試 - 停止使用
GET
和POST
適合一切 - 停止使用分號
- 停止使用逗號優先樣式
- 停止使用默認的
maxSockets
限制您的連接 價值
停止在 Node.js 中使用回調
回調是 JavaScript/Node.js 語言和主要模式的麵包和黃油(或古生活方式讀者的肉類和蔬菜)。但是,你應該停止使用回調來嵌套多個方法的代碼,除非你想以回調地獄告終。
異步是為了勝利。特別是它的 series()
和 waterfall()
方法。
為了說明巨大的差異,這裡是一個我們執行多個操作的示例使用回調 查找用戶,然後查找屬於該用戶的帖子:
codeA(function(a){
codeB(function(b){
codeC(function(c){
codeD(function(d){
// Final callback code
})
})
})
})
series
例子:
async.series([
function(callback){
// code a
callback(null, 'a')
},
function(callback){
// code b
callback(null, 'b')
},
function(callback){
// code c
callback(null, 'c')
},
function(callback){
// code d
callback(null, 'd')
}],
// optional callback
function(err, results){
// results is ['a', 'b', 'c', 'd']
// final callback code
}
)
waterfall
例子:
async.waterfall([
function(callback){
// code a
callback(null, 'a', 'b')
},
function(arg1, arg2, callback){
// arg1 is equals 'a' and arg2 is 'b'
// Code c
callback(null, 'c')
},
function(arg1, callback){
// arg1 is 'c'
// code d
callback(null, 'd');
}], function (err, result) {
// result is 'd'
}
)
停止使用通配符*
對於帶有 Node.js 的版本
通配符 *
而不是 package.json
中的版本號 似乎是個好主意——在不久的將來自動更新。錯誤的!您應該使用準確的版本號來防止任何第三方模塊更改破壞您的應用程序並在半夜吵醒您想知道發生了什麼。
如果您不提交 node_modules
,則尤其如此 文件夾或不使用收縮包裝。
HackHall package.json
的一個壞例子 大約在 2013 年夏天:
{
"name": "hackhall",
"version": "0.0.1",
"private": true,
"main": "server",
"scripts": {
"start": "node server"
},
"dependencies": {
"express": ">=2.2.0",
"jade": "*",
"mongodb": "*",
"mongoose":"",
"oauth":"*"
},
"devDependencies":{
"mocha": "",
"superagent":""
},
"engines": {
"node": ">=0.6"
}
}
來自 Practical Node.js 書籍 [2014, Apress] 的一個很好的例子:
{
"name": "blog-express",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js",
"test": "mocha test"
},
"dependencies": {
"express": "3.4.5",
"jade": "0.35.0",
"mongoskin": "~0.6.1",
"stylus": "~0.40.3",
"mocha": "1.16.2",
"superagent": "0.15.7",
"expect.js": "0.2.0"
}
}
如果不想每次都去npm官網查看版本,可以使用$ npm install package_name --save
這會將版本號保存在 package.json 中。
如果模塊已經安裝,你可以:
- 輸入
$ npm ls
- 打開包文件夾,複製版本號形式
package.json
停止使用 console.log
用於調試 Node.js 應用程序
什麼是最好的調試器?對,是console.log
!它快速、不間斷,並為我們提供了我們要求的任何信息(比如討厭的變量的值)。那你為什麼要停止使用它呢?因為像 Node Inspector 這樣的真正調試器不僅提供了您剛剛硬編碼的變量的值,而且還為您提供了在進程內部環顧四周的動態能力。
[旁注]
閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。
許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!
去看看 Node University,它有關於 Node 的免費視頻課程:node.university。
[旁注結束]
例如,我可能有一個不正確的條件(其中 resubmit 是一個布爾值):
if (resubmit && post.published && user.plan.paid && post.isVisible) {
// code A
} else {
// code B
}
使用 console.log
我只能輸入 console.log(resubmit)
, 或 console.log(resubmit, ...)
其他一些變量。但是,使用調試器,我可以四處尋找並打印我在該範圍內可以訪問的任何內容。如果這還不夠,我將跳過或跨入代碼 A 或 B,如示例所示。
停止使用 GET
和 POST
適用於 Node.js 服務器中的所有內容
停止使用 GET
和 POST
對於所有傳入的 HTTP 請求。具象狀態轉移應用程序編程接口方法(RESTful API)有 PUT
和 DELETE
所以使用它們進行更新和刪除 (維基)。
例如在這個 Express.js 路由中,您可以使用 PUT,而不是使用 POST 來更新記錄:
app.post('/comments/update/:id', routes.comments.update)
app.put('/comments/:id', routes.comments.update)
如需更多信息,請查看 REST API 教程。
停止在 Node.js 中使用分號
分號實際上是可選的,因為 ECMAScript(Node.js 和瀏覽器 JavaScript 實現的標準)具有自動分號插入功能 (ASI)。這是關於 ASI 的 ECMAScript 6 (ES6) 文檔的草稿。
要點是 分號是可選的 並且除了兩種情況:在 IIFE 前面和 for
內部 循環。
使用分號的問題:
- 要輸入的額外字符: 在一個 1000 行的文件中,至少會有 1000 個額外的符號
- 不一致: 當由於疏忽而遺漏分號時,代碼庫仍然可以工作,但會變得不一致(可以通過 linting 解決,但這是一個額外的構建步驟)
一些流行的 Node.js 項目是用無分號風格編寫的:
- NPM:Node.js 包管理器
- Request:用於發出 HTTP 請求的模塊
你是否還在懷疑,因為 Doug Crockford 告訴你必須使用分號?那麼也許你應該閱讀一封致 JavaScript 領導者的關於分號的公開信。
停止使用逗號優先樣式
好的,這個話題非常主觀,可能並不那麼重要,但我想表達我對逗號優先風格的不喜歡。請停止瘋狂!
當人們可能在行的開頭而不是結尾用逗號編寫數組和對象時,經常會看到有問題的樣式。例如,我們可以定義一個數組:
var arr = [ 'nodejs'
, 'python'
, 'ruby'
, 'php'
, 'java'
]
或者以更傳統的風格,它看起來像這樣:
var arr = [ 'nodejs',
'python',
'ruby',
'php',
'java'
]
請不要做前者。我不在乎捕捉丟失的逗號會好多少。逗號優先的風格看起來很荒謬,因為我們永遠不會在我們的正常語言寫作中使用這種風格。沒有人這樣寫:
Paleo lifestyle is good for ,adult men ,adult women ,children ,and elderly people.
在我看來,逗號優先的風格很難讓大腦適應,而且很傻。
停止使用默認 MaxSockets 值限制您的連接
默認 maxSockets
值為 5,它決定了每台主機的套接字數量限制(官方文檔)。
為避免系統出現瓶頸,只需使用以下內容:
var http = require('http')
http.globalAgent.maxSockets = 10
或者,如果你想讓它無限:
require('http').globalAgent.maxSockets = Infinity
這裡有一篇很好的對比文章 Node.js Connection Pooling。
另一種方法是一起禁用池(agent: false
) 就像 LinkedIn 所做的或 Substack 在他的超任務模塊中推薦的那樣。
關於停止使用 Node.js 做的事情的結論
當然,你應該立即停止使用 Node.js 做的這七件事的清單是主觀的,但它源於仔細和持續的觀察,以及一些痛苦的現實經驗(即 *
在 package.json
)。您列出的與 Node.js 無關的事項有哪些?