果您熟悉编程,那么您肯定听说过使用Node.js的后端开发方式。从根本上说,Node.js是一种框架,是一种在浏览器后台(或外部)运行JavaScript(JS)代码的运行时(runtime)环境。而作为一种编程语言,由JavaScript编写的统一代码库,不但加快了开发进程,而且实现了过往我们无法完成的Web开发任务。
其实,Node.js后端开发并非什么新鲜事物,它既适用于企业级的应用程序,又适用于B2C类型的应用。目前,Node.js后端开发已在软件开发人员中极为流行。您可以在Netflix或PayPal等许多产品中,找到它的身影。而为了跟上技术的发展,您有必要知道各种有关Node.js的基础知识、相关特点、及其优势。
在Web项目的开发过程中,应用程序的后端开发质量,往往对于业务的正常运行,起到了至关重要的作用。在我们开始详细讨论Node.js之前,先来一起看看Node.js的主要后端竞争语言和框架。
PHP
PHP往往被程序员们广泛地用于大、中型项目的后端开发。由于其体系结构是事件驱动的,因此它不适合于各种实时的连接。不过,凭借着其强大的支持社区,它能够在众多编程语言中脱颖而出。
Python
由于Python非常容易被上手,因此它可以被用来快速、高效地创建大、中型应用项目。不过,当Python受限于服务性能时,开发人员会选用PyPy来解决和实现。
Ruby
Ruby适用于一些中、小型项目。开发人员往往能够受益于它所提供的全面文档和庞大的社区。近年来,虽然Ruby和RoR(Ruby on Rails)框架广为流行,但是其更新并不频繁。
Java
Java属于老牌多用途的编程语言。由于它是开发人员的入门级语言,因此大家对其有着深入地了解和运用。Java通常适用于那些需要复杂计算、以及繁杂数据处理的大型企业项目中。
.Net
.Net是一个功能强大的Microsoft框架,适用于中、小型项目中的多种后端和前端开发场景,包括Web服务、网站与桌面开发等领域。.Net不但免费,并且可以运行在不同的平台上。
作为一个运行时环境,Node.js允许程序员为应用程序编写、编辑并运行JS代码。简单说来,它是一个用于在JavaScript中构建应用的平台。其主要特征包括:
许多人认为Node.js仅可用于Web开发。但实际上,它的使用领域十分丰富。下面是其中的一些典型应用场景:
可见,能用到Node.js开发的领域远不止Web后端开发。我们甚至可以通过使用诸如Electron的Node.js框架,来创建桌面端应用程序。
尽管Node.js非常流行,但是它仍然会有一些难以执行的任务。为此,其社区开发出了许多既能简化工作,又备受欢迎的框架集,例如:
人们通过选择上述不同的Node.js框架,来满足不同项目的特定需求。
JS虽然早在多年前就已经在Web工程领域,获得了广泛的普及,但是如今借助着Node.js后端框架,开发人员不但可以轻松地实现过去基于事件的环境,所无法实现的功能,而且能够使用相同的代码,来构建服务器端和客户端应用。此外,由于HTTP的请求和响应都属于大文件流,而Node.js恰好适合实时处理大量信息,因此它可以利用GraphQL提供的仪表板,将收集的数据可视化。
同时,Node.js的后端开发优势还包括:开发速度快,能够将数据保存在本地的JSON中,拥有庞大的开发人员支持社区,可以在最高级别上执行数据流的传输,提供了出色的托管选项,而且适合于各种软件平台的开发。
说到Node.js的优势,人们往往首先想到的是降低开发的成本,以及提高开发人员的生产率。实际上,更重要的是,Node.js可以通过如下方面,为开发项目极大地提高应用程序的性能:
根据2020年的一份调查显示,Node.js凭借着其综合优势,已荣登各个开发公司项目开发框架的榜首。通过使用Node.js来进行后端开发,许多IT领域的巨头都在应用程序上获得了出色的性能和广泛的采用。其中典型的明星公司包括:Microsoft、Uber、PayPal、Amazon、BMW、Netflix、eBay、以及Intel等。他们既会将Node.js运用于小型项目,又能够成功地构建企业级的大型应用。
根据Stackoverflow的相关统计,Node.js的后端开发人员在软件市场上炙手可热。就学习曲线而言,Node.js不仅易于从零开始,也方便在具有一定的其他编程知识的基础上切入学习。当然,这会在客观上造成鱼龙混杂的状况。因此,如果您的团队需要雇佣Node.js后端开发人员时,应仔细考量候选人的基本技能,以及参与过哪些项目。下面是可参考的部分要点:
说到雇佣人员,我们来看两个有关团队组成的相关概念,即:职能型和跨职能团队。
例如,您雇用了9个人来从事某个项目,其中有3位系统分析师、3位开发人员和3位测试人员,这就组成了一个职能型团队。而在跨职能团队里,由于人手有限,所有人都必须具备项目所需的各个领域的开发经验(包括编码、托管、以及维护等)。而相对于职能型团队,跨职能团队的优势主要体现在:
综上所述,正是由于Node.js采用了广为大家所熟知的JS技术,因此前端与后端人员在开发过程中,彼此的边界已变得非常清晰。无论是团队成员,还是项目本身,都能够充分受益于Node.js所带来的各项优势。
文章来源:https://developer.51cto.com/art/202101/639888.htm#topx
.Express中间件原理详解
1.中间件本质:就是一个函数;
2.中间件功能:
(1)执行任何代码;(2)修改请求和响应对象;(3)调用堆栈的下一个中间件;
通俗的理解,就像一个管道,新的管道可以对流过的请求,数据做处理;
3.中间件分类:
五类,原理相同,用法不同而已;
(1)应用级中间件;(2)路由级;(3)错误处理类;(4)内置(5)第三方;
4.原理:
(1)源码中与中间件相关的三个文件
(2)application.js中的use方法,把我们app.use注册的中间件和路由方法交给了Router类来处理。
(3)子中间件,同时挂载一系列中间件函数,就会在一个挂载点上创建子中间件栈;
二.Express和KOA的对比
1.相同点:基于node的服务端开发框架,处理的重点三个:
HTTP Request和HTTPRespone两个对象的封装和处理;
应用声明周期的维护;
视图的处理;
2.总体的区别:
(1)express基于connect中间件框架,自身封装了很多功能,比如路由、视图;
KOA基于co中间件框架,自身集成的功能很少,需要自行require;
(2)回调函数的特性:
KOA1是基于ES6的generator的,解决了回调黑洞问题;
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,一个参数表示获取公共的配置项,两个参数时才作为路由处理。
(2)KOA中要引入route中间件使用get、post方法,再把route挂载到app.use上;
5.HTTP Respone
express使用res对象;KOA绑定到ctx.body上,输出json需要引人中间件;
三.基本API: 4句和5句
用nodejs,express,koa各实现一次爬虫实战。
三个项目代码放到了github:https://github.com/liangchaofei/node_crawler上,可以直接下载运行。
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都简单的实现了爬虫,面对复杂的页面,还需要不断的学习其他技术。
上面三个项目代码放到了github上,可以直接下载运行。
如果对你有帮助,欢迎star。
微信公众号:
*请认真填写需求信息,我们会在24小时内与您取得联系。