雖然 Node.js 在國內沒有盛行,但據 StackOverflow 2016 年開發者調查,其中 node.js 、全棧、JavaScript 相關的技術在多個領域(包括全棧、後端)都有排名領先。 javascript
( http://stackoverflow.com/research/developer-survey-2016 )php
後端分佈css
( http://stackoverflow.com/research/developer-survey-2016 )html
Node.js 與生俱來的 2 個特性:前端
之前總強調的異步特性,到今天異步已經不是明顯優點。所以除了性能,其餘都是病(不足)?vue
一、Callback hell 問題html5
目前已經很好的解決了。promise / generator / async 後面會講。java
二、包管理node
npm 已是開源世界裏最大的包管理器了,模塊很是豐富(25.6萬 )。mysql
Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
之前咱們老是喜歡拿異步說事兒,如今咱們拿 Node.js 的強大的生態來炫耀。
空弦科技作的是基於雲倉儲的 SaaS 服務,給中小賣家提供服務,核心系統是進銷存、訂單池、WMS。
先看一下咱們的瓶頸在哪裏
因而就引出了我認爲的 Node.js 好處
Node.js 給了咱們足夠的選擇工具
甚至能夠用各類編譯器 coffee、typescript、babel(es)等。對於從 0 開始的團隊來說,能夠先面向過程、而後隨着團隊的成熟度,一點一點增長難度。
提供好的基礎和包管理工具
以上這些都作大型軟件的基礎,Node.js 在這方面作得很是好
特定場景的快速
不少人把 MEAN 組合(好比 mean.io)起來,這樣作的好處是若是熟悉,開發速度確實會很是快,可是難度太大,不多有人能搞的定。metetor 模糊了服務端和客戶端,是同構的典型應用,對於實時場景是很是高效的。這種東西都算特定場景的快速,通常不敢輕易上,調優難度很是大,若是有人能 cover 的住,在初期是很是高效的。
總結需求:能夠簡單,能夠難;能夠快、也能夠慢;能夠開發大型軟件
若是以上不知足咋辦?這時就須要架構平衡了。
在架構中各自作各自合適的事兒就好,咱們很坦然的面對 Node.js 的優勢和缺點,作好架構平衡。
一、在語言層面能夠作,那語言層面作
從上面看,絕大部分需求均可以知足了
二、若是語言層面搞不定,那就架構層面作
稍微解釋一下,首先,架構與 Node.js 沒直接關係。其次,架構師經常使用的東東有足夠的 Node.js 模塊支持,好比 MQ,像 Rabbitmq 有比較好的 Node 模塊支持,RPC 裏 Thrift、Grpc、Tchannel 支持的都不錯,咱們使用的 senecajs,Redis,ioredis 等軟件,後面作 HA 都是同樣的。
三、若是架構層面也解決不了……
合適的場景用合適的東西。有不少東西是 Node.js 不擅長,又不在架構範疇裏的,咋辦?如實在不夠,Java 補(嚴格點,應該叫其餘語言補)
但凡是 Java 或其餘語言裏比較成熟的庫,能夠做爲獨立服務使用的,均可以作 Node.js 的支持。避免過多的時間用在造輪子上,影響開發進度。
四、Node.js 優劣分析
Node.js 的 Web 開發框架 Express、Koa 等,簡單,小巧,精緻,缺點是集成度不夠,目前已有的 MEAN 或 yo 或 sails 等總有某種方面的不滿意
選擇 Node.js 咱們須要作的包括:固化項目結構;限定 ORM;自定義腳手架。
因爲 Node.js 已經提供如下特性,所以你能夠在 30 分鐘完成一個腳手架。
咱們用Node.js作什麼?
目前進度
一些正在建設的方面
打算進行技術棧更新,包括Nodejs 4.x(預計今年 6 月份;Koa(generator/co);es6/es7 ( babel )。
4.x 在內存和性能上都有很是大的提高,新的語言特性上,異步流程和語法上都須要學習,故不急於升級,待人才梯隊完善。
目前的作法是小步快走,一次只上同樣新技術;另外造成梯隊,便可準備上新東西;善用 npm,實現 3 化:模塊化、最小化、服務化
MEAN 架構
MEAN 是目前最潮的全棧 JavaScript 架構。MEAN 是一個 JavaScript 平臺的現代 Web 開發框架總稱,它是 MongoDB Express AngularJS Node.js 四個框架的第一個字母組合。它與傳統 LAMP 同樣是一種全套開發工具的簡稱。
從個人角度看
我爲何選擇 MEAN 架構?
最重要的一件事兒,是當有問題的時候,有人能 cover 住,在創業初期這是最最重要的事兒。
Node.js最新Web技術棧https://cnodejs.org/topic/55651bf07d4c64752effb4b1
異步流程控制
JavaScript 流程控制的演進過程,分如下 5 部分:
總體來講,對異步流程控制解決的仍是比較好的。
Node.js 最新技術棧之 Promise 篇https://cnodejs.org/topic/560dbc826a1ed28204a1e7de
業務邊界優化
創業公司有不少可變性,要作的系統也無數,如何保證業務系統的邊界是很是難的,咱們其實走了不少彎路。
靜態 API 理論
當需求和 UE 定下來以後,就開始編寫靜態 API,這樣 APP、H五、前端就可使用靜態 API 完成功能,然後端也能夠以靜態 API 爲標準來實現,總體效率仍是比較高的。
API 的最佳實踐
http://developer.github.com/v3/ (嚴格的restful)
微博 API (可讀性強,相對比較傳統),咱們採用的微博 API 相似的,約定結構也是相似的。
res.api is an express middleware for render json api , it convention over api format like this :{ data : {}, status: { code : x, msg : "some message" }}
客戶端 API 開發總結https://cnodejs.org/topic/552b3b9382388cec50cf6d95
約定結構
和 Java 開發裏的目錄結構相似,該分層的分層,適當的按照 Express/Koa 增長中間件、路由等目錄,便於開發。
使用 npm 模塊化
編寫生成器
在 Web 開發裏,寫了 Moajs 生成器,相似於 rails
moag order name:string password:string
其餘開發,如 iOS 開發裏模型校驗很是煩,因而寫了一個 json2objc 命令行工具,讀取 json,生成 oc 代碼,能夠節省很多時間
Moajs 框架和先後端分離
moa 生成器,即上面講的生成器 scaffold。
moa-frontend 技術棧:Express / Jade / bootstrap、bootstrap-table / jQuery / gulp / Nginx
moa-api 技術棧:
Features
從開發效果上看,仍是很是快的,很是穩定的。
Moajs框架演進之路https://cnodejs.org/topic/567e2388aacb6923221de469
Node.js 相關工具
前端開發四階段
Vuejs 綜合 Angular 和 React 的優勢,應該是下一個流行趨勢。
Hybrid 開發
Hybrid 混搭開發是指使用 H5 技術開發的跨瀏覽器應用,並最終能夠將 HTML5/js/css 等打包成 apk 和 ipa 包的開發方式。它也能夠上傳到應用商店,提供給移動設備進行安裝。它最大的好處是經過 H5 開發一次,就能夠在多個平臺上安裝。
將來將會是 JavaScript 一統天下(Node.js 作後端,傳統 Web 和 H5 使用 Javasctipt,更智能的工具如 gulp,更簡單的寫法如 coffeescript 等)。H5 大行其道(網速變快,硬件內存增加)。
跨平臺
C/S 架構到 B/S 架構,這個大部分都清楚,很少說。
移動端加殼,在瀏覽器上作文章,把頁面生成各個移動端的 app 文件。
PC 端加殼,同樣是延續瀏覽器作文章,不過此次把頁面生成各個 PC 平臺的可執行文件。
目前比較火的編輯器都是基於 Electron 打包:
組件化:統一用法
react 的出現影響最大的是 JSX 的出現,解決了長久以來組件化的問題:
單純的 React 只是 view 層面的,還不足以應用,因而又有 Redux。核心概念:Actions、Reducers 和 Store,簡單點說就是狀態控制,而後再結合打包加殼,變成 app 或可執行文件。ios、Android 上用 Cordova,PC 上使用 Electron。
總結
這部分其實組件化了前端,那麼可否用這樣的思想來組件化移動端呢?
react-nativehttps://github.com/facebook/react-native)A framework for building native apps with React. http://facebook.github.io/react-native/
簡單點說,就是用 React 的語法來組件化 iOS 或 android SDK。它們都在告訴咱們,大家之後就玩這些組件就行了,你不須要知道複雜的 SDK 是什麼。
當下流行玩法
Medis is a beautiful, easy-to-use Redis management application built on the modern web with Electron, React, and Redux. It’s powered by many awesome Node.js modules, especially ioredis and ssh2. https://github.com/luin/medis
技術點
親,你看到將來了麼?
講了 Node 工具,前端 4 階段,hybrid,各類跨平臺,目前就是爲了介紹 Node 全棧的各類可能,下面講一下如何能作到 Node 全棧?
全棧核心,後端不會的 UI(界面相關),前端不會的 DB(業務相關),只要打通這 2 個要點,其餘就比較容易了。
一、從後端轉
作後端的人對數據庫是比較熟悉,不管 mongodb,仍是 MySQL、Postgres,對前端理解比較弱,會基本的Html,Css,模板引擎等比較熟悉。
4 階段按部就班,build 與工具齊飛,前端開發 4 階段,個人感受是按照順序,按部就班。
Vuejs 綜合 Angular 和 React 的優勢,應該是下一個流行趨勢
二、從前端轉
從前端日後端轉,API 接口很是容易學會,像 Express、Koa 這類框架大部分人一週就能學會,最難的是對 DB、ER 模型的理解,說直白點,仍是業務需求落地的理解
咱們來想一想通常的前端有什麼技能?
那麼他們若是想在前端領域作的更深有哪些難點呢?
以上皆是痛點。因此比較好的辦法:
從咱們的經驗看,這樣是比較靠譜的。 Moa FrontEnd 就是最簡單先後端分離,裏面沒有任何和 DB 相關。
技術棧
通常的前端都很是容易學會,基本 2 周就已經很是熟練了,個人計劃是半年後,讓他們接觸【異步流程處理】和【數據庫】相關內容,學習後端代碼,就能夠全棧了
三、從移動端轉
移動端分:native 原生開發,hybrid 混搭式開發。原生開發就是 iOS 用 oc/Swift,Android 用 Java 或 Scala 等,就算偶爾嵌入 webview,能玩 JavaScript 的機會也很是好少。因此移動端轉全棧的方法,最好是從 cordova(之前叫 phonegap)開始作 hybrid開發。只要關注 www 目錄裏的 H5 便可,比較簡單。若是 H5 不足以完成的狀況下,能夠編寫 cordova 插件,即經過插件讓 JavaScript 調用原生s dk 裏功能。cordova 的 cli 能夠經過 npm 安裝,學習 npm 的好方法,學習 gulp 構建工具。
只要入了 H5 的坑,其實就很是好辦了。
這個基本上是我走的路,從 2010 年寫 IOS、作 phonegap(當時是0.9.3)一路走到如今的總結吧。
Node.js 多是一場春夢,
也可能一個變革機遇;
咱們更相信它是變革機遇,
請拭目以待!
Q1 第一季度
Q2 第二季度
Q3 第三季度
Q4 第四季度
版本帝?去年從 v0.10.35 開始
目前(2016 年 3 月 20 日)的 2 個版本
總體來講趨於穩定。
(參考連接: http://i5ting.github.io/history-of-node-js/ )
Node.js 的企業級大事兒記
2014年 nearform ( Node.Js 爲何會成爲企業中的首選技術? )
2015年 IBM (收購 StrongLoop,拓展雲服務業務)
Node.js 基金會的創始成員包括 Joyent、IBM、Paypal、微軟、Fidelity 和 Linux 基金會。
對於企業級開發,Node.js 是足夠的,不管從性能、安全、穩定性等都是很是棒的。
空弦科技作的是基於雲倉儲的 SaaS 服務,給中小賣家提供服務,核心系統是進銷存、訂單池、WMS。目前來看不存在任何問題,
es && babel
2015 年 ECMA 國際大會宣佈正式批准 ECMA-262 第 6 版,亦即 ECMAScript 2015(曾用名:ECMAScript 六、ES6)的語言規範。
babel (http://babeljs.io/)做爲 es 編譯器,已經大量開始使用了,模塊作的很是棒,還有人用babel寫其餘語言編譯器。Node.js 裏在 0.12 以後才增長 es6 特性,es7 的目前還不支持。因此在 Node.js 裏使用 es 裏比較高級的特性,是須要 babel 去編譯處理的。這是 Node 追逐的標準。
2016 年 01 月 22 日,(微軟請求 Node.js 支持 ChakraCore https://github.com/nodejs/node/pull/4765 )
將來 Node.js 不僅是基於 chrome v8 內核,它還能夠支持更多其餘瀏覽器內核,對生態、效率提高等很是有好處。
蔡偉小兄弟的查克拉 benchmark 的對比( https://github.com/DavidCai1993/ES6-benchmark )基本結論是 V8 ES5 > 查克拉 ES6 > 查克拉 ES5 > V8 ES6
1. 在全棧的語言選擇上,除了 Node.js,是否還考慮過其餘語言?
桑世龍:有的,將來 swift 和 Lua 是有可能的。swift 的語法和性能上有很大優點,Lua 在 openresty 的推進下也有機會,不過沒有 swift 大。像 WebAssembly 之類的就不太看好了。
2. 請教桑老師:剛纔你說的併發開發流程中靜態 API 指的是 API 文檔?若是是的話誰負責編寫?大家目前已是一我的分模塊從前端寫到後端了嗎?
桑世龍:目前沒作到文檔即靜態 API,因此目前是直接提供 json 和部分(json-server https://github.com/typicode/json-server/ ),負責是後端開發的 leader 在寫,他的進度會比正常開發要早一週左右。目前不是一我的寫全部的先後端,團隊成立不久,天津 Node.js 會的很少,因此仍是先後端分離。可是經過 moa-frontend 可讓前端了解 Express 等後端知識,適當的時候會給予機會,前端轉後端。
3. 貴司在開發協做中提到了靜態 API,請問是否是有什麼比較好的工具能夠推薦?
桑世龍:Node.js 裏(json-server https://github.com/typicode/json-server ) 比較好
我其實很想圍繞靜態 API,寫各類請求的生成器,只要 API 出來,文檔和各平臺的 HTTP 請求代碼就生成出來,同時能夠對正式 API 進行壓測,惋惜目前還沒精力寫。
4. 作 hybrid app 在移動端會遇到性能問題吧,有沒有什麼優化經驗能夠分享?
桑世龍:足夠輕量級,少選大框架,作好前端該有的優化。注意 touch 和 click 的區別,好比 fastclick 或 Zeptojs 的 tap 手勢。Chrome profile(CSS3動畫)。使用 weinre 真機測試。參考:(個人 H5實踐 。
5. 若是都全棧了,當前大家團隊是如何分工的?
桑世龍:咱們團隊仍是傾向於分工專業化,各個服務粒度很是小,便於輪崗、還有就是能夠爲之後像 Google 那樣代碼開放作準備。可是有不少狀況下,是須要有機動的突擊隊的(尤爲是創業時期),這樣能夠隨便組合,另外就是全棧爲 remote 提供了更多便利性。
6. H5 在手機上用 iScroll 坑比較多啊 尤爲三星打開硬件加速的時候 render 頁面,桑老師怎麼看?
桑世龍:能夠嘗試一下淘寶系的 H5 虛擬化,鬼道曾經在 as 大會上講過的,咱們目前還沒能力作這麼深層次的優化。
7. Node.js 作業務金額計算的金額性能和精度夠嗎
桑世龍:你問的不是 Node.js,而是 Node.js 要操做的數據庫。耗性能的計算能夠在架構上平衡的,若是能夠延時,MQ 就能夠了。若是是非延時狀況,能夠採用其餘語言編寫對應服務,不必非要必定要 Node.js。咱們目前的場景,尚未在計算遇到瓶頸。
8. 關於 API 返回格式那裏,對於 status 爲何不打平了把 code 和 message 放出來?這麼設定有什麼好處麼?
桑世龍:語義上更加清晰。整個返回的 json 就只有 data 和 status,若是 status.code != 0,我取 msg 就行了,若是等於 0,處理 data 數據這種設計不見得多好,不過結構清晰,對於開發者來講,是比較容易接受的。
本文策劃李慶豐,編輯王傑,審校 Tim Yang
原文地址:http://weibo.com/ttarticle/p/show?id=2309403956502426692050