一、Node的模块化管理
1、模块化:node应用程序由模块组成。遵循的是CommonJS模块规范。使用模块管理的好处是隔离模块的作用域,避免出现命名冲突。
2、什么是CommonJS:是一套代码的规范,构建一个在浏览器之外的JavaScript语言的生态系统。
3、CommonJS规范的主要内容:
(1)通过module.exports导出对外的变量或接口
(2)通过require将其他模块导入到当前模块的作用域中
4、CommonJS的特点:
(1)所有模块都运行在当前模块的作用域中,不会污染全局作用域
(2)模块是同步加载,根据文件中模块出现的顺序依次加载
(3)模块可以多次加载,但只有在第一次加载时运行,其他的加载会放入缓存中,后面再使用时直接从缓存中读取
二、Node的Module对象
1、在node内部定义了一个Module构造函数,构造函数的属性有:
(1)id:表示模块的标识符
(2)parent:表示调用模块的模块
(3)exports:表示导出的值
(4)paths:表示模块(第三方模块)的查找路径。当前目录的node_modules —>父目录的node_modules—->…..—>根目录下的node_modules
(5)path:当前模块所在的路径
(6)filename:当前模块所在的文件名
强调:在CommonJS规范中所有的模块都是Module的实例(对象)
2、exports变量:该变量指向module.exports,作用是方便用户的操作
exports.area = function(r){
return Math.PI * r**2
}
强调:不能直接给exports赋一个值,这样就切断了exports与module.exports之间的连续。不能进行导出了
三、require命令:是node的内置命令,主要用于加载模块文件
1、作用:导入并运行JavaScript文件,返回的是exports对象
2、加载规则:
(1)加载文件的默认后缀名是:.js
(2)如果参数字符串以’/‘开头,表示加载的文件是位于绝对路径下的文件
(3)如果参数字符串以’./‘开头,表示加载的文件是位于相对路径下的文件
(4)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
四、Buffer对象
1、作用:是Node提供的处理二进制数据的对象。是node的内置对象,在使用时不需要安装可以直接使用,不需要require(‘buffer’)
2、使用的原因:JavaScript处理字符串的功能非常强大,但在二进制数据处理方面能力很弱。因此node就内置了Buffer对象专门处
理二进制数据。Buffer是构造函数,可以使用new创建Buffer的对象,浏览器的v8引擎会为Buffer的对象分配内存空间,类似于数组。
let buf = new Buffer(259) //256表示buf有259个单元,类似于数组,下标的范围在0~258之间
console.log(buf)
//强调:buf的每个单元存放的数据必须是0~255之间的整数值。即Buffer的每个单元就是一个字节
Byte:字节
1024Byte ==> 1KB
1024KB ==> 1MB
1024MB ==> 1GB
1024GB ==> 1TB
3、Buffer对象可以和字符串进行互换
五、Buffer构造函数
1、给构造函数传递整数:表示分配多少个字节的存储空间
let bytes = new Buffer(5) //表示给bytes分配5个字节的存储空间
2、给构造函数传递数组:数组的成员必须是整数值
let bytes = new Buffer([0x10,0x48]) //将数组传递给Buffer构造函数
3、给构造函数传递字符串:默认的编码格式是utf8
let b1 = new Buffer("蜗牛学苑",'utf8')
console.log(b1.toString())
六、Buffer常用的函数
1、Buffer.isEncoding(字符集):参数’字符集’就是字符的编码格式(ASCII、utf8、base64)。作用是判断Buffer的字符集是否是给定的字符集,如果是函数返回true,不是函数返回false
2、Buffer.isBuffer( buffer ):参数是一个Buffer的对象,判断参数是否是一个Buffer的实例
3、Buffer.byteLength( buffer ):返回字符串实际占有字节长度
七、实例属性
1、length:表示Buffer对象的长度(单元个数)
八、实例方法:用对象名调用的方法
1、类的成员:
(1)实例成员:
(2)类成员:静态成员。是通过类名直接访问,不属于某个具体的对象,而为类的所有对象共享的
class Student{
constructor(id,name){
Student.school = '蜗牛学苑' //school是类成员(静态成员)
this.id = id
this.name = name
}
Student.setSchool = function(){ //类方法
}
show(){ //实例方法
}
}
let s1 = new Student(1,'A') //s1有自己的id和name
let s2 = new Student(2,'B')
2、Buffer的实例方法
(1)write(value,index):向Buffer对象中写入数据
参数value:表示写入的值
参数index:表示写入的位置。可以省略
使用Buffer时注意的问题:在创建Buffer对象时,node建议使用以下两个方法,而不建议使用new
(1)Buffer.alloc(number,fill,encoding),返回一个Buffer对象
参数number:必须是整数,代表buffer的单元个数
参数fill:表示填充数据。默认值为0
参数encoding:若填充数据是字符串,用来指定字符集(编码格式),默认值是utf8
(2)Buffer.from(args1,args2),返回一个Buffer对象
参数args1:可以是字符串,也可以是数组
参数args2:若第一个参数是字符串,则用来指定字符集。
let b2 = Buffer.from([0x41,0x42,0x71]) //数组作为参数
console.log(b2.toString())
let b2 = Buffer.from('蜗牛学苑','utf8') //字符串作为参数
console.log(b2.toString())
九、Node的文件操作:对文件的I/O操作使用的是fs(FileSystem)模块
I/O操作是输入/输出操作(I表示Input,O表示Output)
1、使用方法:使用require导入
var fs = require('fs')
2、读文件
(1)异步读文件 —- 非阻塞方式的读
readFile(filename,callback)
参数filename:表示文件的全名
参数callback:回调函数。读文件结束后执行该函数
/导入fs模块
var fs = require('fs')
//调用异步读文件的方法
fs.readFile('input.txt',function(err,data){ //err存放的是读文件出现错误的信息,data存放的是读取的文件内容
if(err){
return console.error(err)
}
console.log('文件内容是:',data.toString())
})
(2)同步读文件 —- 阻塞方式的读
readFileSync(filename,encoding),函数的返回值就是读取的文件内容
参数filename:表示文件的全名
参数encoding:表示字符集
//导入fs模块
var fs = require('fs')
//同步读文件
let data = fs.readFileSync('input.txt')
console.log('文件内容是:',data.toString())
console.log('程序结束......')
3、打开文件
open(path, flags[, mode], callback)
path:要打开的文件路径
flags:打开文件的方式
r:以只读的方式打开文件。若文件不存在则报错
r+:打开文件后可以读、写。若文件不存在则报错
w:以写入的方式打开文件。若打开的文件不存在,则创建文件
w+:打开文件进行读和写。若打开的文件不存在,则创建文件
a:打开文件进行追加(在文件原有内容的末尾追加新内容)。若打开的文件不存在,则创建文件
fs.open(‘input1.txt’,’w’,function(err,fd){
if(err){
return console.log(err)
}
console.log(‘文件打开成功!’,fd)
})
console.log(‘程序结束……’)
4、区分文件和目录
stat(path, callback)
path:路径名
callback:回调函数
fs.stat('node_modules',function(err,stats){ //err表示打开文件发生错误时的信息,stats表示文件的状态信息
if(err){
return console.log(err)
}
console.log('是目录?',stats.isDirectory()) //判断stats是否是目录,若是返回true,若不是返回false
console.log('是文件?',stats.isFile()) //判断stats是否是文件,若是返回true,不是返回false
})
5、写文件:向文件中写入内容
(1)writeFile(filename, data[, options], callback) —- 异步写。若文件存在则覆盖
fs.writeFile('input.txt','天冷了',function(err){
if(err){
return console.log(er)
}
console.log('文件写入成功!')
})
console.log('主程序结束......')