【NodeJS】模块化+包管理+文件系统

it2023-12-31  62

文章目录

前言模块化1.模块定义2.模块引用 包结构与npm管理1.包结构2.包管理 文件系统1.Buffer2. fs模块2.1异步文件2.2流式文件

前言

node.js - node是一款对ES标准实现的JS引擎 - 通过node可以使js在服务器中运行 - node就是一款使用js编写的web服务器 - node底层是使用c++的编写的 - node的中js引擎使用的chrome的v8引擎 - node的特点: 1.非阻塞、异步的I/O 2.事件和回调函数 3.单线程(主线程单线程,后台I/O线程池) 4.跨平台 PS- Node仅仅对ES标准进行了实现,所以在Node中不包含DOMBOM - Node中可以使用所有的内建对象 String Number Boolean Math Date RegExp Function Object Array 而BOMDOM都不能使用,但是可以使用 console 也可以使用定时器(setTimeout() setInterval()- Node可以在后台来编写服务器 Node编写服务器都是单线程的服务器 - 进程 - 进程就是一个一个的工作计划(工厂中的车间) - 线程 - 线程是计算机最小的运算单位(工厂中的工人) 线程是干活的 - 传统的服务器都是多线程的 - 每进来一个请求,就创建一个线程去处理请求 - Node的服务器单线程的 - Node处理请求时是单线程,但是在后台拥有一个I/O线程池

模块化

- 模块化 - ES5中没有原生支持模块化,我们只能通过script标签引入js文件来实现模块化 - 在node中为了对模块管理,引入了CommonJS规范 - 模块的引用 - 使用 require()函数来引入一个模块 - 例子: var 变量 = require("模块的标识"); - 模块的定义 - 在node中一个js文件就是一个模块 - 默认情况下在js文件中编写的内容,都是运行在一个独立的函数中,而不是全局作用域, 外部的模块无法访问 - 导出(向外部暴露)变量和函数 - 使用 exports - 例子: exports.属性 = 属性值; exports.方法 = 函数; - 使用module.exports - 例子: module.exports.属性 = 属性值; module.exports.方法 = 函数; module.exports = {}; - 模块的标识 - 模块的标识就是模块的名字或路径 我们node通过模块的标识来寻找模块的 对于核心模块(npm中下载的模块),直接使用模块的名字对其进行引入 var fs = require("fs"); var express = require("express"); 对于自定义的文件模块,需要通过文件的路径来对模块进行引入 路径可以是绝对路径,如果是相对路径必须以./../开头 var router = require("./router");

1.模块定义

注意点:

var a = 10; //是在函数内部的局部变量 而直接 a=10 是全局的 /* 在node中有一个全局对象 global,它的作用和网页中window类似 在全局中创建的变量都会作为global的属性保存 在全局中创建的函数都会作为global的方法保存 当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码 function (exports, require, module, __filename, __dirname) { 在代码的最底部,添加如下代码 } 实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参 exports - 该对象用来将变量或函数暴露到外部 require - 函数,用来引入外部的模块 module - module代表的是当前模块本身 - exports就是module的属性 - 既可以使用 exports 导出,也可以使用module.exports导出 __filename C:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js - 当前模块的完整路径 __dirname C:\Users\lilichao\WebstormProjects\class0705\01.node - 当前模块所在文件夹的完整路径 * */

exports 和 module.exports区别:

/* exports 和 module.exports - 通过exports只能使用.的方式来向外暴露内部变量 exports.xxx = xxx - 而module.exports既可以通过.的形式,也可以直接赋值 module.exports.xxx = xxxx module.exports = {} */

2.模块引用

/* 定义一个模块 math - 在该模块中提供两个方法 add(a , b); //求两个数的和 mul(a , b); //求两个数的积 */ module.exports.add = function (a , b) { return a+b; }; module.exports.mul = function (a , b) { return a*b; }; //引入其他的模块 /* 在node中,通过require()函数来引入外部的模块 require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块 这里路径,如果使用相对路径,必须以.或..开头 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块 我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块 - 模块分成两大类 核心模块 - 由node引擎提供的模块 - 核心模块的标识就是,模块的名字 文件模块 - 由用户自己创建的模块 - 文件模块的标识就是文件的路径(绝对路径,相对路径) 相对路径使用.或..开头 */ //var md = require("./02.module"); var math = require("./math"); //require返回对应的是module.exports级别,若采用.方法 .属性方式对外暴露,调用时需另外.属性 .方法 var fs = require("fs"); //fs模块系统自带直接引用不用定义 //console.log(md); console.log(math.add(123,456));

包结构与npm管理

1.包结构

- 包(package- 将多个模块组合为一个完整的功能,就是一个包 - 包结构 bin - 二进制的可执行文件,一般都是一些工具包中才有 lib - js文件 doc - 文档 test - 测试代码 package.json - 包的描述文件 - package.json - 它是一个json格式的文件,在它里面保存了包各种相关的信息 name 包名 version 版本 dependencies 依赖 main 包的主要的文件 bin 可执行文件

2.包管理

- npm(Node Package Manager node的包管理器) - 通过npm可以对node中的包进行上传、下载、搜索等操作 - npm会在安装完node以后,自动安装 - npm的常用指令 npm -v 查看npm的版本 npm version 查看所有模块的版本 npm init 初始化项目(创建package.json) 注:json文件中不能写注释 npm i/install 包名 安装指定的包 npm i/install 包名 --save 安装指定的包并添加依赖 npm i/install 包名 -g 全局安装(一般都是一些工具) npm i/install 安装当前项目所依赖的包(由项目中的package.json指出) npm s/search 包名 搜索包 npm r/remove 包名 删除一个包

cnpm是淘宝镜像的npm

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

文件系统

1.Buffer

- Buffer(缓冲区) - Buffer和数组的结构的非常类似,Buffer是用来存储二进制数据的 - Buffer的方法 - Buffer.from(字符串) - 将一个字符串中内容保存到一个buffer中 - buf.toString() - 将buffer转换为一个字符串 - Buffer.alloc(size) - 创建一个指定大小的buffer对象 - Buffer.allocUnsafe(size) - 创建一个指定大小的buffer对象,可以包含敏感数据

2. fs模块

- 在Node通过fs模块来对系统中的文件进行操作,fs模块是node中已经继承好了,不需要在使用npm下载,直接引入即可 - 引入fs var fs = require("fs"); - fs模块中的大部分操作都提供了两种方法,同步方法和异步方法 同步方法带sync 异步方法没有sync,都需要回调函数

2.1异步文件

/** 异步文件写入 fs.open(path, flags[, mode], callback) - 用来打开一个文件 - 异步调用的方法,结果都是通过回调函数的参数返回的 - 回调函数两个参数:通过回调函数中的arguments对象确定传入的参数 console.log(arguments) 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.readFile("an.jpg" , function (err , data) { if(!err){ //console.log(data); //将data写入到文件中 fs.writeFile("C:/Users/lilichao/Desktop/hello.jpg",data,function(err){ if(!err){ console.log("文件写入成功"); } } ); } });

2.2流式文件

方式一:管道

/* 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中 */ var fs = require("fs"); //创建一个可读流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3"); //创建一个可写流 var ws = fs.createWriteStream("b.mp3"); //pipe()可以将可读流中的内容,直接输出到可写流中 rs.pipe(ws);

方式二:

/* 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中 */ var fs = require("fs"); //创建一个可读流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3"); //创建一个可写流 var ws = fs.createWriteStream("a.mp3"); //监听流的开启和关闭 rs.once("open",function () { console.log("可读流打开了~~"); }); rs.once("close",function () { console.log("可读流关闭了~~"); //数据读取完毕,关闭可写流 ws.end(); //注意end方法是等管中水流完再关闭,close方法是直接关闭 }); ws.once("open",function () { console.log("可写流打开了~~"); }); ws.once("close",function () { console.log("可写流关闭了~~"); }); //如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据 rs.on("data", function (data) { //console.log(data); //将读取到的数据写入到可写流中 ws.write(data); });
最新回复(0)