Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
果您熟悉編程,那么您肯定聽說過使用Node.js的后端開發(fā)方式。從根本上說,Node.js是一種框架,是一種在瀏覽器后臺(或外部)運(yùn)行JavaScript(JS)代碼的運(yùn)行時(runtime)環(huán)境。而作為一種編程語言,由JavaScript編寫的統(tǒng)一代碼庫,不但加快了開發(fā)進(jìn)程,而且實(shí)現(xiàn)了過往我們無法完成的Web開發(fā)任務(wù)。
其實(shí),Node.js后端開發(fā)并非什么新鮮事物,它既適用于企業(yè)級的應(yīng)用程序,又適用于B2C類型的應(yīng)用。目前,Node.js后端開發(fā)已在軟件開發(fā)人員中極為流行。您可以在Netflix或PayPal等許多產(chǎn)品中,找到它的身影。而為了跟上技術(shù)的發(fā)展,您有必要知道各種有關(guān)Node.js的基礎(chǔ)知識、相關(guān)特點(diǎn)、及其優(yōu)勢。
在Web項目的開發(fā)過程中,應(yīng)用程序的后端開發(fā)質(zhì)量,往往對于業(yè)務(wù)的正常運(yùn)行,起到了至關(guān)重要的作用。在我們開始詳細(xì)討論Node.js之前,先來一起看看Node.js的主要后端競爭語言和框架。
PHP
PHP往往被程序員們廣泛地用于大、中型項目的后端開發(fā)。由于其體系結(jié)構(gòu)是事件驅(qū)動的,因此它不適合于各種實(shí)時的連接。不過,憑借著其強(qiáng)大的支持社區(qū),它能夠在眾多編程語言中脫穎而出。
Python
由于Python非常容易被上手,因此它可以被用來快速、高效地創(chuàng)建大、中型應(yīng)用項目。不過,當(dāng)Python受限于服務(wù)性能時,開發(fā)人員會選用PyPy來解決和實(shí)現(xiàn)。
Ruby
Ruby適用于一些中、小型項目。開發(fā)人員往往能夠受益于它所提供的全面文檔和龐大的社區(qū)。近年來,雖然Ruby和RoR(Ruby on Rails)框架廣為流行,但是其更新并不頻繁。
Java
Java屬于老牌多用途的編程語言。由于它是開發(fā)人員的入門級語言,因此大家對其有著深入地了解和運(yùn)用。Java通常適用于那些需要復(fù)雜計算、以及繁雜數(shù)據(jù)處理的大型企業(yè)項目中。
.Net
.Net是一個功能強(qiáng)大的Microsoft框架,適用于中、小型項目中的多種后端和前端開發(fā)場景,包括Web服務(wù)、網(wǎng)站與桌面開發(fā)等領(lǐng)域。.Net不但免費(fèi),并且可以運(yùn)行在不同的平臺上。
作為一個運(yùn)行時環(huán)境,Node.js允許程序員為應(yīng)用程序編寫、編輯并運(yùn)行JS代碼。簡單說來,它是一個用于在JavaScript中構(gòu)建應(yīng)用的平臺。其主要特征包括:
許多人認(rèn)為Node.js僅可用于Web開發(fā)。但實(shí)際上,它的使用領(lǐng)域十分豐富。下面是其中的一些典型應(yīng)用場景:
可見,能用到Node.js開發(fā)的領(lǐng)域遠(yuǎn)不止Web后端開發(fā)。我們甚至可以通過使用諸如Electron的Node.js框架,來創(chuàng)建桌面端應(yīng)用程序。
盡管Node.js非常流行,但是它仍然會有一些難以執(zhí)行的任務(wù)。為此,其社區(qū)開發(fā)出了許多既能簡化工作,又備受歡迎的框架集,例如:
人們通過選擇上述不同的Node.js框架,來滿足不同項目的特定需求。
JS雖然早在多年前就已經(jīng)在Web工程領(lǐng)域,獲得了廣泛的普及,但是如今借助著Node.js后端框架,開發(fā)人員不但可以輕松地實(shí)現(xiàn)過去基于事件的環(huán)境,所無法實(shí)現(xiàn)的功能,而且能夠使用相同的代碼,來構(gòu)建服務(wù)器端和客戶端應(yīng)用。此外,由于HTTP的請求和響應(yīng)都屬于大文件流,而Node.js恰好適合實(shí)時處理大量信息,因此它可以利用GraphQL提供的儀表板,將收集的數(shù)據(jù)可視化。
同時,Node.js的后端開發(fā)優(yōu)勢還包括:開發(fā)速度快,能夠?qū)?shù)據(jù)保存在本地的JSON中,擁有龐大的開發(fā)人員支持社區(qū),可以在最高級別上執(zhí)行數(shù)據(jù)流的傳輸,提供了出色的托管選項,而且適合于各種軟件平臺的開發(fā)。
說到Node.js的優(yōu)勢,人們往往首先想到的是降低開發(fā)的成本,以及提高開發(fā)人員的生產(chǎn)率。實(shí)際上,更重要的是,Node.js可以通過如下方面,為開發(fā)項目極大地提高應(yīng)用程序的性能:
根據(jù)2020年的一份調(diào)查顯示,Node.js憑借著其綜合優(yōu)勢,已榮登各個開發(fā)公司項目開發(fā)框架的榜首。通過使用Node.js來進(jìn)行后端開發(fā),許多IT領(lǐng)域的巨頭都在應(yīng)用程序上獲得了出色的性能和廣泛的采用。其中典型的明星公司包括:Microsoft、Uber、PayPal、Amazon、BMW、Netflix、eBay、以及Intel等。他們既會將Node.js運(yùn)用于小型項目,又能夠成功地構(gòu)建企業(yè)級的大型應(yīng)用。
根據(jù)Stackoverflow的相關(guān)統(tǒng)計,Node.js的后端開發(fā)人員在軟件市場上炙手可熱。就學(xué)習(xí)曲線而言,Node.js不僅易于從零開始,也方便在具有一定的其他編程知識的基礎(chǔ)上切入學(xué)習(xí)。當(dāng)然,這會在客觀上造成魚龍混雜的狀況。因此,如果您的團(tuán)隊需要雇傭Node.js后端開發(fā)人員時,應(yīng)仔細(xì)考量候選人的基本技能,以及參與過哪些項目。下面是可參考的部分要點(diǎn):
說到雇傭人員,我們來看兩個有關(guān)團(tuán)隊組成的相關(guān)概念,即:職能型和跨職能團(tuán)隊。
例如,您雇用了9個人來從事某個項目,其中有3位系統(tǒng)分析師、3位開發(fā)人員和3位測試人員,這就組成了一個職能型團(tuán)隊。而在跨職能團(tuán)隊里,由于人手有限,所有人都必須具備項目所需的各個領(lǐng)域的開發(fā)經(jīng)驗(包括編碼、托管、以及維護(hù)等)。而相對于職能型團(tuán)隊,跨職能團(tuán)隊的優(yōu)勢主要體現(xiàn)在:
綜上所述,正是由于Node.js采用了廣為大家所熟知的JS技術(shù),因此前端與后端人員在開發(fā)過程中,彼此的邊界已變得非常清晰。無論是團(tuán)隊成員,還是項目本身,都能夠充分受益于Node.js所帶來的各項優(yōu)勢。
文章來源:https://developer.51cto.com/art/202101/639888.htm#topx
.Express中間件原理詳解
1.中間件本質(zhì):就是一個函數(shù);
2.中間件功能:
(1)執(zhí)行任何代碼;(2)修改請求和響應(yīng)對象;(3)調(diào)用堆棧的下一個中間件;
通俗的理解,就像一個管道,新的管道可以對流過的請求,數(shù)據(jù)做處理;
3.中間件分類:
五類,原理相同,用法不同而已;
(1)應(yīng)用級中間件;(2)路由級;(3)錯誤處理類;(4)內(nèi)置(5)第三方;
4.原理:
(1)源碼中與中間件相關(guān)的三個文件
(2)application.js中的use方法,把我們app.use注冊的中間件和路由方法交給了Router類來處理。
(3)子中間件,同時掛載一系列中間件函數(shù),就會在一個掛載點(diǎn)上創(chuàng)建子中間件棧;
二.Express和KOA的對比
1.相同點(diǎn):基于node的服務(wù)端開發(fā)框架,處理的重點(diǎn)三個:
HTTP Request和HTTPRespone兩個對象的封裝和處理;
應(yīng)用聲明周期的維護(hù);
視圖的處理;
2.總體的區(qū)別:
(1)express基于connect中間件框架,自身封裝了很多功能,比如路由、視圖;
KOA基于co中間件框架,自身集成的功能很少,需要自行require;
(2)回調(diào)函數(shù)的特性:
KOA1是基于ES6的generator的,解決了回調(diào)黑洞問題;
KOA2把generatoryield換成語義化更好async和await了;
3.HTTP Request對象
(1)express使用req.query 即可拿到get請求的url格式化對象;
post請求需要body-parser中間件;
(2)koa使用this.request.query拿到get請求的url格式化對象;
post請求需要用co-body中間件;
4.路由Route
(1)express中使用,all(所有),get,post
注意app.get,一個參數(shù)表示獲取公共的配置項,兩個參數(shù)時才作為路由處理。
(2)KOA中要引入route中間件使用get、post方法,再把route掛載到app.use上;
5.HTTP Respone
express使用res對象;KOA綁定到ctx.body上,輸出json需要引人中間件;
三.基本API: 4句和5句
用nodejs,express,koa各實(shí)現(xiàn)一次爬蟲實(shí)戰(zhàn)。
三個項目代碼放到了github:https://github.com/liangchaofei/node_crawler上,可以直接下載運(yùn)行。
npm i superagent cheerio --save
npm install express superagent cheerio superagent-charset --save
$('div.g-main-bg ul.g-gxlist-imgbox li a').each(function(idx, element) { var $element = $(element); var $subElement = $element.find('img'); var thumbImgSrc = $subElement.attr('src'); items.push({ title: $(element).attr('title'), href: $element.attr('href'), thumbSrc: thumbImgSrc }); });
fs.access(path.join(__dirname, '/img.json'), fs.constants.F_OK, err => { if (err) { // 文件不存在 fs.writeFile(path.join(__dirname,'/img.json'), JSON.stringify([ { route, items } ]), err => { if(err) { console.log(err) return false } console.log('保存成功') }) } else { fs.readFile(path.join(__dirname, '/img.json'), (err, data) => { if (err) { console.log(err) return false } data = JSON.parse(data.toString()) let exist = data.some((page, index) => { return page.route == route }) if (!exist) { fs.writeFile(path.join(__dirname, 'img.json'), JSON.stringify([ ...data, { route, items }, ]), err => { if (err) { console.log(err) return false } }) } }) } res.json({ code: 200, msg: "", data: items }); })
npm i koa koa-router cheerio superagent --save
$('div .news-list .news-info dl dt a').each((index, ele) => { data.push({ title: $(ele).attr('title'), href: $(ele).attr('href') }) })
fs.access(path.join(__dirname, 'data.json'), err => { if (err) { fs.writeFile(path.join(__dirname, 'data.json'), JSON.stringify([ { data } ]), err => { if (err) { return; } }) } else { fs.readFile(path.join(__dirname, 'data.json'), (err, res) => { data = res.toString() if (err) { return; } }) } })
以上把node,express,koa都簡單的實(shí)現(xiàn)了爬蟲,面對復(fù)雜的頁面,還需要不斷的學(xué)習(xí)其他技術(shù)。
上面三個項目代碼放到了github上,可以直接下載運(yùn)行。
如果對你有幫助,歡迎star。
微信公眾號:
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。