Node.js知识学习总结

一、什么是node.js?

Node.js是一个Javascript运行环境。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。

node.js的本质:是一个能编译你写的js代码并让计算机识别并执行的编译环境,一般我们会用的到浏览器的内核来编译解析我们的JS代码,而Node是另一种运行环境(所以Node.js是一个平台,不是一种语言,更不是什么后端语言,也不是什么前端框架,它是由C++编写的JavaScript的运行环境—— 虚拟机)。

举个例子:
打开你的Chrome进入到console的窗口,输入window得到的是浏览器的顶层对象。打开命令行输入node进入node环境,在node环境下输入window会产生报错。这是为什么呢?因为虽然两个环境都是能运行解析JavaScript的,但是它们的底层是不一样的,在node中并没有window这个对象,它有的是 process这个全局对象。

1.总结:

  • node.js不是一门语言
  • node.js不是库,不是框架
  • node.js是一个JavaScript运行时环境
  • 简单点来讲就是node.js可以解析和执行JavaScript代码
  • 以前只有浏览器可以解析执行JavaScript代码,现在的JavaScript完全可以脱离浏览器来运行,归功于node.js

2.浏览器中的JavaScript

  • EcmaScript
  • BOM
  • DOM

3.node.js中的JavaScript

  • 没有BOM、DOM
  • 有EcmaScript
  • 在node.js这个JavaScript执行环境中为JavaScript提供了一些服务器级别的操作API,例如:
(1)文件的读写

(2)网络服务的构建

(3)网络通信

(4)http服务器......

4.npm

  • npm是世界上最大的开源库生态系统
  • 绝大多数JavaScript相关的包都存放在了npm上,这样做的目的是为了让开发人员更方便地去下载使用,例如:npm install jquery

5.node.js 的特性

  • 事件驱动
  • 非阻塞IO模型(异步)
  • 轻量和高效

6.node.js构建于Chrome的V8引擎之上

  • 代码只是具有特定格式的字符串而已
  • 引擎可以认识它,可以帮你去解析和执行
  • Google Chrome 的 V8 引擎是目前世界上公认解析执行JavaScript代码最快的引擎
  • node.js作者把 Google Chrome 中的 V8 引擎移植了出来,开发了一个独立的JavaScript运行时环境

7.node.js能做什么

  • .web服务器后台
  • 命令行工具
(1)npm(node)

(2)git(c语言)

(3)hexo(node)......
  • 对于前端开发工程师来讲,接触node最多的是它的命令行工具,自己写的很少,主要是使用别人(第三方)开发的:
(1)webpake

(2)gulp

(3)npm

二、node.js能学到什么?

1.B/S模型编程(Browser-Server)

2.模块化编程

  • RequireJS
  • SeaJS
  • 以前认知的JavaScript只能通过script标签来加载,在node.js中可以像@import()一样来引用JavaScript脚本文件

3.node常用的API

4.异步编程

  • 回调函数
  • Promise
  • async
  • generator

5.Express Web 开发框架

6.ES6

三、node.js的优点

1. 解析js代码

没有浏览器安全级的限制

2.提供系统级别的API

(1)文件的读入

(2)进程的管理

(3)网络通信

3.单线程

Node.js可以在不新增额外线程的情况下,依然可以对任务进行并发处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并发操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

4.非阻塞IO

所有API异步是非阻塞。

5.事件驱动

6.V8虚拟机

正在构建在谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。

7.无缓冲

Node.js的应用从来没有缓冲任何数据。这些应用程序只需输出块中的数据。(即流应用)

三、如何使用node.js?

1.在官网下载node.js后,打开cmd/git bash输入以下命令:
Node.js知识学习总结_第1张图片
如显示版本号,则表示安装成功。

2.在文件夹中执行以下命令

$ npm install colors

该命令意思是在该文件夹下安装colors这个模块。

可以在该文件夹下面新建一个JS文件,内容为

require('colors')
console.log('smashing node'.rainbow)

执行文件

$ node **.js  //这里可以忽略文件的后缀名js

正常情况就能看到输出的文件已经有不同颜色的效果。

四、node中的JS —— 模块系统

1.在node中,模块有三种:

  • 具名的核心模块:例如fs、http等
  • 用户自己编写的模块:相对路径必须加./

在node中,没有全局作用域,只有模块作用域,如a.js引入b.js文件后,a.js中用var定义的变量不能作用到b.js中。
Node.js知识学习总结_第2张图片
那我们如何解决上述问题呢?我们可以exports对象来解决

2. exports

每个文件模块中都提供了一个对象:exportsexports默认是一个空对象
Node.js知识学习总结_第3张图片
通过上述代码中的方式我们就可以在a.js中通过req.foo这样的方式来调用b.js中的东西了

五、node.js中提供的API

1.读写文件(fs模块)

(1)读文件:readFile()方法

let fs = require("fs");

//第一个参数:文件路径
//第二个参数:回调函数
/*回调函数参数:
     第一个参数:错误信息
     第二个参数:文件数据
*/
/*
    文件读取成功:error返回null,data返回数据
    文件读取失败:error返回错误对象,data返回undefined没有数据
*/
fs.readFile("./hello_world.txt",function(error,data){  
    console.log(data)  //输出16进制数据
    console.log(data.toString())  //将16进制转为字符串
})

(2)写文件:writeFile()方法

let fs = require("fs");

//第一个参数:文件路径
//第二个参数:写入的内容
//第三个参数:回调函数
/*
    回调函数中的error参数:
        文件写入成功:返回null
        文件写入失败:返回错误对象
*/
fs.writeFile("./hello.txt","你好,我是node.js!",function(error){
    console.log(error)  //输出null
})

2.创建Web服务器(http模块)

//1.加载http核心模块
let http = require("http");

//2.使用http.createServer()方法创建一个web服务器,返回一个server实例
let server = http.createServer();

/*
    服务器要干嘛?
        提供服务:对数据的服务
        a.客户端发送请求;
        b.服务器接受请求;
        c.服务器处理请求;
        d.服务器给客户端反馈(发送响应);
*/
//3.注册request(不能改名)请求事件:
//	当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
server.on("request",function(){
    console.log("接收到客户端的请求了!")
})

//4.绑定端口号,启动服务器
server.listen(3000,function(){
    console.log("服务器启动成功,可以通过http://127.0.0.1:3000/来进行访问!")
})

运行结果
Node.js知识学习总结_第4张图片
输入网址请求几次,命令行就会显示几次接收成功的消息,如果按ctrl+c关闭服务器,再次请求,页面会显示无法找到网站。

发送响应

将响应的数据呈现给客户端

let http = require("http");

let server = http.createServer();

// request 请求事件处理函数,需要接收两个参数:
//     Request 请求对象:
//         可以用来获取客户端的一些请求信息,例如:请求路径
//     Respose 响应对象:
//         可以用来给客户端发送响应信息
server.on("request",function(request,response){
    // http://127.0.0.1:3000/  输出 / 
    // http://127.0.0.1:3000/a  输出 /a 
    // http://127.0.0.1:3000/a/b  输出 /a/b  
    console.log("接收到客户端的请求了,请求路径是"+request.url)

    // response 对象只有一个方法: write 可以用来给客户端发送响应数据
    // write 可以多次使用,但是最后一定要用 end 方法来结束响应,否则客户端会一直等待,即页面不会显示响应的数据
    response.write("hello")
    response.write(" node.js!")
    // 告诉客户端,我的话说完了,你可以呈递给用户了
    response.end()
})

server.listen(3000,function(){
    console.log("服务器启动成功,可以通过http://127.0.0.1:3000/来进行访问!")
})

运行结果
Node.js知识学习总结_第5张图片
Node.js知识学习总结_第6张图片
下面我们来思考一个问题:

如果我希望当请求不同的路径的时候响应不同的结果,例如:
    输入http://127.0.0.1:3000/的时候,           响应index
    输入http://127.0.0.1:3000/login的时候,      响应登录
    输入http://127.0.0.1:3000/register的时候,   响应注册

那我们是不是可以用判断语句来解决这个问题。

let http = require("http")

let server = http.createServer()

server.on("request",function(req, res){
    console.log("收到请求了,请求的地址是:"+ req.url)
    res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
    // res.write("hello")
    // res.write(" world!")
    // res.end()

    //一般我们不会像以上那样用多个write方法来输出响应的内容
    //我们一般用end方法结束响应的时候去输出响应的内容,如:
    //res.end("hello world!")
    let url = req.url
    if(url == "/"){
        //注意:响应的内容只能是二进制数据或者字符串
        //数字、对象、数组、布尔值等不能响应
        //可以通过JSON.stringify()等方法先转换再传入
        res.end("index")
    }else if(url == "/login"){

        res.end("登录")
    }else if(url == "register"){
        res.end("注册")
    }
})

server.listen(3000,function(){
    console.log("服务器启动成功,可以通过http://127.0.0.1:3000/来进行访问!")
})

解决乱码的方法

res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});

补充:

1.  IP地址用来定位计算机

2. 端口号用来定位具体的应用程序(所有需要联网通信的软件都必须占有一个端口号) 

你可能感兴趣的:(node.js)