有一種 left-pad 事件,不過它只影響了依賴公共注冊表的項目,并在 11 分鐘之后重新發(fā)布。最小化所帶來的益處遠大于其缺點。而且,npm 已經(jīng)修改了它的發(fā)布策略,任何重要的項目都應(yīng)該使用緩存或私有注冊中心(作為臨時解決方案)。

使用異步代碼
同步代碼確實在 Node 中有一個(低的)位置。 它主要用于編寫 CLI 命令或與 Web 應(yīng)用程序無關(guān)的其他腳本。Node 開發(fā)者主要構(gòu)建 Web 應(yīng)用程序,因此他們使用異步代碼,以避免阻塞線程。
例如,如果我們只是構(gòu)建數(shù)據(jù)庫腳本,而不是用來處理并發(fā)/并行任務(wù)的系統(tǒng),這樣就行了:
let data = fs.readFileSync('./acconts.json')db.collection('accounts').insert(data, (results))=>{ fs.writeFileSync('./accountIDs.json', results, ()=>{process.exit(1)})})
但是在構(gòu)建 Web 應(yīng)用時下面寫法會更佳:
app.use('/seed/:name', (req, res) => { let data = fs.readFile(`./${req.params.name}.json`, ()=>{ db.collection(req.params.name).insert(data, (results))=>{ fs.writeFile(`./${req.params.name}IDs.json`, results, ()={res.status(201).send()}) }) })})
區(qū)別在于你是否在寫并發(fā)(通常是長時間運行)還是非并發(fā)(短時間運行)的系統(tǒng)。 根據(jù)經(jīng)驗,我們總是在 Node 中使用異步代碼。

避免阻塞請求
Node 有一個簡單的模塊加載系統(tǒng),使用 CommonJS 模塊規(guī)范。它內(nèi)建的 require 函數(shù)很容易把另外單獨存放的的模塊包含進來。與 AMD/requirejs 不同,Node/CommonJS 采用同步的方式加載模塊。require工作方式是:導(dǎo)入在模塊或文件中導(dǎo)出的內(nèi)容。
const react = require('react')
大多數(shù)開發(fā)知道 require 有緩存。因此,只要解析出來的文件名沒什么變化(在 npm 模塊中是沒有的),模塊中的代碼會只執(zhí)行一次并將結(jié)果保存在一個變量中(同一進程內(nèi))。這個優(yōu)化非常棒。然而,在有緩存的情況下,你仍然最好把 require 語句放在前面??纯聪旅娴拇a,在真正進入路由的時候才加載 axios 模塊。/connect 路由出乎預(yù)料的慢,因為它在導(dǎo)入模塊的時候才開始請求文件[譯者注:IO 操作比 CPU 運算慢很多]:
app.post('/connect', (req, res) => { const axios = require('axios') axios.post('/api/authorize', req.body.auth) .then((response)=>res.send(response))})
更好更高效的方式是服務(wù)器啟動后就加載模塊,而不是在路由中:
const axios = require('axios')const express = require('express')app = express()app.post('/connect', (req, res) => { axios.post(