為什麼前端精通Node.Js的人這麼少?
想了想,決定佔個坑,然後講講挖坑經歷。
---------------------------華麗的分割線---------------------------
2015.7.11補充。為什麼前端精通node.js的這麼少?
那我們來梳理問題啊,前端通常做什麼,後端要做什麼?
不對不對,應該這麼問:前端和後端分別要掌握哪些知識點以及分別要求有哪些認識?## 一個頁面仔的日常
&
&
&
&
&
&
&
name& | &age& | &sex& | &
a& | &1& | &1& | &
b& | &2& | &1& | &
c& | &3& | &1& | &
&
&
&
&
$(document).ready(function(){
$(".item").click(function(e){
var _items = $(this).children("td");
var _id = _items[0].innerHTML;
//alert(_items[0].innerHTML);
getData(_id);
});
function getData(id){
$.post("/data/post/",{id:id},function(response,status){
if(data response.code === 200){
console.log(data);
$(".result").html(response.data);
}else{
console.log("err");
}
});
}
})
&
&
&
上面這玩意的效果大概是當用戶點擊表格中的某一行的時候,從後台查詢數據,然後添加到頁面里。(隨手寫給後端的東西,請不要糾結細節~),
### 基礎知識:- html中table、tbody、tr、td使用,以及標籤的class設置
- js中選擇器的使用,jquery中ajax的post提交,標籤內容的獲取與修改
### 錯誤處理:
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年
※走的前端方向,現在準備刷刷演算法題,求推薦好的演算法書?
※前端要切圖嗎?切圖是錯誤的流程、是浪費生命嗎?
※知乎登錄頁背景,動態的網格是怎麼做出來的?