Node.js最佳實(shí)踐--在2017如何成為一個(gè)更好的開(kāi)發(fā)者

一年前,我們寫(xiě)了一篇文章How to Become a Better Node.js Developer in 2016 ,這篇文章成功地獲取了不錯(cuò)的反響,所以我想現(xiàn)在是時(shí)候回顧這個(gè)主題為2017年做準(zhǔn)備了。

2017年最好的Node.js實(shí)踐

使用ES2015

去年我們建議了你使用ES2015,當(dāng)前現(xiàn)在的情況已經(jīng)大有不同了

回到那個(gè)時(shí)候,Node.js v4是當(dāng)時(shí)的穩(wěn)定版本(LTS),支持了ES2015中57%的功能。一年過(guò)去了,現(xiàn)在Node v6已經(jīng)增長(zhǎng)到支持ES2015中99%的功能了。

如果你現(xiàn)在在使用最新的LTS Node.js版本,你甚至可以不再需要babel就可以使用所有ES2015的特性。但是即使如此,在瀏覽器端你可能還是需要babel。

如果你需要關(guān)于Node.js版本對(duì)于ES2015支持情況的更多的信息,我推薦你可以查詢node.green

使用Promises

在80年代第一次提出Promises的概念?,F(xiàn)在多數(shù)現(xiàn)代編程語(yǔ)言已經(jīng)支持這一特性了,使我們的編碼變得更加簡(jiǎn)單。

想象一個(gè)如下的功能,它需要讀取一個(gè)文件,然后解析它,然后打印出其中的name字段。如果使用回調(diào),它可能是下面這個(gè)樣子的:

fs.readFile('./package.json', 'utf-8', function (err, data) {  
  if (err) {
    return console.log(err)
  }

  try {
    JSON.parse(data)
  } catch (ex) {
    return console.log(ex)
  }
  console.log(data.name)
})

Promises可以使得這段代碼變的更加有可讀性:

fs.readFileAsync('./package.json').then(JSON.parse).then((data) => {  
  console.log(data.name)
})
.catch((e) => {
  console.error('error reading/parsing file', e)
})

當(dāng)前,現(xiàn)在的fs的并沒(méi)有一個(gè)返回一個(gè)Promise的readFileAsyncapi。為了做到這個(gè),我們使用可以一個(gè)類似promisifyAll的模塊。

使用標(biāo)準(zhǔn)的JavaScript格式

當(dāng)我們談到代碼風(fēng)格的時(shí)候,一個(gè)公司有統(tǒng)一的代碼風(fēng)格是至關(guān)重要的。只有這樣,當(dāng)你需要改變你的項(xiàng)目的時(shí)候,你才可以高效的從零開(kāi)始,而不用擔(dān)心基礎(chǔ)的架構(gòu)不一樣。

在RisingStack,我們?cè)谒械捻?xiàng)目中都使用了JavaScript Standard Style。

使用 Standard后,在你安裝之后就可以直接使用,你不需要再做其他的事情,也不需要管理.eslintrc, .jshintrc, 或者 .jscsrc文件。具體的Standard的規(guī)則可以查看Standard rules。

使用docker---容器將在2017年被大量使用在生成環(huán)境

你可以把docker鏡像當(dāng)做部署的工具。docker容器可以將一個(gè)軟件打包在一個(gè)完整的文件系統(tǒng)中,這個(gè)容器可以包含你在服務(wù)器上需要的一切,例如代碼,運(yùn)行環(huán)境,系統(tǒng)工具,系統(tǒng)程序庫(kù)。

但是為什么我們需要開(kāi)始使用容器呢?

  • 容器可以使你的應(yīng)用運(yùn)行在一個(gè)隔離的環(huán)境中
  • 作為一個(gè)安全工具,可以使你的代碼更加的安全
  • 輕量級(jí)的docker鏡像
  • 使得你的部署變得穩(wěn)定
  • 你可以在本地運(yùn)行模擬線上的運(yùn)行環(huán)境

你可以從official getting started tutorial開(kāi)始學(xué)習(xí)docker。另外也推薦Kubernetes best practices

監(jiān)控你的項(xiàng)目

當(dāng)你的應(yīng)用發(fā)生錯(cuò)誤的時(shí)候,第一個(gè)知道的人不應(yīng)該是用戶而應(yīng)該是開(kāi)發(fā)者。

最新的一個(gè)開(kāi)源解決方案Prometheus可以幫助你實(shí)現(xiàn)項(xiàng)目的監(jiān)控。Prometheus是一個(gè)基于SoundCloud的開(kāi)源工具箱,它可以監(jiān)控你的項(xiàng)目并報(bào)警。Prometheus唯一的缺點(diǎn)是你需要設(shè)置一些配置并且需要需要自己管理。

如果你在尋找一個(gè)開(kāi)箱即用的解決方案,你也可以使用我們自己開(kāi)發(fā)的Trace by RisingStack

Trace可以幫助你做到以下的事情

  • 報(bào)警
  • 生產(chǎn)環(huán)境下的內(nèi)存和cpu分析
  • 分布式追蹤和錯(cuò)誤尋找
  • 性能監(jiān)控
  • 保護(hù)你的npm包的安全

在后臺(tái)進(jìn)程中使用消息服務(wù)

如果你使用http請(qǐng)求發(fā)送消息,當(dāng)你的接收服務(wù)器宕機(jī)了,你所有的消息都會(huì)丟失。如果你的傳輸層支持持久化,類似使用消息隊(duì)列來(lái)發(fā)送消息,你就不會(huì)有這個(gè)問(wèn)題。

你的接收服務(wù)器器宕機(jī)了,消息將會(huì)被保存下來(lái),在服務(wù)重啟后會(huì)繼續(xù)發(fā)送,如果你的服務(wù)器未宕機(jī)但是發(fā)送了錯(cuò)誤,消息會(huì)被重新發(fā)送一次,這樣可以保證你的數(shù)據(jù)不會(huì)丟失。

舉個(gè)例子:你需要發(fā)送數(shù)千份郵件,在這個(gè)場(chǎng)景下,你只需要獲取到一些類似郵件地址和用戶的姓名等基礎(chǔ)信息,后臺(tái)就可以很輕松地將這些信息和郵件信息整合后發(fā)送出去。

這種方式最大的好處是,你可以你需要的時(shí)候橫向擴(kuò)展你的服務(wù),而不會(huì)有郵件被丟失。如果你需要發(fā)送數(shù)百萬(wàn)的郵件,你可以用相同的方式來(lái)增加你的服務(wù)。

對(duì)于消息隊(duì)列的選擇有很多

使用最新的LTS版本的Node.js

為了平衡穩(wěn)定性和新特性,我推薦你使用最新的LTS版本的Node.js。當(dāng)我寫(xiě)這篇文章的時(shí)候,最新的LTS版本是6.9.2。

你可以使用nvm來(lái)切換你的node版本,你只需要兩個(gè)指令就可管理和切換你的node版本

nvm install 6.9.2 
nvm use 6.9.2

使用語(yǔ)義化的版本管理

幾個(gè)月前,我們進(jìn)行了一個(gè)Node.js開(kāi)發(fā)者調(diào)查,我們從中獲取了開(kāi)發(fā)者對(duì)于使用語(yǔ)義化版本的使用情況。

不幸的是,我們發(fā)現(xiàn)調(diào)查者只有71%的人在他們提交和使用模塊時(shí)使用語(yǔ)義化的版本管理。我們認(rèn)為這個(gè)數(shù)字應(yīng)該要更高 - 每一個(gè)都應(yīng)該使用語(yǔ)義版本!,因?yàn)椴桓鶕?jù)semver規(guī)則來(lái)提交package,會(huì)很容易摧毀你的Node.js應(yīng)用。

通過(guò)版本號(hào)來(lái)管你的項(xiàng)目或者模塊是至關(guān)重要的。你的用戶應(yīng)該要知道一個(gè)模塊是否更新了,在使用新版本前他們要做什么。

這就是語(yǔ)義版本控制的來(lái)歷。一個(gè)版本號(hào)應(yīng)該要有主版本號(hào)、副版本號(hào)、補(bǔ)丁版本號(hào),更新不同位置的版本號(hào)代表不同的意思:

  • 主版本號(hào):表示更新會(huì)有不兼容的API
  • 副版本號(hào):表示更新會(huì)有新的功能(不破壞現(xiàn)有的api)
  • 補(bǔ)丁版本號(hào):表示更新是模塊做了向后兼容的bug修復(fù)

npm是根據(jù)semver規(guī)則來(lái)安裝依賴的,因此當(dāng)你發(fā)布一個(gè)模塊之前,請(qǐng)確認(rèn)是否遵循了semver規(guī)則,否則你會(huì)破壞了其他使用了你的依賴的應(yīng)用。

保證你的應(yīng)用安全

保證你的用戶數(shù)據(jù)的安全將是你2017年的頭等大事。僅在2016年一年,因?yàn)槿鄙僖恍┌踩拇胧┚陀?a target="_blank" rel="nofollow">數(shù)百萬(wàn)的用戶賬戶被泄漏。

你可以通過(guò)閱讀我們的博客Node.js Security Checklist來(lái)入門(mén)Node.js的安全,博客里包含了以下的話題:

  • 安全的HTTP Headers
  • 強(qiáng)制保護(hù)
  • Session管理
  • 不安全的依賴
  • 數(shù)據(jù)驗(yàn)證

當(dāng)你掌握了這些基礎(chǔ),你可以來(lái)觀看我關(guān)于Node的互動(dòng)討論Surviving Web Security with Node.js

學(xué)習(xí)Serverless

Serverless started with the introduction of AWS Lambda. Since then it is growing fast, with a blooming open-source community.
In the next years, serverless will become a major factor for building new applications. If you'd like to stay on the edge, you should start learning it today.
One of the most popular solutions is the , which helps in deploying AWS Lambda functions.

Serverless是AWS Lambda第一個(gè)提出來(lái)的,之后它發(fā)展的很快,并建立了一個(gè)開(kāi)源的社區(qū)。

接下來(lái)的一年,構(gòu)建新應(yīng)用時(shí)serverless會(huì)成為一個(gè)標(biāo)準(zhǔn)。如果你想要留在這個(gè)領(lǐng)域,你需要重現(xiàn)在開(kāi)始就學(xué)習(xí)它。

Serverless Framework是當(dāng)前最流行的解決方案,在部署AWS Lambda functions可以幫助你。

參加會(huì)議與聚會(huì)并發(fā)言

參加會(huì)議和聚會(huì)是一個(gè)很好地方式去了解和學(xué)習(xí)新的趨勢(shì),開(kāi)發(fā)技巧和最佳實(shí)踐。當(dāng)日,這也是一個(gè)場(chǎng)合去認(rèn)識(shí)更多新的人。

To take it one step forward, I'd like to encourage you to speak at one of these events as well!
As public speaking is tough, and “imagine everyone's naked” is the worst advice, I'd recommend checking out speaking.io for tips on public speaking!

在此基礎(chǔ)上,我也鼓勵(lì)你在一些會(huì)議上發(fā)言。

在公共場(chǎng)合發(fā)言是一個(gè)不容易的事情,“imagine everyone's naked”是最壞的建議。我建議你可以去speaking.io學(xué)習(xí)一些技巧。

Become a better Node.js developer in 2017

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容