node.js

cmd

  • 环境变量(windows系统中的变量)
  • path环境变量
    path坏境变量中保存的是一个一个的路径,路径之间使用;隔开-作用:
  • 当我们在命令行窗口中调用一个命令,或访问一个文件时,系统会先在当前文件夹中寻找,如果找不到则依次去path的路径下寻找,如果找到则直接使用,如果没有找到则继续向下一个路径去寻找,如果所有的路径中都没有找到,则报错
  • 可以将一些常用的文件或程序的路径添加到path下,这样我们就可以在任意位置来访问这些文件了

进程和线程

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

Node.js简介

  • Node.js是一个能够在服冬瞾端运行JavaScript的开放源代码、跨平否JavaScript运行环境。
  • Node采用Google开发的V8引擎运行js代码,使用事件驱动非阻塞和异步I/o模型等技术来提高性能,可优化应用程序的传输量和规模。
  • Node大部分基本模块都用JavaScript编写。在Node出现之前,
  • 通常作为客户端程序设计语言使用,以S写出的程序常在用户的浏览器上运行。
  • 目前,Node已被IBM、、Microsoft、Yahoo!、Walmart、Groupon.SAP、LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企业采用
  • Node的服务器单线程的
  • Node处理请求时是单线程,但是在后台拥有一个
    IO线程池

模块化

  • 在node中有一个全局对象globalThis,它的作用和网页中window类似
  • 在全局中创建的变量都会作为global的属性保存
  • 在全局中创建的函数都会作为global的方法保存
  • 当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
function (exports, require, module, _filename, _dirname) {
}

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参:

  • exports
    -- 该对象用来将变量或函数暴露到外部
  • require
    -- 函数,用来引入外部的模块
  • module
    -- module代表的是当前模块本身,exports就是module的属性
  • 既可以使用exports导出,也可以使用module.exports导出
  • filename
    -- 当前模块的完整路径
  • dirname
    -- 当前模块的目录文件夹

exports和module.export

  • 通过exports只能使用.的方式来向外暴露内部变量
    exports.XXX=XXX
  • module.exports既可以通过.的形式,也可以直接赋值
    module.exports.XXX=XXXX
    module.exports ={}

包基础

  • CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由包结构包描述文件两个部分组成。
  • 包结构
    -- 用于组织包中的各种文件
  • 包描述文件
    -- 描述包的相关信息,以供外部读取分析

包结构

-- 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:

  • package.json 描述文件(必须存在的文件)
  • bin 可执行二进制文件
  • lib js代码
  • doc 文档
  • test 单元测试

NPM(Node Package Manager)

  • CommonJS包规范是理论,NPM是其中一种实践。
    对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。

模块的标识

-- 模块的标识就是模块的名字或路径

  • 我们node通过模块的标识来寻找模块的
  • 对于核心模块〈npm中下载的模块),直接使用模块的名字对其进行引入
  • var fs =require ( "fs");
  • var express =require ("express");
  • 对于自定义的文件模块,需要通过文件的路径来对模块进行引入,路径可以是绝对路径,如果是相对路径必须以./或../开头:var router = require("./router" );

npm的命令

  • npn -v查看npm的版本
  • npmn version查看所有模块的版本 npm search包名搜索包
  • npm install / i 包名 安装包
  • npm remove / r 包名 删除包
  • npm install 包名--save 安装包并添加到依赖中
  • npm install 下载当前项目所依赖的包
  • npm install 包名 -g 全局安装包(全局安装包一般是一些工具)

node搜索包的流程

  • 通过npm下载的包都放到node_modules文件夹中
    我们通过npm下载的包,直接通过包名引入即可
  • node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块
    如果有则直接使用,如果没有则去上一级目录的node_modules中寻找,如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止直到找到磁盘的根目录,如果依然没有,则报错

Buffer (缓冲区)

  • Buffer的结构和数组很像,操作的方法也和数组类似
  • 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据-使用buffer不需要引入模块,直接使用即可
  • 在buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示,buffer中每一个元素的范围是从00 - ff
  • 00000000 - 11111111
  • 计算机一个0或一个1我们称为1位(bit)
  • 8bit = 1byte(字节)
  • buffer中的一个元素,占用内存的一个字节
  • Buffer.from (str)将一个字符串转换为buffer
  • Buffer.alloc (size)创建一个指定大小的Buffer
  • Buffer.alloUnsafe(size)创建一个指定大小的Buffer,但是可能包含敏感数揖
  • Buffer.tostring()(将缓冲区中的数据转换为字符串

fs文件系统

  • 文件系统(File system)
  • 文件系统简单来说就是通过Node来操作系统中的文件
  • 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
  • 同步和异步调用
  • fs模块中所有的操作都有两种形式可供选择同步和异步。
  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,则不会向下执行代码,函数名带有sync
  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回,函数名不带sync

同步文件写入

  • 手动操作的步骤
  1. 打开文件
    fs.opensync(path, flag[,mode])
  • path要打开文件的路径
  • flags 打开文件要做的操作的类型
    -- r只读的
    -- w可写的
  • mode设置文件的操作权限,一般不传返回值:
  • 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作
  1. 向文件中写入内容
    fs.writesync(fd, stringl , position [ ,encoding] ] )
  • fd文件的描述符,需要传递要写入的文件的描述符
  • string要写入的内容
  • position写入的起始位置
  • encoding 写入的编码,默认utf-8
  1. 保存并关闭文件
    fs.closesync (fd)
  • fd要关闭的文件的描述符
    【example】
let fs = require('fs');
let res = fs.openSync('./JS/1.txt','w');
console.log(res);
fs.writeSync(res, '小肥');
fs.closeSync(res);

异步文件的写入

// fs文件系统 异步写入
let fs = require('fs');
fs.open("1.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.warn(err);
                    }
                });
            } else {
                console.warn(err);
            }
        });
    } else {
        console.warn(err);
    }
});

简单文件写入

fs.writeFile(file, data [ , options] , callback )fs.writeFilesync(file, data [ , options ] )

  • file要操作的文件的路径
  • data要写入的数据
  • options 选项,可以对写入进行一些设置
  • callback当写入完成以后执行的函数
let fs = require('fs');
fs.writeFile("./JS/1.txt", "11",{flag:'a'},(err)=>{
    if (err) {
        console.warn(err);
    } else {
        console.log("ok");
    }
})

流文件写入

  • 同步、异步、简单的写入都不适合大文件的写入,性能较差,容易导致内存溢出
// 流式文件写入
// 导入fs
var fs = require('fs');
// 创建一个可写流
var ws = fs.createWriteStream('1.txt');
// 可以通过监听流的open和close事件来监听流的打开和关闭
ws.once("open", function(){
    console.log("123");
})
// 通过ws向文件中输出内容
ws.write('111通过可写流写入的');
ws.write('22通过可写流写入的');
ws.write('33通过可写流写入的');
ws.write('44通过可写流写入的');
ws.write('55通过可写流写入的');
ws.end();

简单文件读取

1.同步文件读取2.异步文件读取3.简单文件读取
fs.readFile(path [ , options] , callback)fs .readFilesync(path [ , options] )

  • path要读取的文件的路径
  • options读取的选项
  • callback回调函数,通过回调函数将读取到内容返回(err,data)
    -- err错误数据
    -- data读取到的数据,会返回一个Buffer
let fs = require('fs');
fs.readFile('1.txt',(err, data)=>{
    if (err) {
        console.warn(err);
    } else {
        console.log(data.toString());
        fs.writeFile('10.txt',data, (err)=>{
            if (err) {
                console.warn(err);
            } else {
                console.log('ok');
            }
        })
    }
});
  1. 流式文件读取
  • 流式文件读取也适用于一些比较大的文件,可以分多次文件读取到内存
// 流文件读取
var fs = require('fs');
// 创建一个可读流
var rs = fs.createReadStream("package.json");
var ws = fs.createWriteStream("1.txt");
rs.once("close", function(){
    rs.close();
})
rs.on("data", function(data){
    console.log(data);
    ws.write(data);
    ws.end();
});
// rs.pipe(ws);
posted @ 2023-02-24 09:43  小红的小耳朵  阅读(36)  评论(0)    收藏  举报