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.总结:
2.浏览器中的JavaScript
3.node.js中的JavaScript
(1)文件的读写
(2)网络服务的构建
(3)网络通信
(4)http服务器......
4.npm
npm install jquery
5.node.js 的特性
6.node.js构建于Chrome的V8引擎之上
7.node.js能做什么
(1)npm(node)
(2)git(c语言)
(3)hexo(node)......
(1)webpake
(2)gulp
(3)npm
1.B/S模型编程(Browser-Server)
2.模块化编程
@import()
一样来引用JavaScript脚本文件3.node常用的API
4.异步编程
5.Express Web 开发框架
6.ES6
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的应用从来没有缓冲任何数据。这些应用程序只需输出块中的数据。(即流应用)
1.在官网下载node.js后,打开cmd/git bash输入以下命令:
如显示版本号,则表示安装成功。
2.在文件夹中执行以下命令
$ npm install colors
该命令意思是在该文件夹下安装colors这个模块。
可以在该文件夹下面新建一个JS文件,内容为
require('colors')
console.log('smashing node'.rainbow)
执行文件
$ node **.js //这里可以忽略文件的后缀名js
正常情况就能看到输出的文件已经有不同颜色的效果。
在node中,没有全局作用域,只有模块作用域,如a.js引入b.js文件后,a.js中用var定义的变量不能作用到b.js中。
那我们如何解决上述问题呢?我们可以exports
对象来解决
每个文件模块中都提供了一个对象:exports
,exports
默认是一个空对象
通过上述代码中的方式我们就可以在a.js
中通过req.foo
这样的方式来调用b.js
中的东西了
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/来进行访问!")
})
运行结果
输入网址请求几次,命令行就会显示几次接收成功的消息,如果按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/来进行访问!")
})
如果我希望当请求不同的路径的时候响应不同的结果,例如:
输入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. 端口号用来定位具体的应用程序(所有需要联网通信的软件都必须占有一个端口号)