從前端到后端,龍哥講nodejs基礎(chǔ)(一)

當(dāng)我不在迷惘


五年前,當(dāng)我還是一個(gè)純粹的前端時(shí),我對于服務(wù)器和后端開發(fā)可以說是一竅不通。我只是感覺,給我的工作完成就行了—不是我該干的我也沒必要去研究。

但是很快我發(fā)現(xiàn),當(dāng)我需要更好的協(xié)作時(shí),又或者我想自己開發(fā)一個(gè)小型項(xiàng)目幾乎是不可能完成的。產(chǎn)品,設(shè)計(jì),前端,后端,測試。這不可避免的形成了一個(gè)模式,一個(gè)禁錮所有的人的思維定式。

我開始想我最一開始學(xué)習(xí)編程的目的到底是什么,現(xiàn)在的我能做到嗎?或者當(dāng)我離開這個(gè)行業(yè)的時(shí)候,我如何告訴我自己曾經(jīng)的我究竟創(chuàng)造一些什么。

發(fā)現(xiàn)捷徑


如果你看過我其他的教程,你應(yīng)該能明白,編程語言中的php和java我都嘗試去學(xué)習(xí)過。但是我的最終感覺—那些編程語言并不適合前端轉(zhuǎn)型到后端的同學(xué),此類笨重的語言甚至不適合去做快速的迭代開發(fā)。

甚至高并發(fā)和異步操作,對于這些語言都是一個(gè)難以解決的問題。那么,有沒有這樣的一種開發(fā)語言,不但具備媲美php和java類的后端開發(fā)能力,又有著能解決高并發(fā)和全起步操作—只要把問題轉(zhuǎn)移到前端,那就是我的主場了。

直到我遇到了nodejs。我覺得,我這一生的開發(fā)旅途是少不了它的陪伴了。

到底什么是nodejs


講node之前我們要先說一下引擎。
你可能會(huì)問,這跟node有什么關(guān)系?我要告訴你的是,引擎是最關(guān)鍵的東西,引擎就好比是,人的基因。你并非是天生獨(dú)一無二,你的行為模式甚至你的長相都跟你的基因有關(guān)系。簡單來說,你的基因是什么,你就像什么。

這也就是為什么nodejs這么受歡迎的原因,因?yàn)閚odejs的引擎是chrome—v8。所以nodejs所有語法基本上都跟es6的標(biāo)準(zhǔn)一模一樣。然后其實(shí)你只需要理解什么是線程,什么是模塊,怎么處理http請求就行了。這個(gè)東西對于前端開發(fā)來說可以說,天生就非常友好。對于后端人員來說——還是算了吧。那是一門完全不一樣的語言。

首先我要告訴你的是,node可不是只能處理web端的服務(wù)。他在現(xiàn)今世界上大有可為。

今天我們將會(huì)從最基本的原理上了解node。

基于模塊


nodejs是一個(gè)包依賴的語法。沒錯(cuò)你沒有看錯(cuò),跟你之前用的vuecli是一模一樣的。
vuecli通過webpack封裝了一套東西——webpack也是基于node的,只不過他的寫法換了換。

現(xiàn)在我們要使用最原生的node來開發(fā)。

下面是一個(gè)啟動(dòng)http服務(wù)的例子,你不用理解他具體怎么應(yīng)用。
咱們就看看他的語法,他先require了一個(gè)模塊,然后調(diào)用了一個(gè)方法。
是不是跟es6一模一樣?

如果你熟悉這個(gè)寫法,那么node對于你來說幾乎毫無難度。后面我們將會(huì)深入講解node原理和各種包應(yīng)用。

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中,幾乎所有操作都是基于模塊的,你加載哪個(gè)模塊,就可以調(diào)用哪個(gè)模塊的方法。就這么帶勁。

非阻塞加載


接下在咱們講一個(gè)nodejs最牛逼的地方。
nodejs跟php,java或者python都不一樣的地方再于。他是個(gè)全異步非阻塞語言。
如果有人問你,node最優(yōu)秀的地方在哪,你就可以這樣回答他。

因?yàn)樗侨惒降?,它天生就具備解決高并發(fā)的基因,而不需要像其他語言一樣需要某種解決方案。要注意的是,nodejs只有一個(gè)線程,卻可以像多線程一樣實(shí)現(xiàn)各種功能,因?yàn)閚odejs的底層有一個(gè)線性池,線性池的原理我們會(huì)在后面講到。

好的,我們來看一個(gè)阻塞和非阻塞的例子。

阻塞寫法

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中,你可以自由切換到底是阻塞還是非阻塞。非阻塞的好處就是,如果你一個(gè)函數(shù)報(bào)錯(cuò)了,但是后面的不受影響,因?yàn)樗麄兪遣⑿袌?zhí)行的。
如果是阻塞,一旦第一個(gè)出問題了,后面你就不用想執(zhí)行了,全部都會(huì)卡死。

好了,今天就先講這么多了,后面我們將會(huì)慢慢的解開nodejs的神秘面紗,想提升自己的技術(shù)嗎,來跟龍哥一起努力吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容