基础准备
-
命令行窗口的常用命令
dir 列出当前目录下的所有文件
cd 目录名 进入到指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹
. 表示当前目录
… 表示上一级目录 -
环境变量
当我们在命令行窗口打开一个文件或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有找到则会依次到环境变量path路径中寻找,直到找到为止,没有则报错,所以我们可以将一些经常需要访问的程序和文件的路径添加到path中,这样我们就可以在任意位置访问他们 -
进程和线程
进程负责为程序的运行提供必备的环境,进程就相当于工厂中的车间
线程是计算机中的最小计算单位,线程负责执行进程中的程序,线程就相当于工厂车间中的工人
JS是单线程的,Java是多线程的
Node.js
-
简介
是一个能够在服务器端运行JavaScript的JavaScript运行环境,采用Google开发的V8引擎运行JS代码

Node.js起初是用来写高性能服务器的,称作Webjs,Node.js是用来写单线程的服务器的,它处理请求时是单线程,但是在后台拥有一个I/O线程池,不像传统的服务器是多线程的,Node.js用途很多,比如:Web服务API(REST),实时多人游戏,后端的Web服务(跨域,服务端的请求),基于Web的应用,多客户端的通信(即时通信) -
COMMONJS规范
ECMAScript标准的缺陷:
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
因此提供出了COMMONJS规范,希望JS能够在任何地方运行,它主要定义了模块的三个方面 - 模块引用
- 模块定义
- 模块标识
下面我们一一介绍
模块定义 - 在Node中,一个js文件就是一个模块
- 在Node中,每一个js文件中的代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其它模块中无法访问
- 我们可以通过exports来向外暴露变量和方法,只需要将需要暴露给外部的变量和方法设置为exports的属性即可
/*
* 模块化
* -在Node中,一个js文件就是一个模块
* -在node中,每一个js文件中的代码都是独立运行在一个函数中
* 而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
* */
console.log('我是一个模块,我是module02.js')
// var x = 10
// var y = 10
/*
* 我们可以通过 exports 来向外暴露变量和方法
* 只需要将需要暴露给外部的变量或者方法设置为exports的属性即可
* */
//向外部暴露属性和方法
exports.x = '我是02_moudles的x'
exports.y = '我是y'
exports.fn = function () {
}
模块引用
- 在Node中,通过require()函数来引入其它的模块
- require()可以传递一个文件的路径作为参数,Node将会自动根据该路径引入外部模块,这里路径如果使用相对路径,必须以.或者…开头
- 引入模块以后,该函数会返回一个对象,这个对象代表的就是引入的模块
//引入其他模块
/*
* 在node中,通过require()函数来引入外部的模块
* require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
* 这里路径,如果使用相对路径,必须以.或者..开头
*
* 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的就是引入的模块
*
* 我们使用require引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
*
* 模块分成两大类
* 核心模块
* --由node引擎提供的模块
* --核心的标识就是模块的名字
* 文件模块
* --由用户自己创建的模块
* --文件模块的标识就是路径
* */
var md = require("./02_moudles")
var fs = require('fs')
console.log(md)
var math = require('./math')
console.log(math.add(1,2),math.mul(1,2))
console.log(fs)
npm
npm包管理器,使用npm可以对项目需要的包进行管理,这使得添加或者删除相关包变得极其简单,经常使用的指令有:
npm install 包名 向项目中添加某个包
npm uninstall 包名 移除项目中的某个包
npm install 安装项目依赖中所有需要的包
修饰:
-g 表示全局安装
-dev 表示当前文件安装
–save 表示安装到项目依赖中
通过npm下载的包都放到了node_modules文件夹中,直接通过包名就可以引入使用了
node在使用模块的名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块如果有则直接使用,如果没有则去上一级目录的node_modules中寻找没有继续上一级,直到磁盘的根目录,没有则报错
Buffer缓冲区
Buffer(缓冲区)
-
- Buffer的结构和数组很像,操作的方法也和数组类似
-
- 数组中不能存储二进制文件,而Buffer就是专门用来存储二进制数据
-
- 使用Buffer不需要引入,直接使用即可
-
- 在Buffer中存储的都是二进制数据,但是在显示的时候都是以16进制的形式显示
-
buffer中每一个元素的范围是从00 - ff (0 - 255) -
00000000 - 11111111 -
计算机中 1个0 或 1个1 我们称为1位(bit) -
8bit = 1byte(字节) -
buffer中的一个元素,占用的内存就是一个字节 -
1024byte = 1kb -
1024kb = 1mb -
1024mb = 1gb -
1024gb = 1tb -
Buffer的大小一旦创建,则不能修改,Buffer实际上是对底层内存的直接操作
var str = 'Hello cxq'
//将一个字符串保存到Buffer中
var buf = Buffer.from(str)
console.log(buf)
console.log(buf.length) //占用内存的大小 (一个汉字3个字节)
console.log(str.length) //字符串的长度
//创建一个指定大小的Buffer
//Buffer的所有构造函数都是不推荐使用的,废弃的,最好不用
// var buf2 = new Buffer(10) //10个字节的Buffer
// console.log(buf2.length)
//创建指定大小的Buffer
var buf2 = Buffer.alloc(10) //10个字节的Buffer
//通过索引,来操作Buffer中的元素
buf2[0] = 88
buf2[1] = 255
buf2[2] = 0xaa
// buf2[3] = 256 只能保存8位 且范围00000000 - 11111111 超出的舍去
// buf2[10] = 255 没用
console.log(buf2)
//只要数字在控制台或页面输出一定是10进制
// console.log(buf2[2])
console.log(buf2[2].toString(16))//以16进制输出
//遍历
//
// for (var i = 0; i < buf2.length; i++) {
// console.log(buf2[i])
//
// }
//Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据
var buf3 = Buffer.allocUnsafe(10)
console.log(buf3)
//alloc分配内存空间的时候会将内存原来的数据清空
//但是allocUnsafe不会清空,所以有可能有值,一些敏感的数据。,安全性不高,但效率更高
var buf4 = Buffer.from('我是一段文本数据')
console.log(buf4.toString())
fs文件系统
文件系统(File System)
- -通过Node来操作系统中的文件
- -使用文件系统,需要引入fs模块,fs是核心模块,直接引入不需要下载
文件的写入
- -手动操作的步骤
-
1.打开文件 -
- fs.openSync(path,flags[,mode]) -
- path 要打开文件的路径 -
- flags 打开文件要做的操作的类型 -
r 只读的 -
w 可写的 -
- mode 设置文件的操作权限,一般不传 -
返回值 -
-该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件 -
进行各种操作 -
2.向文件中写入内容 -
fs.writeSync(fd,string[,position[,encoding]]) -
- fd 要写入文件的描述符 -
- string 要写入的内容 -
- position 写入的起始位置 -
- encoding 写入的编码,一般是utf-8 -
3.保存并关闭文件 -
fs.closeSync(fd) -
- fd 文件描述符
ar fs = require('fs')
// console.log(fs)
//打开文件
var fd = fs.openSync("hello.txt","w")
console.log(fd)
//向文件中写入内容
fs.writeSync(fd,"今天天气真不错!")
//关闭文件
fs.closeSync(fd)
异步文件的写入
- fs.open(path,flags[,mode],callback)
-
- 异步调用的方法,结果都是通过回调函数的参数返回的
-
- 回调函数有两个参数
-
err 错误对象 如果没有错误则为null -
fd 文件描述符 - fs.write(fd,string[,position[,encoding]],callback)
-
- 回调函数有三个参数
- fs.close(fd,callback)
//引入fs模块
var fs = require('fs')
//打开文件
fs.open("hello2.txt","w",function (err,fd) {
if(!err){
//写入内容
fs.write(fd,"这是异步写入的内容",function (err) {
if(!err){
console.log("写入成功")
}
//关闭文件
fs.close(fd,function (err) {
if (!err){
console.log("文件已关闭")
}
})
})
}else{
console.log(err)
}
})
简单文件写入
-
fs.writeFile(file, data[, options], callback) -
fs.writeFileSync(file, data[, options]) -
- file 要操作的文件的路径 -
- data 要写入的数据 -
- options 选项,可以对写入进行一些设置 -
- callback 当写入完成以后执行的函数
//引入fs模块
var fs = require('fs')
fs.writeFile('hello3.txt',"这是简单文件的写入",{flag:'a'},function (err) {
if(!err){
console.log("写入成功")
}else{
console.log(err);
}
})
同步、异步、简单文件写入都不适合于大文件的写入,性能较差,容易导致内存溢出
流式文件写入
创建一个可写流
- fs.createWriteStream(path[,options])
-
- 用来创建一个可写流
-
- path 文件路径
-
- options 配置的参数
var fs = require('fs')
var ws = fs.createWriteStream('hello4.txt')
//打开流和关闭流的事件监听
ws.once('open',function () {
console.log("流打开了")
})
ws.once('close',function () {
console.log('流关闭了')
})
ws.write("玲珑骰子安红豆")
ws.write("入骨相思知不知")
ws.write("万里悲秋常作客")
ws.write("百年多病独登台")
//关闭流
ws.end()
- 1.同步文件的读取
- 2.异步文件的读取
- 3.简单文件的读取
- 4.流式文件的读取
//简单文件的读取
var fs = require('fs')
fs.readFile('ani.jpg',(err,data) => {
if(!err){
//console.log(data)
//写入到新的地方
fs.writeFile('you.jpg',data,(err) => {
if(!err){
console.log('写入成功')
}
})
}
})
//流式文件的读取 适用于大文件
var fs = require('fs')
//创建一个可读流
var rs = fs.createReadStream('hello4.txt')
//创建一个可写流
var ws = fs.createWriteStream('a.txt')
//监听流的开启和关闭
rs.once('open',() =>{
console.log('可读流打开了')
})
rs.once('close',() => {
console.log('可读流关闭了')
ws.end()
})
ws.once('open',() =>{
console.log('可写流打开了')
})
ws.once('close',() => {
console.log('可写流关闭了')
})
//如果要读取一个可读流中的数据,必须要可读流绑定一个data事件,data事件绑定完毕
//它会自动开始读取数据,数据通过回调函数的参数返回
rs.on('data',(data) => {
//console.log(data);
ws.write(data)
})
var fs = require('fs')
var ws = fs.createWriteStream('my.jpg')
var rs = fs.createReadStream('ani.jpg')
//可以将可读流中的内容直接输出到可写流中
rs.pipe(ws)
nodejs的东西还有很多,我只是例举其中很简单的东西,更多的内容,大家可以查看官方API链接
好了,我的分享就到这里了,谢谢大家!
本文介绍了Node.js的基础准备,包括环境变量、进程与线程的概念,Node.js的简介及用途,COMMONJS规范,模块定义与引用,npm包管理器的使用,Buffer缓冲区的理解与操作,以及fs文件系统的详细介绍。

186

被折叠的 条评论
为什么被折叠?



