node.js学习笔记

1.命令行窗口、cmd、shell、dos窗口
        -常用指令:
                dir:列出当前目录下的所有文件
                cd+目录名:进入指定的目录
                md+目录名:创建文件夹
                rd+目录名:删除文件夹
        -目录:
                . 表示当前目录   .. 表示上一级目录
        -环境变量(windows系统中的变量)
                当我们用命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有则依次到环境变量path的路径中寻找,直到找到为止

2.进程和线程
        进程
                -进程负责为程序的运行提供必备的环境
                -进程相当于工厂中的车间
        线程
                -线程是计算中最小的计算单位,线程负责执行进程中的程序
                -线程就相当于工厂中的工人
        单线程
                -JS是单线程的
        多线程

3.Node.js简介
        nodejs是一个能够在服务器端运行js的跨平台运行环境、单线程
4.模块化
        1.在node中,一个js文件就是一个模块,js文件中的所有代码都默认在一个function内执行,可用console.log(arguments.callee+“”)显示出来
        2.在node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
        3.如果想向外部暴露,只需要将需要暴露给外部的变量或方法设置为exports的属性即可
        4.在node中,通过require()函数来引入外部的模块, require中传递的文件路径并须使用相对路径,使用.或..开头
        5.使用require引用模块后,会返回一个对象,该对象代表的是引入的模块
        6.node会默认在最顶端加如下代码function (exports, require, module, __filename, __dirname) {,在最底端加 },实际上我们使用的exports和require都是node为我们传递进来的实参,filename表示当前模块的完整路径,dirname表示所在文件夹的完整路径
        7.可使用module.exports = { }进行批量暴露
                exports只能使用.的方式来向外暴露内部变量,module可以直接赋值

5.模块标识
        1)核心模块
                -由node引擎提供的模块
                -核心模块的标识就是模块的名字,不用写路径,直接写名字
        2)文件模块
                -由用户自己创建的模块
                -文件模块的标识就是文件的路径(相对路径或绝对路径)

6.CommonJs的包规范由包结构和包描述文件
        package.json是最主要的成分,相当于包的简介
        json文件中不能写注释

7.NPM(Node Package Manager)
        NPM就是package包管理规范,NPM帮助node完成第三方模块的发布、安装和依赖,通过npm下载的包都放在node_modules文件夹中,直接通过包名引入即可
        1)npm -v 查看npm版本
        2)npm version 查看所有模块的版本
        3)npm search 包名 搜索名
        4)npm install / i 包名 安装包,同时下载当前项目所依赖的包
        5)npm remove / r 包名 删除包
        6)npm install 包名 --save 安装包并添加到依赖中
        7)npm install 包名 --g  全局安装包(一般都是一些工具,计算机使用的,不是项目使用的)

8.npm引入模块规则
        1)首先会在当前目录的node_modules中寻找该模块
        2)如果有则直接引用,如果没有则去上一级目录的node_modules中寻找
        3)一直往上,直到找到磁盘的根目录,如果依然没有则报错

9.Buffer(缓冲区)
        1)Buffer的结构和数组很像,操作的方法也和数组类似
        2)数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据
        3)使用buffer不需要引入模块,直接使用即可
        4)在buffer中存储的都是二进制数据,而计算机显示时都是以16进制的形式显示,但打印数字时,控制台只显示10进制,非数字的则可以通过toString(进制数)进行输出
        5)Buffer中每一个元素的范围是从00 - ff,buffer.length返回的是占用内存的大小
        6)new Buffer(数字)创建指定大小(字节)的Buffer对象,但是已经被废弃了
        7)Buffer.alloc(数字) 为常用的创建方法,通过索引来操作buf的元素,Buffer.allocUnsafe(size)创建的Buffer不清除之前的内存数据,可能存在敏感数据
        8)Buffer的大小一旦确定,则不能修改,扩充会导致内存不连续,不利于性能维护
        9)Buffer中存储的数据,如果大小越界,则取二进制的后8位
        10)buf.toString() 将缓冲区中的数据转换为字符串

var str = "hello buffer";
var str1 = "hello 缓冲区"
var buf = Buffer.from(str);
var buf1 = Buffer.from(str1);
console.log(buf.length);//13
console.log(buf1.length)//15
var buf3 = Buffer.alloc(10);
buf3[0] =88;
buf3[1] = 255;
buf3[2] = 0xaa;
buf3[10] = 25;
buf3[3] = 256;
console.log(buf3);//<Buffer 58 ff aa 00 00 00 00 00 00 00>
var buf4 = Buffer.allocUnsafe(10);//<Buffer 85 a1 00 36 00 00 00 00 00 00>
console.log(buf4);
console.log(buf1.toString());//hello 缓冲区

10.同步异步文件和简单文件的写入
        1)同步文件的写入

/*   
    同步文件的写入
        1)打开文件
            fs.openSync(path,flags[,mode])
                -path 要打开文件的路径,相对路径或绝对路径,路径中的斜杠\需要再添加\进行转义,或者直接使用/
                -flags 打开文件要做的操作的类型 r(只读的) w(可写的) 
                -mode 设置文件的操作权限,一般不传
                -返回值,该方法会返回一个文件的描述符作为结果,通过结果进行操作
        2)向文件中写入内容
            fs.writeSync(fd,string[,position[,encoding])
                -fd 文件的描述符,需要传递要写入的文件的描述符
                -string 要写入的内容
                -position 写入的起始位置
                -encoding 编码方式,一般不写
        3)保存并关闭文件
            fs.closeSync(fd)  
*/
var fs = require("fs");
//打开文件
var fd = fs.openSync("hello.txt","w");
//向文件中写入内容
fs.writeSync(fd,"今天天气真不错",2);
//关闭文件
fs.closeSync(fd);

        2)异步文件的写入
 

/*       
    异步文件的写入
        1)打开文件
            fs.open(path,flags[,mode],callback)
                -callback不能省略,且必须是一个函数
                -异步调用的方法,结果都是通过回调函数的参数arguments返回的
                -回调函数有两个参数:
                    err 错误对象,如果没有错误则为null
                    fd 文件的描述符
        2)向文件中写入内容,该命令写在open的回调函数的if语句中
            fs.write(fd,string[,position[,encoding],callback)
        3)保存并关闭文件,该命令写在write的回调函数的if语句中
            fs.closeSync(fd) 
*/
//引入fs模块
var fs = require("fs");
//打开文件
fs.open("hello2.txt","w",function(err,fd){
    console.log("回调函数中的代码执行~~~")//回调函数callback中的代码后执行
    //判断是否出错
    if(!err){
        //如果没有出错,则对文件进行写入操作
        fs.write(fd,"这是异步操作要写入的内容",function(err){
            if(!err){
                console.log("写入成功");}
            //关闭文件
            fs.close(fd,function(err){
                if(!err){
                    console.log("文件已关闭~~~");}})})
                }else{console.log(err);}
    });
console.log("open下的代码执行~~~")

 3)简单文件写入
 

/*
    简单文件写入
        fs.writeFile(file,data[,options],callback)
        fs.writeFileSync(file,data[,options])
            -file 要操作的文件的路径
            -data 要写入的数据
            -options 选项,可以对写入进行一些设置
            -callback 当写入完成以后执行的函数
            -flag:r只读  w可写  a追加
*/
//引入fs模块
var fd = require("fs");

fd.writeFile("hello3.txt","这是通过writeFile写入的内容",{flag:"a"},function(err){
    if(!err){
        console.log("写入成功~~~");
    }
})
//writeFile方式中,读取方式写在options中,用{flag:""}表示,其中
//r 读取文件   w 写入文件  a 追加文件

11.流式文件写入
 

/*
    同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
*/
var fs = require("fs");
//流式文件写入
//创建一个可写流
/*
    fs.createWriteStream(path[,options])
        -可以用来创建一个可写流
        -path,文件路径
        -options 配置的参数,一般不写
    fs.write(string)
    fs.close()
*/
var ws = fs.createWriteStream("hello3.txt");
//可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open",function(){//on和once都可以绑定事件,on绑定长期有效的事件,once绑定一次生效的事件
    console.log("流打开了~~");
})
ws.once("close",function(){
    console.log("流关闭了~~~");
})
//通过ws向文件中输出内容
ws.write("通过可写流写入文件的内容");
ws.write("2");
//关闭流
ws.close();

 12.文件读取
        1)简单文件读取

/*
    1.同步文件读取
    2.异步文件读取
    3.简单文件读取
    fs.readFile(path[,options],callback)
    fs.readFileSync(path[,options])
        -path要读取的文件的路径
        -options 读取的选项
        -callback 对调函数,通过回调函数将读取到的内容返回
            err 错误对象
            data 读取到的数据,会返回一个buffer
    4.流式文件读取
*/
var fs = require("fs");
fs.readFile("sign_bg.db29b0fb.png",function(err,data){
    if(!err){
        //console.log(data);
        //将data写入到文件中
        fs.writeFile("hello.jpg",data,function(err){
            if(!err){
                console.log("文件写入成功")
            }
        })
    }
});

        2)流式文件读取
 

/*
    流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中
*/

var fs = require("fs");
//创建一个可读流
var rs = fs.createReadStream("sign_bg.db29b0fb.png");
//创建一个可写流
var ws = fs.createWriteStream("hello1.jpg");
//监听流的开启和关闭
rs.once("open",function(){
    console.log("可读流打开了");
})
rs.once("close",function(){
    console.log("可读流关闭了");
    //数据读取完毕,关闭可写流
    ws.end();
})
ws.once("open",function(){
    console.log("可写流打开了");
})
ws.once("close",function(){
    console.log("可写流关闭了");
})
/*如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,
data事件绑定完毕,它会自动开始读取数据*/
rs.on("data",function(data){
    console.log(data.length);
    //将读取到的数据写入到可写流中
    ws.write(data);

})

13.终极版流式文件处理

//引入fs模块
var fs = require("fs");
//创建一个可读流
var rs = fs.createReadStream("sign_bg.db29b0fb.png");
//创建一个可写流
var ws = fs.createWriteStream("hell4.jpg");
//pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);

14.fs模块中的其他方法
 

var fs = require("fs");
//检查一个文件是否存在
var isExists = fs.existsSync("hello.txt");
console.log(isExists);
//获取文件状态
fs.stat("hello.txt",function(err,stat){
    /*
        .size 文件的大小
        .isFile() .isDirectory() 文件/文件夹
    */
    console.log(stat.size);
})
/*
fs.unlink(path,callback) -异步删除文件
fs.unlinkSync(path) -同步删除文件
fs.readdir(path[,options],callback) -读取一个目录的目录结构
fs.readdirSync(path[,options])  -回调函数中的files是一个字符串数组,每一个元素就是一个文件夹或文件的名字
fs.truncate(path,len,callback)
fs.truncateSync(path,len) -截断文件,将文件修改为指定的大小
fs.mkdir(path[,mode],callback)
fs.rmdir(path,callback)
fs.rename(oldpath,newpath,callback)
fs.watchFile(filename[,options],listener)
    -监视文件的修改
    -参数:
        filename 要监视的文件的名字
        options 配置选项,可修改程序等待的间隔时间{interval:1000},改为1s一次
        listener 回调函数,当文件发生变化时,回调函数会执行
        回调函数中有两个参数,curr和prev,两个都是stat对象,可调用stat的方法
*/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值