nodejs --- 核心概念
nodejs是2009年有Ryan Dahl利用google的V8引擎打造的基于事件循环实现的异步I/O框架,它选择JavaScript作为开发语言,正是因为V8的性能远超过其他脚本语言。目前express、socket.io这样的node框架在github上都有着极高的排名。国内的公司如阿里巴巴、网易、腾讯、新浪、百度等公司的很多线上产品都纷纷改用node并且取得了很好的成果。
我们可以通过nodejs搭建服务器,这样就可以发送请求和接收数据了。
推荐使用https://zealdocs.org这个离线node的api文档,多看看文档有好处。
第一部分:nodejs实例
1. nodejs和js相同之处: 打开gitbash,输入node随即进入了node环境,然后输入console.log("hellow world");可以发现就已经成功输出hello world 了! 如下所示:
2. nodejs和js不同之初: 打开console控制台,输入window,可以发现window这个全局变量中有很多的属性,而在node中输入却是无效的,提示window is not defined。 在node 中输入process (这是node的全局变量),可以发现输出如下:
这里process中包含了node的各种信息,即版本号、npm等等,而把它输入到console控制台中,我们可以发现process是未定义的。 这就是node 和 js 不同之处。
第二部分:nodejs特点
node虽然是后台语言,但是它保留了前端浏览器JavaScript中那些熟悉的接口,并没有改变语言本身的任何特性。
特点一: 异步I/O
我们知道再发出一个ajax请求之后,ajax默认是异步的,也就是说发出请求后并不会影响后续代码的执行,如下所示:
$.post('/url',{title:'nodejs'},function(data){
console.log("我是先发送的ajax请求");
});
console.log("我是后发送的js语句");
正是由于ajax是异步的,所以上面的代码中"我是后发送的js语句"是先输出的,因为在调用$.post()之后,后续代码是立即执行的,而“我是先发送的ajax请求”的执行时间是不被预期的,这样的好处就是你发送你的ajax请求,并不会影响后面的程序的程序执行,从而使得代码的执行效率提高。
node中异步I/O也是非常常见的,正如ajax一般,举例如下:
var example = require('example');
example.doSomething('/path',function (error,file) {
console.log("读取文件完成");
});
console.log("发起读取文件");
这就是nodejs,常常会用到require方法来获取一个模块,这里“发起读取文件”是在“读取文件完成”的语句之后,但确实最先输出的,这就体现了node的异步I/O特点。
在node中,绝大多数的操作都是以异步的方式进行调用。意义是:每个调用之间无需等待之前的I/O调用结束,在变成模型上可以极大的提升效率。
example.doSomething('/path',function (error,file) {
console.log("文件完成");
});
example.doSomething('/path',function (error,file) {
console.log("读取文件");
});
如这两个语句总共的完成时间取决于两者耗时最长的一个。 而如果采用同步I/O的方式, 两个语句的完成时间将是两者之和。
为什么要使用异步I/O呢?因为通过异步I/O,在异步操作后面的语句就可以立即执行,而不会等待这个I/O执行结束之后再执行,另外,我们知道,因为是异步I/O,尤其是在node端,可能会有很多读取文件的操作,readFile等等,虽然cpu很快,但是去硬盘中读取文件的这个I/O操作是很慢的,所以为了增加效率,提高cpu的使用率,我们就可以使用异步I/O的方式,使得后面语句的执行不会受到前面的I/O操作的影响,这就是异步I/O操作的好处了。
那么究竟是怎么样的机制支持了这样的异步I/O呢,我们可以仔细考察一番。
首先,我们需要知道的时异步 !== 多线程, https://stackoverflow.com/questions/34680985/what-is-the-difference-between-asynchronous-programming-and-multithreading。把这个看完了就知道同步、异步单线程、异步多线程的区别了。
翻译
对于异步和多线程,你的误解是非常普遍的。 很多人被告诉: 多线程和异步是同一回事,但实际上并不是这样的。
一个类比通常是有用的。 场景: 你在饭馆里做饭,你个订单来了 --- 需要鸡蛋和烤面包。
- 同步: 你第一步开始煮鸡蛋,做完鸡蛋之后在烤面包。
- 异步,单线程: 你开始煮鸡蛋时设置一个定时器。 你又开始烤面包,又使用了一个定时器。 当这两个都被烹饪的时候,你便在打扫厨房。 当定时器停止运转的时候,你把鸡蛋从锅里拿出来然后从面包机里把烤面包拿出来。最后给server。
- 异步,多线程: 你又雇了另外两个厨师。 一个厨师去专门煮鸡蛋,另外一个专门去烤面包。 所以现在你的问题就在于如何协调好两个厨师的合作以至于他们不会产生冲突(当分享资源的时候),然后你给他们付钱就好了。
译者注:我们可以这里理解,这里的 你 就是cpu, 也就是人类的大脑。 当同步的时候,你需要一个一个地去做,你也是负责指挥工作,比如煮上鸡蛋、定时,而在煮鸡蛋的时候,即煮鸡蛋的工具就不是cpu干的了,这个cpu会一直盯着,盯着鸡蛋煮完,然后去开始做其他的工作。 当异步多线程的时候, 你这个cpu又找了几个人来干活,就是多线程,显然,多线程的资源分配是cpu需要协调的问题。
总之: cpu并不是把所有的工作都做了,而是做主要的指导,相当于政委,真正干活的还是其他的一些部件,比如外部设备等。现在, 多线程仅仅是异步的一种,有什么意分配任务给workers。 在单线程异步的工作流中, 你有一个任务表,并且这些任务决定于其他任务的结果(多线程异步不是这样的),因为每个任务完成之后,就会提醒代码,这个代码就会去安排下一个任务,给出刚刚完成任务的结果。 但是你仅仅需要一个worker去完成所有任务,而不是一个worker完成一个任务。
这将会帮助你实现实现很多处理器限制的任务。对于有处理器束缚的任务,他将会变得有意义,即雇佣尽可能多的workers(线程),给每一个任务都分配一个线程, 给每一个worker分配一个处理器,并且使得每一个处理器尽可能快的完成任务。 但是对于很多任务来说, 他们根本就不需要cpu处理器,所以你不需要给他们单独都分配一个worker。你只是需要等待一个消息,就是他完成了,然后就可以去接着做了。 当信息到达的时候,你就可以继续做安排好的任务。
特点二:事件与回调函数
与其他后端语言不同,node将前端浏览器中运用广泛且成熟的事件引入后端,并配合异步I/P|O,将事件点暴露给业务逻辑。
var http = require("http");
var querystring = require("querystring"); // 侦听服务器的request事件,req 为 request ,res 为 respond
// node既然为后台语言,就可以建立服务器,服务器就是用于request(接收请求)和respond(响应请求)的。
http.createServer(function (req,res) {
var postData = '';
req.setEncoding('utf8');
//侦听请求的data事件,一旦有了请求,就触发事件,postData(将要返回的data)就加上trunk
// 和jquery类似,使用on 来绑定事件
req.on('data',function (trunk) {
postData +=trunk;
});
//侦听请求的end事件
req.on('end',function () {
res.end(postData);
});
}).listen();
console.log("服务器启动完成");
于是我们可以看到node是可以绑定事件的,还可以链式调用,另外大量使用回调函数也是一大特色,值得注意的是------回调函数是最好的接受异步调用返回的数据的方式。
特点三:单线程
和js一样,node也保留了单线程的特点。注:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 对进程和线程做了较为形象的讲解。
单线程的最大好处在于不用像多线程那样出处在意状态的同步问题,这里没有死锁的存在。缺点就是无法利用多核cpu,错误会引起整个应用退出,应用的健壮性值得考验。
特点四:跨平台
起初的node只能在linux系统上使用,后来微软帮助其使得可以在windows操作系统上使用。
第三部分:node应用场景
我们都知道node,但是它具体会在什么情况下使用呢?
I/O 密集型
刚刚我们提到了node的特点之一就是异步I/O,这样可以大大提升单线程情况下处理I/O的效率,于是对于I/O密集型的应用场景使用node是最好的,它能够有效的组织起更多的硬件资源,从而提供更好地服务。
node使用者
- 前后端编程语言环境统一。 代表是雅虎,将YUI3这个框架的能力借助node延伸到服务器端,使得使用者摆脱了日常工作中一边写JavaScript一边写PHP所带来的上下文交换负担。
- Node带来的高性能I/O用于实时应用。 腾讯使用提供实时功能,花瓣网、蘑菇街使用socket.io实现实时通知的功能。
- 游戏开发领域。 网易开源了pomelo框架,可以在游戏和高实时应用中使用。
nodejs学习资源
慕课网、网易云课堂
nodejs.org 即nodejs官网
npmjs.org
github.com 阅读源码可以很快地提高
stackoverflow 这里有大量的答案可以寻找,可以解决我们常见的问题。
http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 入门教程
nodejs --- 核心概念的更多相关文章
- webpack安装与核心概念
安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...
- Angular核心概念
一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...
- 领域驱动设计(DDD)部分核心概念的个人理解
领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...
- Javascript本质第一篇:核心概念
很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...
- [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)
本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...
- spring技术核心概念纪要
一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...
- ElasticSearch学习笔记-01 简介、安装、配置与核心概念
一.简介 ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进 ...
- Playmaker Input篇教程之引入的核心概念
Playmaker Input篇教程之引入的核心概念 Playmaker Input引入的核心概念 Playmaker引入了4个核心概念:状态机.动作.变量和事件.了解它们是学习操作Playmaker ...
- Maven的几个核心概念
POM (Project Object Model) 一个项目所有的配置都放置在 POM 文件中:定义项目的类型.名字,管理依赖关系,定制插件的行为等等.比如说,你可以配置 compiler 插件让它 ...
随机推荐
- (转)走进AngularJs(六) 服务
原文地址:http://www.cnblogs.com/lvdabao/p/3464015.html 今天学习了一下ng的service机制,作为ng的基本知识之一,有必要做一个了解,在此做个笔记记录 ...
- 编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法
建议101:使用扩展方法,向现有类型“添加”方法 考虑如何让一个sealed类型具备新的行为.以往我们会创建一个包装器类,然后为其添加方法,而这看上去一点儿也不优雅.我们也许会考虑修改设计,直接修改s ...
- BZOJ 1878 hh的项链(简单莫队)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- Middleware / 中间件
中间件格式 module.exports = options => { return (ctx, next) => { // do something } } 中间件格式为一个高阶函数,外 ...
- [示例] 使用 TStopwatch 计时
使用 TStopwatch 计时 uses System.Diagnostics; var t1: TStopwatch; begin t1 := TStopwatch.StartNew; // do ...
- Retrofit+Rxjava observable转javabean失败
报错提示: Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex. ...
- Spring学习(四)——使用Spring JDBC访问数据库
本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3824294.html的Demo程序的基础上增加数据持久层和业务层,实现登录验证功能. 1.修改gradle文件 ...
- 爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储
工程目录结构 spiders下的first源码 # -*- coding: utf- -*- import scrapy from firstBlood.items import Firstblood ...
- Excel转Json工具
应用程序在本地的数据配置的格式一般有JSON.XML.YAML.INI等格式,但是如果直接编写JSON数据往往不是特别方便, 今天给大家分享的是如何在EXCEL配置好数据,然后一键转换成JSON和C# ...
- 关于dm-file-uploader(dmUploader)上传时传参
官网:https://github.com/danielm/uploaderDemo Online https://danielmg.org/demo/java-script/uploader/bas ...