1.Nodejs是什么?
- nodejs是基于谷歌开发的v8引擎和;ibuv库(底层库)封装的一个js的运行平台。
- node:v8引擎+libuv库 == js的运行环境/运行平台。
- nodejs的特点:事件驱动,异步编程,无阻塞异步I/O
事件驱动:JavaScript是基于对象的语言。这与Java不同,Java是面向对象的语言。而基于对象的基本特征,就是采用事件驱动。它是在用形界面的环境下,使得一切输入变化简单化。通常鼠标或热键的动作我们称之为事件,而由鼠标或热键引发的一连串程序的动作,称之为事件驱动。而对事件进行处理程序或函数,我们称之为事件处理程序。
异步编程:让程序多线程进行运行,使程序不会发生阻塞。所谓异步执行,不同于同步执行(程序的执行顺序与任务的排列顺序是一致的、同步的),每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的。
无阻塞异步I/O:异步I/O操作(asynchronous I/O operation): 不导致请求进程阻塞。非阻塞操作的进程不能进行设备操作的时候,并不挂起,它或则放弃,或者不停的查询,直到可以进行操作为止。 - 缺点:大量的匿名函数 , $(‘btn’).click(function(){})
- 应用范围:高并发业务,IO密集型业务,桌面应用。
2.npm
- npm是世界上最大的=开源代码的生态系统。
- 使用场景:
1.允许用户从NPM服务器下载别人编写的第三方包到本地 如:sliy-date-time ;
2.允许用户从NPM服务器下载并安装别人编写的命令行程序(工具)到 如:supervisor ;
3.允许用户将自己编写的包或命令行程序(工具)上传到NPM服务器供别人使用。 - 一些常用的命令:
1.npm -v 查看所安装npm的版本
2.npm -help 查看npm命令帮助 后边也可以直接跟某个命令 查看帮助文档
3.npm install 模块名@版本号 安装模块
4.npm uninstall 模块名 卸载模块
5.npm list 查看当前目录下已经安装的node包
6.npm info 模块名 查看模块的当前版本 - package.json:
1.作用:定义了这个项目所需要的各种模块,以及项目的配置信息(名称,版本,许可证等源数据)
2.创建package.json: npm init ,npm init -yes
3.安装模块并把模块写入package.josn(依赖)
npm install 模块名 --save 自动更新dependencies(配置当前程序所依赖的其他包)字段值
npm install 模块名 --save-dev 自动更新devDependencies(配置当前程序所依赖的其他包,只会下载模块,而不下载这些模块的测试节文档框架)字段值
3.淘宝镜像
- npm包官网 http://www.npmjs.org
- 淘宝npm镜像官网 http://npm.taobao.org/
- 淘宝镜像地址:npm(zip 压缩支持)命令行工具代替默认的npm
npm install -g cnpm --registry=https://registry.npm.taobao.org - 说明
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10 分钟 一次以保证尽量与官方服务同步。
4.Nodejs自启动工具supervisor
cnpm install -g supervisor
使用 supervisor 代替 node 命令启动应用
5.核心模块(内置模块)
- fs模块:引入模块,文件操作,文件夹操作
1.引入模块 let 方式=require(“fs”);
2.文件操作:
readFile 读取文件
fs.readFile(path[, options], callback)
参数 path:路径 , options:编码格式 utf-8 ,
callback:回调(err:失败的原因 data:读取到的数据)
**writeFile 覆盖式 写入**
fs.writeFile(path, data[, options], callback)
参数
path:路径
data:写入的数据
options:编码格式 utf-8
callback:回调
err:失败的原因
**appendFile 追加式 写入**
fs.appendFile(path, data[, options], callback)
参数
path:路径
data:写入的数据
options:编码格式
callback:回调
err:失败的原因
unlink 删除文件
fs.unlink(path, callback)
参数
path:路径
callback:回调
err:失败的原因
fs.rename 重命名
流操作
var rs=fs.createReadStream(path) 读取流
参数
path:路径
事件
读取:rs.on(‘data’,callback)
callback:回调
chuck:读取到的数据
读取完成:rs.on(‘end’,callback)
callback:回调
读取失败:rs.on(‘error’,callback)
callback:回调
err:失败的原因
fs.createWriteStream(path) 写入流
参数
path:路径
事件
打开:ws.on('open',callback)
callback:回调
失败:ws.on('error',callback)
callback:回调
err:失败的原因
完成:ws.on('finish',callback)
callback:回调
方法
写入:rs.write(data)
关闭:ws.end()
文件夹操作
fs.stat 检测是文件还是目录
isFile()
文件
isDirectory()
文件夹
mkdir 创建文件夹
fs.mkdir(path, callback)
callback:回调
err:失败的原因
rmdir 删除文件夹
fs.rmdir(path, callback)
callback:回调
err:失败的原因
readdir 读取文件夹
fs.rmdir(path, callback)
callback:回调
err:失败的原因
files:读取到的目录 是一个数组
- http模块
const http = require("http");
let app = http.createServer((req, res) => {
res.writeHead(200, { "content-type": "text/html;charset=utf-8" })
res.write("hello http模块 "); //向前台响应数据
res.end() //响应结束
})
app.listen(3000, () => {
console.log("3000已启动")
})
- url 模块
const url = require("url");
console.log(url);
// http://localhost:3000/?username=root&password=24345
console.log(url.parse(" http://localhost:3000/?username=root&password=24345"), true);
let obj = url.parse(" http://localhost:3000/?username=root&password=24345", true);
// parse("路径",true会将query变成对象)
console.log(obj.query);
const urlLib = require("url");
console.log(urlLib);
let obj = {
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost:3000',
port: '3000',
hostname: 'localhost',
hash: null,
search: '?username=root&password=24345',
query: 'username=root&password=24345',
pathname: '/',
path: '/?username=root&password=24345',
href: 'http://localhost:3000/?username=root&password=24345'
}
console.log(urlLib.format(obj)) //http://localhost:3000/?username=root&password=24345
// format和parse相反
// resolve这个方法返回一个格式为"from/to"的字符串,是对传入的两个参数用"/"符号进行拼接,并返回
console.log(urlLib.resolve("http://localhost:3000/", "login")); //http://localhost:3000/login
- querystring模块
const querystring = require("querystring");
console.log(querystring);
console.log(querystring.parse("username=root&password=24345"));
//[Object: null prototype] { username: 'root', password: '24345' }
console.log(querystring.stringify({ username: 'root', password: '24345' }));
// username=root&password=24345
console.log(querystring.stringify({ username: 'root', password: '24345' }, "*"));
// username=root*password=24345
console.log(querystring.stringify({ username: 'root', password: '24345' }, "*", "$"));
// username$root*password$24345
console.log(querystring.stringify({ username: 'root', password: '24345', sex: "male" }, "*", "$"));
//username$root*password$24345*sex$male
//escape("str")传入一个字符串进行编码
console.log(querystring.escape("name=张三")) //name%3D%E5%BC%A0%E4%B8%89
console.log(querystring.escape("name=zhangsan")) //name%3Dzhangsan
// 解码 unescape("str")传入一个字符串进行解码
console.log(querystring.unescape("name%3D%E5%BC%A0%E4%B8%89")) //name=张三
- path模块
//引入
const path = require("path");
// C:\Users\Administrator\Desktop\火花\node.js复习\day02\b.txt
// console.log(path)
console.log(path.basename("C:\\Users\\Administrator\\Desktop\\火花\\node.js复习\\day02\\b.txt")); //文件+后缀名 b.txt
console.log(path.dirname("C:\\Users\\Administrator\\Desktop\\火花\\node.js复习\\day02\\b.txt"));
//当前文件所在的目录地址 C:\Users\Administrator\Desktop\火花\node.js复习\day02
console.log(path.extname("C:\\Users\\Administrator\\Desktop\\火花\\node.js复习\\day02\\b.txt"));
// 扩展名.txt
console.log(path.parse("C:\\Users\\Administrator\\Desktop\\火花\\node.js复习\\day02\\b.txt"));
// {
// root: 'C:\\',
// dir: 'C:\\Users\\Administrator\\Desktop\\火花\\node.js复习\\day02',
// base: 'b.txt',
// ext: '.txt',
// name: 'b'
// }
// join
console.log(path.join("action", "login")); //action\login