當我不在迷惘
五年前盏檐,當我還是一個純粹的前端時歇式,我對于服務器和后端開發(fā)可以說是一竅不通。我只是感覺糯笙,給我的工作完成就行了—不是我該干的我也沒必要去研究贬丛。
但是很快我發(fā)現,當我需要更好的協(xié)作時给涕,又或者我想自己開發(fā)一個小型項目幾乎是不可能完成的豺憔。產品额获,設計,前端恭应,后端抄邀,測試。這不可避免的形成了一個模式昼榛,一個禁錮所有的人的思維定式境肾。
我開始想我最一開始學習編程的目的到底是什么,現在的我能做到嗎胆屿?或者當我離開這個行業(yè)的時候奥喻,我如何告訴我自己曾經的我究竟創(chuàng)造一些什么。
發(fā)現捷徑
如果你看過我其他的教程非迹,你應該能明白环鲤,編程語言中的php和java我都嘗試去學習過。但是我的最終感覺—那些編程語言并不適合前端轉型到后端的同學憎兽,此類笨重的語言甚至不適合去做快速的迭代開發(fā)冷离。
甚至高并發(fā)和異步操作,對于這些語言都是一個難以解決的問題纯命。那么西剥,有沒有這樣的一種開發(fā)語言,不但具備媲美php和java類的后端開發(fā)能力亿汞,又有著能解決高并發(fā)和全起步操作—只要把問題轉移到前端瞭空,那就是我的主場了。
直到我遇到了nodejs留夜。我覺得匙铡,我這一生的開發(fā)旅途是少不了它的陪伴了。
到底什么是nodejs
講node之前我們要先說一下引擎碍粥。
你可能會問鳖眼,這跟node有什么關系?我要告訴你的是嚼摩,引擎是最關鍵的東西钦讳,引擎就好比是,人的基因枕面。你并非是天生獨一無二愿卒,你的行為模式甚至你的長相都跟你的基因有關系。簡單來說潮秘,你的基因是什么琼开,你就像什么。
這也就是為什么nodejs這么受歡迎的原因枕荞,因為nodejs的引擎是chrome—v8柜候。所以nodejs所有語法基本上都跟es6的標準一模一樣搞动。然后其實你只需要理解什么是線程,什么是模塊渣刷,怎么處理http請求就行了鹦肿。這個東西對于前端開發(fā)來說可以說,天生就非常友好辅柴。對于后端人員來說——還是算了吧箩溃。那是一門完全不一樣的語言。
首先我要告訴你的是碌嘀,node可不是只能處理web端的服務涣旨。他在現今世界上大有可為。
今天我們將會從最基本的原理上了解node筏餐。
基于模塊
nodejs是一個包依賴的語法开泽。沒錯你沒有看錯牡拇,跟你之前用的vuecli是一模一樣的魁瞪。
vuecli通過webpack封裝了一套東西——webpack也是基于node的,只不過他的寫法換了換惠呼。
現在我們要使用最原生的node來開發(fā)导俘。
下面是一個啟動http服務的例子,你不用理解他具體怎么應用剔蹋。
咱們就看看他的語法旅薄,他先require了一個模塊,然后調用了一個方法泣崩。
是不是跟es6一模一樣少梁?
如果你熟悉這個寫法,那么node對于你來說幾乎毫無難度矫付。后面我們將會深入講解node原理和各種包應用凯沪。
var http = require('http');
http.createServer(function handler(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
在nodejs中,幾乎所有操作都是基于模塊的买优,你加載哪個模塊妨马,就可以調用哪個模塊的方法。就這么帶勁杀赢。
非阻塞加載
接下在咱們講一個nodejs最牛逼的地方烘跺。
nodejs跟php,java或者python都不一樣的地方再于脂崔。他是個全異步非阻塞語言滤淳。
如果有人問你,node最優(yōu)秀的地方在哪砌左,你就可以這樣回答他脖咐。
因為它是全異步的伤柄,它天生就具備解決高并發(fā)的基因,而不需要像其他語言一樣需要某種解決方案文搂。要注意的是适刀,nodejs只有一個線程,卻可以像多線程一樣實現各種功能煤蹭,因為nodejs的底層有一個線性池笔喉,線性池的原理我們會在后面講到。
好的硝皂,我們來看一個阻塞和非阻塞的例子常挚。
阻塞寫法
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 在這里阻塞直到文件被讀取
console.log(data);
moreWork(); // 在console.log之后執(zhí)行
非阻塞寫法
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
moreWork(); // 在console.log之前執(zhí)行
在nodejs中,你可以自由切換到底是阻塞還是非阻塞稽物。非阻塞的好處就是奄毡,如果你一個函數報錯了,但是后面的不受影響贝或,因為他們是并行執(zhí)行的吼过。
如果是阻塞,一旦第一個出問題了咪奖,后面你就不用想執(zhí)行了盗忱,全部都會卡死。
好了羊赵,今天就先講這么多了趟佃,后面我們將會慢慢的解開nodejs的神秘面紗,想提升自己的技術嗎昧捷,來跟龍哥一起努力吧闲昭!