初始Nodejs


Posted in NodeJs onNovember 08, 2014

基本概念

Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台。可以说,Node.js开创了javascript模块化开发的先河,早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 类。最后node.js的出现才开始有了js模块化开发的概念,这使得臃肿的js代码免去了命名冲突等一系列开发难题。

Node最大的特点就是采用了异步式I/O与事件驱动的架构设计。Node.js是一个让js运行在浏览器外的平台。其最初目标是实现事件驱动,非阻塞I/O的web服务器

Node.js 只是一个 JavaScript 的运行环境(或者说是一组库), 为标准 js 补充了有关异步 IO, 即读写网络和文件的功能。
一个库嘛,无非是调调 API 什么的,除了略反人类的事件回调之外,和其他后端语言(PHP, Python)也差不了多少。

Node.js使用的是单线程模式,每一个线程完成一个功能,一个进程可以有多个线程,对于所有的I/O都采用异步式的请求方式。每个异步式I/O请求完成后都会被推送到事件队列,等待程序进程进行处理。

总之,node的核心思想就是:非阻塞,单线程和事件驱动。(同步对应的是阻塞,异步对应的是非阻塞)

Node.JS架构示意图
初始Nodejs

单线程

javascript语言的执行环境是"单线程"(single thread)。
所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无 响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

大部分 Web 应用的瓶颈都在 I/O, 即读写磁盘,读写网络,读写数据库。使用怎样的策略等待这段时间,就成了改善性能的关键点

同步与异步

为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;"异步模式"则完全不同, 每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执 行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

"异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。在服务器端,"异步模式"甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有http请求,服务器性能会急剧下降,很快就会失去响应。

进程与线程

mac系统中的进程与线程

初始Nodejs

从图中我们可以看出,一个进程可以包括多个线程,进程就好比工程里的车间,线程就是这个车间的工人,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

区别

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。

初始Nodejs

模块和包模块

模块:一个实现某些特定功能的文件,以实现模块化编程。通过require(模块名)引入模块.
—模块中的功能(如:变量,函数)通过赋给exports对象的某个属性提供给调用者使用。

如何使用模块?

在Node中使用模块是非常方便的,在 JavaScript 代码中可以直接使用全局函数 require() 来加载一个模块。例如,我们可以使用require("http")来加载node中自带的http服务器模块,

包:包是一个文件夹,它将模块封装起来,用于发布、更新、依赖管理和版本控制。通过package.json来描述包的信息:入口文件,依赖的外部包等等。通过npm install命令来安装包,并通过require使用包。

异步式 I/O 与事件驱动

Node.js 的异步机制是基于事件的,每一个 I/O就是一次请求,所有的磁盘 I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。如下图所示:

初始Nodejs

Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU 和内存在同一时间集中处理一件事,同时尽可能让耗时的 I/O 操作并行执行

初始Nodejs

开始node编程

在这里,我推荐大家使用webstorm进行node.js的开发,方便又快捷,比起cmd,或者Mac下的终端都好用太多了。

至于node的安装大家就自行百度吧,这里就不赘述了,看下webstorm下的node编程界面吧:
我们只需要在编写好的node代码界面按鼠标右键,然后点击Run就行啦,方便又快捷吧

初始Nodejs

下面是node的输出界面:

初始Nodejs

Mac系统下进行web开发,我推荐大家使用的三款工具是:coda2,webstorm和Sublime text3这些是目前我已经的最好的开发工具了,大家不妨试试哪个更符合自己的口味。

webstorm进行node开发需要先配置一定的文件,大家就自行百度吧,因为我的webstorm已经配置好了,所以没法截图给大家看步骤了,大概步骤是,在mac系统下是先点击顶部栏的webstorm,然后点击perference,然后点击Node.js and NPM,然后在右侧点击configure配置,最后大概会是下面这个样子:

初始Nodejs

windows系统下和这个流程步骤大概相似啊,我使用的版本是8.0.4的。

全局变量

在js编程中,我们最好给每个变量都添加上var关键字,以免污染全局命名空间,提高代码的耦合风险。

console

console用于向标准输出流standout(stdout)和标准错误流(stderr)输出字符。

console.log()向标准输出流打印字符并以换行符结束,其接受多个参数,将以类似C语言的printf()格式输出

初始Nodejs

console.log(__dirname)输出文件目录

计算代码运行时间

console.time(label) 
console.timeEnd(label)

初始Nodejs

我们只需在开始和结束那里给同样一个标签即可,中间放你想要计算执行时间的任何代码。

__filename__dirname

console.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js
 console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon
NodeJs 相关文章推荐
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 #NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 #NodeJs
Nodejs极简入门教程(一):模块机制
Oct 25 #NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 #NodeJs
You might like
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
python实现批量改文件名称的方法
2015/05/25 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
python IDLE添加行号显示教程
2020/04/25 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
手术室护士自我鉴定
2013/10/14 职场文书
班主任工作年限证明
2014/01/12 职场文书
学校运动会霸气口号
2014/06/07 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
python单向链表实例详解
2022/05/25 Python