废话:自高中以来一直对编程充满激情,磨剑五年,如今要毕业了,我不想用我已经擅长的知识敷衍,而想以一个全新的领域去面向我的毕设——是时候学习一下node.js

node.js基础

对于JavaScript ES6的基本语法我就直接跳过了,我们说说node端的js与web端的js的不同,node与php的区别。

node完全的单线程

php语言本身为单线程,但是在响应用户的http请求时,借助apache可以生成多个线程,即每一个请求都是一个线程,线程之间是不共享变量的。

js语言本身也和php一样是单线程,与php作为web后端不同的是,node本身也是单线程响应用户请求的,这就意味着在开发nodejs时必须十分小心变量的共享产生错误。

node非阻塞与传统阻塞

传统的php是按照事先设定的脚本顺序执行代码的,若产生IO读写时,则会产生阻塞这次请求的线程,等待IO读写完成,继续顺序执行下面的代码,这个过程中,该线程不执行任何操作。

node是事件驱动的编程方式,这也是js的语言特性之一,即事件轮询:执行程序前注册好代码中描述的所有事件,cpu不停的轮着询问,“有没有事件现在要干啊?有没有?”,当到达事件执行时候就触发执行某些函数方法。需要搭配非阻塞IO,如果产生IO读写,依然保持轮询,只要有其他方法到达执行时刻就执行该事件,而不等待IO(前提也要保证下一个事件不需要这个IO获取的数据,否则再换一个事情做)。而IO读写完成也会触发一个事件,cpu会轮询到这个事件并继续执行。这就有点类似于操作系统课程里的:“多任务调度”。

在web开发中,阻塞的就是数据库操作了。

node有没有并发处理?

node.js最令人热衷讨论的就是他所谓的“高并发”,一台普通的笔记本电脑,用node书写普通的服务器能每秒处理上千个请求!但注意node是单线程处理请求的,事实上的并行运算是不存在的,每次只接受一个请求。所以高并发是真,但并行则是假象,node如何做到这样的高并发。这就是依赖于V8对js堆栈的高速处理,由于每一个请求处理速度极快,并且最重要是不等待请求产生的IO(上面提到node不会等待IO,这期间执行其他请求和事件),使之产生了某一刻响应上千请求的“假象”。

node里的JavaScript

node中的js也遵守ES标准,但是提供了与浏览器端一些不同的API,需要注意。

process

浏览器中js我们已经非常熟悉,他的根对象叫做window,这也是浏览器已经提供给开发者最大的API,比如document就是对象下的一个属性,alert就是对象下的一个方法。

node的根对象是process,这和window是一个道理。process是一个全局访问的对象。

模块——引入外部“类库”

c语言有include,java有import,php有require,几乎任何当下流行的语言都不可缺少引入类,包,或者模块的功能函数。在nodejs中,使用require取得外部模块,以扩展当前模块的功能。

绝对模块:在nodejs中,绝对模块指的是项目目录下的node_modules目录,这个目录将会在npm安装模块后自动生成,直接require模块名即可,例如 require('colors')。

【注:有些模块(例如fs)是node自带模块,类似于c语言stdio那样的标准库不需要用npm安装,啥是npm,这是一个nodejs的包管理器,类似于ubuntu下的apt-get或者gradle这类工具】

相对模块:一般是自己写的模块,是一些js文件,在require的时候需要输入路径引用,诸如:require(./xxx),无需后缀。

模块API的暴露问题:“返回对象内容或者不”

当你写了一个模块,这就类似与java 的一个外部包,但是js的模块更像是一个类,这个“类”(模块)提供了一些属性和方法,你可以考虑“暴露”一些内容,或者私有化他们,也就是让外部模块返回一个对象给当前的的模块使用,暴不暴露需要根据实际情况而定。看以下两个例子:

如何实现“暴露”?

//module.js
exports.name = 'john';
exports.data = 'this is some data';
var private = 1; exports.getPrivate = function(){
return private;
}
//index.js
var s = require("./module");
console.log(s.name);
console.log(s.data);
console.log(s.getPrivate());

关于不需要暴露对象内容的模块,比如colors模块,这些模块直接修改了js某些数据类型的prototype,为我们使用这些类型的数据对象提供了额外的功能:

require("colors");	//注意require不需要赋值给变量了
console.log("sssssssss".rainbow);

所以将模块需要暴露的东西放到module.exports对象即可,当然你还可以直接修改node的这个exports对象来暴露API。

事件

前端编程使用addEventListener为某个dom添加事件驱动。通过jQuery也可以封装为.on(),.live()等方法来注册事件。事件注册好后,根据注册要求,比如click,tap,当这些事情发生后就会触发事件注册的代码,这类似于数据库里的触发器。

在nodejs中可以直接使用on来注册事件:

//例如以下形式:
http.server(function(req,res){
var buf = "";
req.on("data",function(data){
buf += data;
});
req.on("end",function(){
console.log("数据接受完毕!");
});
});

这是一个http数据提交请求事件注册,共注册2个事件,第一个是数据到达事件,第二个是请求结束事件,根据node的“事件驱动”非阻塞的特性,http产生的以太网数据不能一下处理完成,node会让js执行别的请求或事件,当数据到达才回来执行第一个事件的函数,当数据结束后才执行第二个函数。

使用req.emit()可以解除这个事件绑定,类似于removeEventListener。

将js进行到底:node学习笔记1的更多相关文章

  1. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

  2. node学习笔记(二)(ajax方式向node后台提交数据)

    通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...

  3. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  4. node学习笔记第一天

    ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...

  5. node学习笔记1——require参数查找策略

    require参数类型 http.fs.path等,原生模块 ./mod或../mod,相对路径的文件模块 /pathtomodule/mod,绝对路径的文件模块 mod,非原生模块的文件模块 mo ...

  6. Node学习笔记(二)

    1.package.json详解Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字 ...

  7. node学习笔记6——自定义模块

    自定义模块三大关键词: require——引入模块: exports——单个输出: module——批量输出. 从例子下手: 1.创建module.js: exports.a=22; exports. ...

  8. Node学习笔记之模块实现

    一.模块分类 由Node提供的模块,称为核心模块:部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件.在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并 ...

  9. 将js进行到底:node学习笔记2

    node重要API之FS--CLI编程初体验 所谓的"fs"就是file system! 当下几乎任何一门编程语言都会提供对文件系统读写的API,比如c语言的open()函数. 而 ...

随机推荐

  1. vlc源码研究

    有位传说中的大神告诉我,我的p2p打洞打不通是因为,sdp描述信息中的地址不对 也就是IN IP4 XXX.XXX.X.XXX这一句 我看到确实是个局域网地址,那么vlc在接收到IN IP4 XXX. ...

  2. HTMLTestRunner测试报告中文乱码问题解决

    在学习python selenium自动化测试学习中遇到HTMLTestRunner测试报告出现乱码的问题 Test Group/Test case Count Pass Fail Error Vie ...

  3. 80 行代码爬取豆瓣 Top250 电影信息并导出到 CSV 及数据库

    一.下载页面并处理 二.提取数据 观察该网站 html 结构 可知该页面下所有电影包含在 ol 标签下.每个 li 标签包含单个电影的内容. 使用 XPath 语句获取该 ol 标签 在 ol 标签中 ...

  4. Linux入门篇(三)——文件与目录

    这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...

  5. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)

    我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...

  6. JDK1.8中的线程池

    上面这段代码一直在用,面试的时候也经常被问到,却从未深究过,不知道线程池到底是怎么回事,今天看看源代码,一探其究竟 线程池主要控制的状态是ctl,它是一个原子的整数,其包含两个概念字段: worker ...

  7. JavaScript时间处理插件

    摘要:代码返回的有两种时间格式  一种是///  另外一种是---分割的 两个接收参数的说明 timestr  是接收的时间  mark是格式   默认返回的格式是///   加上-  返回的格式是- ...

  8. python3之内置函数

    1.abs() 取数字的绝对值 >>> print(abs(-28)) 28 >>> print(abs(-2.34)) 2.34 >>> pri ...

  9. 三十分钟学会AWK

    摘要: 本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK ...

  10. STM32/GD32芯片信息

    因为需要自动适配芯片进行系统配置,所以我们有必要通过读取一些系统寄存器来获取必要信息.我们的代码需要兼容STM32F1/GD32F1/STM32F0/STM32F4 代码如下: #ifdef STM3 ...