為什麼前端精通Node.Js的人這麼少?


想了想,決定佔個坑,然後講講挖坑經歷。

---------------------------華麗的分割線---------------------------

2015.7.11補充。

為什麼前端精通node.js的這麼少?

那我們來梳理問題啊,前端通常做什麼,後端要做什麼?

不對不對,應該這麼問:前端和後端分別要掌握哪些知識點以及分別要求有哪些認識?

## 一個頁面仔的日常

&
&
&
&Example&
&

&

& & &

&name& &age& &sex& & &

&a& &1& &1& & &

&b& &2& &1& & &

&c& &3& &1& & & &

&

&

&

ajax提交數據後返回status,data,status通常是網路正常與否之類的東東,但是還有伺服器返回數據的錯誤呢?所以這邊定義了一個response對象,

結構大概是{code:200/500(int),data:{}},然後對應了伺服器內部查詢的錯誤處理。

這些都比較簡單,我這裡只是舉了一個特別簡單的例子。

不過事實上呢,通常情況下,前端主要做的大概就是這個了~

(動畫啊,特效啊,什麼的,那也是!但是和nodejs這邊關係不大,用expressjs載入幾個頁面什麼の,乃不是精通!請不要跟我撕逼,謝謝。)

---------------------------華麗的分割線---------------------------

2015.7.11補充。

## nodejs實例

前面是給後端哥哥寫了一段便於他查詢數據的簡單代碼,我們現在具體到實際開發嘍,具體是一個「微信公眾號「開發的小例子(只是粗略的寫一寫~)。

  • 代理:nginx

  • 語言:nodejs

  • 框架:expressjs

  • 存儲:redis

微信公眾號jssdk的接入,需要驗證簽名,獲取token,接著拿到jsTicket,並最終生成簽名。

### 基礎知識

#### Nginx

對於一個獨立開發者,伺服器的管理是必然的,況且,一個vps上面,你肯定要放很多蛋疼的小玩意,我們這邊是nodejs來做基礎環境,為了不影響其他服務的正常使用,最好是通過nginx前端代理,把請求轉發到nodejs得web程序上面去,配置參考下面鏈接。(這裡還有一堆進程守護什麼的東西,隨便聽聽就好了~)

https://www.thonatos.com/docs/backend-notes/Conf-App-Based-Express-With-Nginx-On-CentOs-7-x64.md

#### ExpressJs

不管你是用nodejs的http/https直接創建web程序,還是用expressjs框架,其實都是差不多的,對req,res的處理都一定要有所了解,有興趣就去查官方api吧~

Express 4.x - API Reference

#### redis

為什麼要這個呢?如果你看過微信的官方文檔,應該知道簽名相關的那些介面是有調用次數限制的,過期時間是7200s(2h),所以吧,肯定是要存在你伺服器的,cookie、session之類的存儲也不是不可以,我這裡用redis來做緩存的。

### 具體實現

暫定前面的那些你都搞定了或者你都用不到,我們直接進入實現的流程。

#### 關於結構、配置、部署等等

一個web伺服器,路由肯定要有的,我這裡是expressjs的,那麼就是涉及到一個代碼組織的問題,我一開始是使用expressjs生成的那種結構,大概是類似傳統的mvc模式(不知道的自行搜索),但是問題來了,當你目錄的層級到一定深度的時候,require()使用起來就蛋碎的一筆~

前一段時間爬了好久angular的坑(之所以說坑是因為1.3.x和2.x已經不是一個東西~),所以組織代碼的方式變成了現在的這樣樣子,主要代碼全部放在了app目錄,資源文件放在public目錄,conf那邊就是調試和運行的一些配置文件了,app下面除了common那邊以外是以功能來組織代碼。

.
├── README.md
├── app
│ ├── api
│ ├── blog
│ ├── common
│ ├── doc
│ ├── fm
│ ├── index
│ ├── mood
│ ├── route.js
│ └── user
├── app.js
├── bin
│ ├── autoload.js
│ └── gulpfile.js
├── bower.json
├── conf
│ ├── api_develop.json
│ ├── api_product.json
│ ├── app_develop.json
│ └── pm2_develop.json
├── node_modules
├── package.json
├── public
│ ├── css
│ ├── css-gulp
│ ├── favicon.ico
│ ├── html
│ ├── images
│ ├── js-spm
│ └── vendors
└── static

也許有人覺得隨便怎麼放都行,是我事太多(好像我真的是個事b...),可是我發現啊,我改了好多次結構以後,現在用起來很方便,一目了然,給別人解釋起來也比較方便(哼,咱目標可是架構,怎能實現功能就行?笑~),所以嘛,配置啊,模塊啊,代碼組織啊,運行啊,編譯什麼的,都要考慮嘛~,再說了,你要做nodejs啊,你是後端啊!你不考慮?不考慮部署?不考慮結構?不考慮配置?——行行行,你什麼都不考慮,但是總得考慮這玩意公開以後別人能不能看得懂吧?

#### 其實寫代碼是最好做的那一部分~

先把所有請求全轉到router那邊來處理吧~

```
# app.js
// ------------- ROUTERS -------------
require("./app/route")(app, passport);

# router.js
// Api
var api = require("./api/api");
app.use("/api",api);

# api.js
// Router
var apiApi = require("../api/apiModule").Api;
router.route("/wechat/signature")
.get(apiApi.wechat().checkSignature);

router.route("/wechat/signature/gen")
.get(apiApi.wechat().genSignature);

router.route("/wechat/token/get")
.get(apiApi.wechat().getToken);
```

然後我們就來寫代碼吧~

var obj = {};

// 簽名檢查
obj.checkSignature = function (req,res){

var WECHAT_CONFIG = CONFIG_APP.weixin;
var signature = req.query.signature;
var timestamp = req.query.timestamp;
var nonce = req.query.nonce;
var echostr = req.query.echostr;

var shasum = crypto.createHash("sha1");
var arr = [WECHAT_CONFIG.token, timestamp, nonce].sort();
shasum.update(arr.join(""));

if(shasum.digest("hex") === signature){
res.send(echostr);
}else {
res.send("err");
}
};

=====

未完待續。

讓我靜靜,後面的那些不忍心貼了,太長....

未補充的那部分實際上是錯誤處理與一些邏輯關係的東西,讓我回頭整理一下思路。。。

貼個地址:

https://www.thonatos.com/docs/mt-notes/Why-it-is-difficult-to-learn-nodejs-for-frontend-developer.md


很多人並沒學node,而是學了expressJS。

Node.js in Practice

Node.js the Right Way: Practical, Server-Side JavaScript That Scales

Node.js Design Patterns


精通NodeJS,必須有後端開發的基礎和相關項目經驗,必須對演算法和數據結構有較深刻的認識,否則別談「精通」這個詞。而這些屬性往往是一般的前端所不具備,更不必說從設計轉過來的『前端設計師』了。。。所以,前端很少是真正精通nodejs的,更多是知道些皮毛而已,往深層次應用發展很難。

找擅長nodejs的人才,往做後端的人裡面物色吧,如果發現js不錯的後端,那就說服他轉行做nodejs吧。


我也算用nodejs的渣渣了,說說個人覺的難精通的原因吧:

1.nodejs比較新,09年才發布距今不到10年,跟JAVA、C++這些老前輩沒法比;

2.更新比較頻繁, 因為新所以要經常改,改動有多頻繁?看人家更新日誌感受下(node/ChangeLog at master · joyent/node · GitHub),因而對應的第三方模塊改動也大,用過expres3.X跟4.X的同學都懂的。

3.戰線比較長,戰鬥力自然分散,就像html5的 hybrid app 三端通吃,結果每一端都被原生碾壓。前後端通吃的人,精力自然分散;哪能像單攻一端那麼強?

4.nodejs目前定位比較尷尬,高不成低不就,大項目穩定性、安全性被質疑,小項目還是沒人家PHP 各種CMS來得快。隨著更新完善,這點以後必定會有所好轉。

5.同行的嘲諷;我們行業總有那麼一群人,對新、舊技術(c# html5 nodejs)了解皮毛後,發現其缺點然後無限放大在各種社區發帖黑之。雖然無法理解 這種 損人不利己的行為,但其對技術的發展阻礙作用還是很明顯的。

PS:第4、5點導致nodejs開發領域,進來的新人多不了,自然就鮮少精通的牛人。

6.nodejs在技術層面上精通有一定難度,一方面前面有知友說了 nodejs後台需要有後端思維才能玩的轉,另一方面nodejs後台一些高階實現就是調用C++代碼模塊,對於大部分沒後台開發經驗的前端同仁要精通又得多一道坎。(nodejs底層實現,最近看朴靈大神的《深入淺出nodejs》,其對這方面有比較多的講述)

最後, 安利下,nodejs作為前端開發新技術可謂是另闢蹊徑,對前端的意義還是很大的,作為一個上進的前端不了解、不使用談何進步?


因為Node.js屬於後端。


前端為什麼要精通nodejs?是指nodejs的拼寫么?


事實上node開發web系統,還是有後端思維的才玩得轉。

前端也要看什麼前端,只能寫寫幾十行jQuery插件,還一堆bug那種,後端絕對玩不轉。node也不行。最少要能封裝出功能良好,擴展性方便的jQuery插件,這樣的前端去玩後端才行。

在知乎上看過一篇文章,答的是程序員的能力。有一條就是全局臨時記憶能力。差的前端,只能記得一頁的結構,而後端需要對整個系統大體記得,對某個業務前因後果記得非常清楚,這樣開發時才不會丟頭棄尾。少有前端能鍛鍊出這些能力,有的也是前後端通殺的高手。


學前端的人在深入一定程度之前不會去碰Nodejs

學後端的人一上來也不會去碰Nodejs

恩 還真是個尷尬的境界


前端工程師很少會去研究後端,工作上沒這個要求。

因為後端工程師是必備的,後端工程師兼職做前端的很多;工作多了分化之後就需要專門招前端了,後端安心做後端的事情了,這樣的前段沒必要懂後端也能好好工作。

而後端工程師就不局限在js上了,還是php, ror, java, django等等各種更專業的後端平台用得更多。

既然工作上沒這個要求,那麼憑興趣呢?不行,前端工程師憑興趣要去折騰Node.js還是很難的。後端的linux命令,mysql, nginx, 各種配置,每一樣都是完全陌生的領域,而且沒人請教----跟自己配合的後端工程師不搞Node.js啊,還不如請教他們熟悉的後端呢。

有興趣的時候,還不如專研各種前端框架呢,前端的世界好大呀。


提問者居然提了一個 「前端為什麼精通後端的人少」 的問題。。。

針對 @蕭強 的答案,有所 反對 / 質疑 / 贊同 。

為什麼前端精通 Node.js 的人這麼少?這不是理所當然的事情么。

為什麼前端精通 Java 的人這麼少?

為什麼前端精通 PHP 的人這麼少?

為什麼前端精通 Python 的人這麼少?

為什麼前端精通 Ruby 的人這麼少?

為什麼前端精通 Go 的人這麼少?

這不都是理所當然的事情么。

(一般情況下,名稱叫 Node ;只有語境有所混淆的情況下,才叫 Node.js 以和 node/「節點」 區別。這和 Go 一樣,一般叫 Go ,有表達不清楚的情況,才叫 Golang 以和 go/「去吧」 區別。以下文中均稱 Node .)

反對 「1. Node 比較新」:

就因為它比較新就精通的人少嗎?它在 09 年發布,同年誕生的還有 AngularJS ;AngularJS 也比較新啊,為什麼同樣「比較新」而前端精通 Node 的人少、前端精通 AngularJS 的人多呢?

質疑 「2.更新比較頻繁」:

更新頻繁就精通的人少嗎?同期誕生的 AngularJS 更新貌似更頻繁吧?我不是前端的,不了解,誰懂誰來補充。

贊同 「3.戰線比較長,戰鬥力自然分散」:

做 前端/客戶端 的人,去研究 後端/ 伺服器端,精力分散,思維需要切換,身為前端去搞 Node 這樣的後端,當然一般不會精通。這點我贊同。

強烈反對 「4. Node 目前定位比較尷尬,高不成低不就,大項目穩定性、安全性被質疑,小項目還是沒人家PHP 各種CMS來得快」:

這句話放在 09 、10年還可以,放在現在已經不適用。

  • 定位:Node 的定位一直很明確:「高性能的 Web 伺服器」,事件驅動、非阻塞I/O 是它的特點。

  • 大項目中:Node 已經作為大項目的部分被相當大範圍地使用了:淘寶、天貓的 Web 版,已經使用了 Java - Node 的架構,你能看到的很多頁面都是Node 伺服器 上渲染的,而不是原來的在 Java 伺服器 上渲染、更不是到現在還問題多多的 前端渲染;UCloud ,已經使用 Node 構建分散式集群;國外的 Paypal、Linkedin 就更不用說了,部分業務在使用。Node 在大項目中並不是去取代誰,而是接手它擅長的部分,去和其他後端語言共存。

  • 小項目中:現在初創公司純移動應用,首選後端語言是 Node . 比如:決戰喵星知乎日報愛范兒丁香客。一是因為開發起來快,比 PHP 還要快;二是因為對他們來說夠用、需要的功能通過 Node 都能又快又好地實現。至於 Node「沒人家 PHP 各種 CMS 來得快」,Language 和 CMS 比誰快,不在一個層級上,沒有可比性

  • 另外,各大 PaaS/BaaS 提供商均對 Node runtime 實現了支持:Parse 只支持 Node ;LeanCloud 首先支持 Node 、最近剛剛增加了對 Python 的支持;BAE 支持 Node、Python、Java、PHP (這四個可以合稱後端四大天王。。);阿里雲 ACE 也支持這四大天王(其中Node、Python 最近推出,尚未體驗版)。PaaS/BaaS 提供商之所以要支持 Node runtime ,因為做應用的客戶們有使用 Node 的需求

不明白 「5.同行的嘲諷」 跟精通一門後端開發平台有何關係:

再次強調:這是門後端開發平台,不是前端的新技術。你們願意學後端開發是可以的、但不是必要的,學會使用那些 Node 編寫的前端開發輔助工具就可以了,比如學會使用 Gulp .

不太認同 「6. Node 在技術層面上精通有一定難度」:

對前端開發者來說,不止是 Node ,精通 Node、Python、Java、PHP、Ruby、Go 等後端開發平台均有一定難度。

但是對後端開發者來說精通 Node、Python、Java、PHP、Ruby、Go 的難度差不多。稍有不同的可能就是 動態類型語言 和 靜態類型語言 語言上的差異,但基本的伺服器 API 、構建伺服器程序的方式、與資料庫的交互,都是一樣的原理。

所以我建議普通前端們不要再想著精通一門後端了,除非是學有餘力的全端大牛。


因為前端大部分場景,不需要多深度使用node,只要用用工具就好了


額......對於完全不懂後端的我來說,nodejs的express都是神一樣的存在,難度比3d簽到牆還高級。研究了一天半,頻繁出現error。


真正玩轉Nodejs,還是算得上是一號人物的。前段時間在網上看到一段視頻,貌似裡面全部是用nodejs,第一次見全棧用node,逼格很高粘,大家瞅瞅Alaska框架預覽


巧了,我喜歡前端。學了前端,後來發現自己寫的前端項目有很多可用性不高,因為對後端介面的不了解,覺得無法寫出產品級的頁面來,且同時對後端感興趣,因為目標是全棧。恰好 Node.js 進入我的視線。

目前一直 前端 + Node.js 到現在,正在做一個瀏覽器統計,下面是用到的框架和技術

前端用到的框架:

1. jQuery

2. Bootstrap

後端:

1. express

2. mongodb

3. mongoose

4. ejs

工具:

1. gulp

2. sass

3. bower

瀏覽器:

firefox + chrome

另外,在找工作啦~~~有接收的么?


你錯了,其實精通 node.js的人不少,你看看前端框架,前端構建工具,哪一個少得了node.js的身影,以及webapp打包工具,所以說


前端熟悉的只是node的事件驅動和語法,但是node的精髓是非同步,妥妥的後台,沒實力的公司,沒幾個會真正去用node做開發,而我所接觸的大部分前端,用node只是把node當成工具,如gulp,autoprefix等等,只是使用,談不上開發


前端的把node.js玩熟的不會去提這樣問題的公司。


因為前端主要工作主要還是寫前端應用,所以用大多數前端用Node.js主要還是用來寫一些前端構建打包腳本,又或者做一些一些 isomorphic 應用,又或者如果後端是用 Node.js 做成 RESTful 的話,前端也有可能會去改一下請求或者響應的格式來滿足產品需求。所以從工作職責上來看,並不需要專門去研究 Node.js(libuv/v8) 本身。


精通這事, @朴靈 如果他都不敢說精通,國內又有誰說精通呢??既要精通 C++ 又要精通 V8 又要搞過前端,這三個條件下去都幾乎找不到人了


因為發現還是PHP簡單,學node不如學PHP來得方便快捷


推薦閱讀:

製作一個網站是怎樣的流程?
哪個開源的移動 HTML5 框架更好一點?此問題提出於2011年
走的前端方向,現在準備刷刷演算法題,求推薦好的演算法書?
前端要切圖嗎?切圖是錯誤的流程、是浪費生命嗎?
知乎登錄頁背景,動態的網格是怎麼做出來的?

TAG:前端開發 | Nodejs |