目录
一、Node的小结
1、Node.js是什么?
Node.js是JavaScript运行时。是JavaScript的运行环境,让JavaScript可以脱离浏览器运行。Node.js其实就相当于JavaScript的编译器。
2、Node.js解决了JavaScript的什么问题?
-
更好的组织代码,提升复用性。在ES6中这一点也得到了很大的提升。
-
处理文件与数据库(实现非堵塞IO)。
-
与互联网进行沟通,以标准化的格式处理请求并发送回答。
npm详解
3、npm是什么?
是JavaScript的包管理工具,也是Node.js的默认包管理工具。是各个包的依赖管理工具。
4、npm常见命令?
初始化:npm init (默认初始化 npm init -y)
安装依赖:npm insatll 依赖包名
卸载依赖:npm uninstall 依赖名
查看配置:npm config ls
修改配置:npm config set
修改镜像:npm install packageName --registry=url
小知识: 一般情况下,使用npm下载依赖是比较慢的(因为访问的是外网不稳定),所以我们可以使用国内的镜像去下载。下面演示cnpm下载过程
下载cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
查看cnpm是否安装成功:cnpm --version
执行以上命令后,以后就可以使用cnpm下载依赖包了,这样会比npm下载速度快且稳定。
用npm下载的注意点:
npm install jquery -g //-g表示全局安装
npm install jquery --save 或 npm install jquery -S //--save 和 -S 表示生产环境安装,项目完成后直接打包,依赖也会被打包进去
npm install jquery --save-dev 或是 npm install jquery -D //表示在开发环境中安装,项目上线以后不会带有依赖
小知识:在package.json文件中的一些配置中,键为“dependencies”中表示的是开发环境中的依赖,而“devDependencies”中的依赖包则是生产环境下的依赖。
Node中有一个热部署管理模块——nodemon
下载热部署模块:npm install -g nodemon
在 package.json文件中,将键为“scripts”中将运行命令中的‘start’冒号后面的node改为 nodemon,之后就可以使用nodemon运行文件了,他可以自动加载启动服务器实现热加载。
二、Node中的模块化
模块化就是指将一些可复用的代码编写在一个文件中方便以后调用。
在Node中编写模块化代码和调用代码的方式
function strParse(str){
console.log(str);
}
module.exports = strParse //暴露模块
//引入自定义的模块
var strParse = require('模块所在文件的相对路径')
strParse('Hello !') //调用文件
Node中的三大模块
全局模块: 在项目中可随时随地访问,不需要引入
核心模块:是系统模块,不需要单独下载,就可以直接使用require()引入的模块。常见的核心模块有path模块、fs模块、http模块。
自定义模块:自己封装的模块,这个模块可以是js代码,亦可以是json文件,可直接使用require进行引入。
核心模块之path模块
path模块分为: 路径相关、文件相关、路径解析。
路径相关:
normalize:规范化path
join:将给定的path片段连接在一起
resolve:解析为绝对路径
isAbsolute:检查当前path是否为绝对路径,返回布尔值。
文件相关:
basename:返回路径中最后一部分文件名。
extname:返回文件名的扩展名
dirname:返回path路径中的文件名。
路径解析:
parse:返回一个对象其属性表示path的有效元素
format:把对象转化为一个路径字符串
核心模块之fs模块
fs同步读取与异步读取
var fs = require('fs');
// readFileSync 表示同步读取文件 返回的结果是二进制数据需要进行转化
var data = fs.readFileSync('对应文件的相对路径');
console.log(data.toString()); //toString()方法可以将而将二进制数据转化为对应字符串
//异步读取文件
fs.readFile('./abc.txt',(err,data) => {
if(err){
return console.log(err); //结束程序,并在控制台上输出错误
}
console.log(data.toString()); //打印输出读取结果
})
fs同步写入与异步写入
var fs = require('fs');
// writeFileSync 表示同步写入文件
var data = fs.writeFileSync('对应文件的相对路径','writeFileSync要写入的内容');
//异步写入文件
fs.writeFile('./文件名','writeFile要写入的内容',(err) => {
if(err){
return console.log(err); //结束程序,并在控制台上输出错误
}
console.log('写入成功!'); //写入成功,执行回调,在控制台显示 ‘写入成功’
})
核心模块之buffer模块
buffer模块的特点:
buffer使用来处理二进制数据流
buffer实例类似数组,大小固定
buffer是使用C++代码在V8堆外分配的物理内存
buffer是一个全局变量(即:不需要使用require来引入buffer)
创建buffer对象的几种方式:
//创建buffer的几种方式
let buf1 = Buffer.alloc(10) //表明创建一个10位的buffer对象,值为0
let buf2 = Buffer.alloc(5,1) //创建一个5位的buffer对象,值为1
let buf3 = Buffer.allocUnsafe(5) //表示创建一个不安全的5位buffer对象,其值是一个随机数
let buf4 = Buffer.from('hello') //将字符串转换为buffer,默认是以utf-8的字符进行编码
Buffer的方法:
Buffer.byteLength() 返回传入的值的位数。
let length = Buffer.byteLength('hello')
console.log(length) //返回的值为: 5
Buffer.isBuffer() 判断是不是buffer对象
// 创建两个对象
let a = {}
let buf = Buffer.from('hello')
console.log(Buffer.isBuffer(a)) //返回的结果:false
console.log(Buffer.isBuffer(buf)) //返回的结果:true
Buffer.concat() 将buffer对象以数组的形式传入,就可以将buffer对象连接在一起
let b1 = Buffer.from('this')
let b2 = Buffer.from('is')
let b3 = Buffer.from('buffer')
console.log(Buffer.concat([b1,b2,b3])) //结果是一个 buffer类型的十六进制
console.log(Buffer.concat([b1,b2,b3]).toString()) //将结果转换为 thisisbuffer
核心模块之events模块(事件触发器)
1、不带参数的绑定事件
//引入 events
const EventEmitter = require('events')
//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}
// 创建实例
const ce = new CustomEvent()
// 绑定方法
ce.on('test', () => {
console.log('This is test');
})
// 每隔1s中触发一次test方法
setInterval(() => {
ce.emit('test');
},1000)
2、可以传参的事件
//引入 events
const EventEmitter = require('events')
//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}
// 创建实例
const ce = new CustomEvent()
// 绑定一个传入 (错误信息) 的方法
ce.on('test', err => {
console.log(err);
})
// 每隔1s中触发一次test方法
ce.emit('test',new Error('This is error'));
3、一定条件下,移除事件
//引入 events
const EventEmitter = require('events')
//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}
// 创建实例
const ce = new CustomEvent()
function fn1(){
console.log('fn1');
}
function fn2(){
console.log('fn2');
}
ce.on('test',fn1)
ce.on('test',fn2)
// 每隔1s中触发一次test方法
setInterval(() => {
ce.emit('test',new Error('This is error'));
},500)
setInterval(() => {
//ce.removeListener('test',fn1)//过1500毫秒移除事件函数fn1
ce.removeAllListener('test')//过1500毫秒移除全部事件函数
},1500)
核心模块之http模块
http模块让Node.js具备了服务器的能力。
const http = require('http');
// 创建服务器对象
var app = http.createServer(function (req, resp) {
// 将要响应给客户端的内容(resp.write()中只能写英文,中文会有乱码问题)
resp.write('hello world')
// resp.end()必须要有,不然resp的内容不会在客户端显示
resp.end()
})
// 服务器的监听
app.listen(3000,function(){
console.log('服务器启动成功!')
})
运行Server.js文件:到该文件所在的路径下,打开DOS,输入 node Server.js,回车
DOS中会有一个光标一直闪烁,等待客户端的请求。
使用fs读取一个html文件,然后使用resp.write()写入
Server.js文件
const http = require('http');
const fs = require('fs');
// 创建服务器对象
var app = http.createServer(function (req, resp) {
let content = fs.readFileSync('./index.html');
resp.write(content.toString())
resp.end()
})
// 服务器的监听
app.listen(3000,function(){
console.log('服务器启动成功!')
})
被读取的index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
h1{
font-family: '宋体';
color: royalblue;
}
</style>
</head>
<body>
<h1>Hello World ! ! !</h1>
</body>
</html>