一年前箫爷,我們寫了一篇文章How to Become a Better Node.js Developer in 2016 软啼,這篇文章成功地獲取了不錯的反響窖铡,所以我想現(xiàn)在是時候回顧這個主題為2017年做準備了溉委。
2017年最好的Node.js實踐
使用ES2015
去年我們建議了你使用ES2015点待,當前現(xiàn)在的情況已經(jīng)大有不同了
回到那個時候奏路,Node.js v4是當時的穩(wěn)定版本(LTS)畴椰,支持了ES2015中57%的功能。一年過去了鸽粉,現(xiàn)在Node v6已經(jīng)增長到支持ES2015中99%的功能了斜脂。
如果你現(xiàn)在在使用最新的LTS Node.js版本,你甚至可以不再需要babel就可以使用所有ES2015的特性触机。但是即使如此帚戳,在瀏覽器端你可能還是需要babel。
如果你需要關于Node.js版本對于ES2015支持情況的更多的信息儡首,我推薦你可以查詢node.green
使用Promises
在80年代第一次提出Promises的概念∑危現(xiàn)在多數(shù)現(xiàn)代編程語言已經(jīng)支持這一特性了,使我們的編碼變得更加簡單蔬胯。
想象一個如下的功能对供,它需要讀取一個文件,然后解析它氛濒,然后打印出其中的name字段产场。如果使用回調(diào),它可能是下面這個樣子的:
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)
})
當前泼橘,現(xiàn)在的fs
的并沒有一個返回一個Promise的readFileAsync
api涝动。為了做到這個迈勋,我們使用可以一個類似promisifyAll的模塊炬灭。
使用標準的JavaScript格式
當我們談到代碼風格的時候,一個公司有統(tǒng)一的代碼風格是至關重要的靡菇。只有這樣重归,當你需要改變你的項目的時候,你才可以高效的從零開始厦凤,而不用擔心基礎的架構不一樣鼻吮。
在RisingStack,我們在所有的項目中都使用了JavaScript Standard Style较鼓。
使用 Standard后椎木,在你安裝之后就可以直接使用违柏,你不需要再做其他的事情,也不需要管理.eslintrc
, .jshintrc,
或者 .jscsrc
文件香椎。具體的Standard的規(guī)則可以查看Standard rules漱竖。
使用docker---容器將在2017年被大量使用在生成環(huán)境
你可以把docker鏡像當做部署的工具。docker容器可以將一個軟件打包在一個完整的文件系統(tǒng)中畜伐,這個容器可以包含你在服務器上需要的一切馍惹,例如代碼,運行環(huán)境玛界,系統(tǒng)工具万矾,系統(tǒng)程序庫。
但是為什么我們需要開始使用容器呢?
- 容器可以使你的應用運行在一個隔離的環(huán)境中
- 作為一個安全工具慎框,可以使你的代碼更加的安全
- 輕量級的docker鏡像
- 使得你的部署變得穩(wěn)定
- 你可以在本地運行模擬線上的運行環(huán)境
你可以從official getting started tutorial開始學習docker良狈。另外也推薦Kubernetes best practices
監(jiān)控你的項目
當你的應用發(fā)生錯誤的時候,第一個知道的人不應該是用戶而應該是開發(fā)者鲤脏。
最新的一個開源解決方案Prometheus可以幫助你實現(xiàn)項目的監(jiān)控们颜。Prometheus是一個基于SoundCloud的開源工具箱,它可以監(jiān)控你的項目并報警猎醇。Prometheus唯一的缺點是你需要設置一些配置并且需要需要自己管理窥突。
如果你在尋找一個開箱即用的解決方案,你也可以使用我們自己開發(fā)的Trace by RisingStack
Trace可以幫助你做到以下的事情
- 報警
- 生產(chǎn)環(huán)境下的內(nèi)存和cpu分析
- 分布式追蹤和錯誤尋找
- 性能監(jiān)控
- 保護你的npm包的安全
在后臺進程中使用消息服務
如果你使用http請求發(fā)送消息硫嘶,當你的接收服務器宕機了阻问,你所有的消息都會丟失。如果你的傳輸層支持持久化沦疾,類似使用消息隊列來發(fā)送消息称近,你就不會有這個問題。
你的接收服務器器宕機了哮塞,消息將會被保存下來刨秆,在服務重啟后會繼續(xù)發(fā)送,如果你的服務器未宕機但是發(fā)送了錯誤忆畅,消息會被重新發(fā)送一次衡未,這樣可以保證你的數(shù)據(jù)不會丟失。
舉個例子:你需要發(fā)送數(shù)千份郵件家凯,在這個場景下缓醋,你只需要獲取到一些類似郵件地址和用戶的姓名等基礎信息,后臺就可以很輕松地將這些信息和郵件信息整合后發(fā)送出去绊诲。
這種方式最大的好處是送粱,你可以你需要的時候橫向擴展你的服務,而不會有郵件被丟失掂之。如果你需要發(fā)送數(shù)百萬的郵件抗俄,你可以用相同的方式來增加你的服務脆丁。
對于消息隊列的選擇有很多
使用最新的LTS版本的Node.js
為了平衡穩(wěn)定性和新特性,我推薦你使用最新的LTS版本的Node.js动雹。當我寫這篇文章的時候偎快,最新的LTS版本是6.9.2。
你可以使用nvm來切換你的node版本洽胶,你只需要兩個指令就可管理和切換你的node版本
nvm install 6.9.2
nvm use 6.9.2
使用語義化的版本管理
幾個月前晒夹,我們進行了一個Node.js開發(fā)者調(diào)查,我們從中獲取了開發(fā)者對于使用語義化版本的使用情況姊氓。
不幸的是丐怯,我們發(fā)現(xiàn)調(diào)查者只有71%的人在他們提交和使用模塊時使用語義化的版本管理。我們認為這個數(shù)字應該要更高 - 每一個都應該使用語義版本!翔横,因為不根據(jù)semver規(guī)則來提交package读跷,會很容易摧毀你的Node.js應用。
通過版本號來管你的項目或者模塊是至關重要的禾唁。你的用戶應該要知道一個模塊是否更新了效览,在使用新版本前他們要做什么。
這就是語義版本控制的來歷荡短。一個版本號應該要有主版本號丐枉、副版本號、補丁版本號掘托,更新不同位置的版本號代表不同的意思:
- 主版本號:表示更新會有不兼容的API
- 副版本號:表示更新會有新的功能(不破壞現(xiàn)有的api)
- 補丁版本號:表示更新是模塊做了向后兼容的bug修復
npm是根據(jù)semver規(guī)則來安裝依賴的瘦锹,因此當你發(fā)布一個模塊之前,請確認是否遵循了semver規(guī)則闪盔,否則你會破壞了其他使用了你的依賴的應用弯院。
保證你的應用安全
保證你的用戶數(shù)據(jù)的安全將是你2017年的頭等大事。僅在2016年一年泪掀,因為缺少一些安全的措施就有數(shù)百萬的用戶賬戶被泄漏听绳。
你可以通過閱讀我們的博客Node.js Security Checklist來入門Node.js的安全,博客里包含了以下的話題:
- 安全的HTTP Headers
- 強制保護
- Session管理
- 不安全的依賴
- 數(shù)據(jù)驗證
當你掌握了這些基礎异赫,你可以來觀看我關于Node的互動討論Surviving Web Security with Node.js
學習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第一個提出來的椅挣,之后它發(fā)展的很快,并建立了一個開源的社區(qū)祝辣。
接下來的一年贴妻,構建新應用時serverless會成為一個標準切油。如果你想要留在這個領域蝙斜,你需要重現(xiàn)在開始就學習它。
Serverless Framework是當前最流行的解決方案澎胡,在部署AWS Lambda functions可以幫助你孕荠。
參加會議與聚會并發(fā)言
參加會議和聚會是一個很好地方式去了解和學習新的趨勢娩鹉,開發(fā)技巧和最佳實踐。當日稚伍,這也是一個場合去認識更多新的人弯予。
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!
在此基礎上,我也鼓勵你在一些會議上發(fā)言个曙。
在公共場合發(fā)言是一個不容易的事情锈嫩,“imagine everyone's naked”是最壞的建議。我建議你可以去speaking.io學習一些技巧垦搬。