node.js是一个基于Chrome v8引擎的JavaScript运行环境
之前我们编写的JavaScript代码都是在浏览器中运行的,所以我们可以直接在浏览器中敲代码,然后直接运行。现在学习node.js,代码不能直接在浏览器运行,而要在node环境中运行
node特点与优势:
特点:事件驱动、无阻塞的io模型
优势:轻量高效
命令行模式和Node交互模式
命令行模式:看到类似C:>是在Windows提供的命令行模式,如下
在命令行模式下 可以输入node 文件名.js执行一个文件
cd // 切换目录 cd 文件夹 // 进入目标文件
cd .. // 返回上一级 d: // 进入D盘
md 新建文件夹名称 // 新建文件夹 (当前路径指向哪里 文件夹就存储在哪里 比如C:UserAdministrator> md h 新建的文件夹h存储在C盘的User下的Administrator中)
rd 文件夹名称 //删除文件夹
node交互模式:看到 > 是在node交互模式下,如下
在node交互模式下 我们可以输入JavaScript代码立刻执行
这两种模式下运行的javascript代码有不同之处:node交互环境会把每一行javascript代码自动打印出来,但是直接运行javascript文件却不会,除非加上console.log自己打印出来
进入当前文件夹运行javascript代码的两种方法:
- 找到当前项目文件夹并打开——>Shift+鼠标右键——>点击在此处打开命令窗口——>node+空格+文件名.js运行文件
- Windown+r打开cmd命令面板——>输入cd+指定文件夹(cls可以清除当前屏幕)
模块系统:
一个文件就是一个模块,模块有作用域,在一个模块中的变量和函数对象都属于这个模块,对外是不可见的。node属于模块化的开发
node.js常用模块:
- http模块 引用:var http = require("http") 作用:可编写一个http协议客户端程序(浏览器),也可以编写一个基于http协议的服务端程序(apache)
- url模块 引用:var url = require("url") 作用:将url地址各部分转换为js对象属性
- querystring模块 引用:var querystring = require("querystring") 作用:将查询字符串转换为对象
- fs模块 引用: var fs = require("fs") 作用:读取文件
异步读文件:readFile(path,utf8,回调函数)
var fs = require("fs");
fs.readFile("test.js",utf8,function(err,data){ //test.js必须在当前目录下
if(err){
throw err;
else{
console.log(data)
}
});
同步读文件:readFileSync(path,utf8)
var fs = require("fs")
var data = readFileSync("text.html",utf8);
console.log(data);
异步写文件
fs.writeFile("文件路径","写入的内容",utf8,(err)=>{ //如果文件不存在,会自动创建文件 但是不能创建文件夹
console.log(err); //当输出为null表示成功
}
同步写文件
fs.writeFileSync("文件路径","同步写入",utf8)
在fs模块中,提供同步方法是为了方便使用,那么到底使用同步还是异步呢?node环境执行的javascript代码是服务端代码,所以绝大部分需要在服务器运行反复执行业务逻辑的代码,必须使用异步代码
下面了解一下下几个概念
IO:也就是input和output电脑的输入输出,由于网络中传输的都是字符串,io在服务器中可以理解为读写操作
并发:在一段时间内有几个程序都是属于启动到运行完毕之间的状态
异步分两种:异步io和异步非io
异步io:想要了解这个概念,首先知道进程和线程,进程是为运行当中的应用程序所提供的运行环境,一个运行当中的应用程序,至少会有一个进程所对应。线程是用来运行程序中的代码的,一个线程只能在一个时间内做一件事。node是单线程的异步操作 是用异步代替了多线程(多线程调试复杂) 异步的io操作:ajax 网络操作 fs
异步的非io操作:setTimeout setInterval(只有这两个)
node程序运行过程:主线程一直在循环,知道队列里面没有代码,程序就结束了 子线程一直在线程池里休息,用来执行异步的io操作 子线程:a.在线程池里休息 b.异步io进来,解决异步io操作 c.子线程会把异步io的操作结果callback到队列中 d.继续回线程中休息
事件驱动:node执行代码时,会把代码放入队列中,事件循环程序把队列同步代码先执行,同步代码执行后才会执行异步代码
一个简单服务器的搭建
const http = require("http"); //引入http模块
http.createServer(function(req,res){ //开启本地http服务 监听相应端口
res.writeHead(200,{"Content-Type" : "text/html;charset=utf8"})
res.end("我是一个服务器"); //结束请求 只能有一个
}).listen(3000);