day29Node.js文件系统

本文详细介绍了Node.js中的文件系统操作,包括同步和异步风格、文件信息、写入、读取、重命名及删除文件,以及目录的创建、读取和删除。此外,还讲解了模块系统,包括模块概述、内置模块和自定义模块的使用。最后,讨论了包和npm管理,包括包的概念、npm常用命令和模块加载机制。
摘要由CSDN通过智能技术生成

一、文件系统/模块

在Nodejs中可以通过内置的fs模块来操作系统文件。

文件系统操作都具有同步和异步两种方式。Node中的方法基本上都是由同步 sync结尾 和异步组成,如果有同步 ,就不要使用异步。

同步风格的特点:阻塞代码,同步是用等号赋值的拿结果。

异步风格的特点:不阻塞,但是需要用回调函数拿结果。

注意:同步方法和异步方法的参数是一致的。异步是必须加回调,否则报错。

回调函数的第1个参数永远是错误信息,如果没有错,则返回null。

而如果有返回结果,往往都是回调函数的第2个参数。

fileSystem:fs

0.在node中的同步和异步风格

同步:
1.引入模块
const fs = require('fs')

2.使用同步风格
let result = fs.readFileSync( 路径 )

异步:
1.引入模块
const fs = require('fs')

2.使用异步风格
 fs.readFile( 路径,callback )

1.文件操作

1.0关于捕获同步的错误信息

//捕获同步错误。
try {
    //把觉得会有错误的代码放在 try中
    let result = fs.statSync('./test/demo.txt')
} catch (error) {
    console.log( error );
}

console.log( 3333 );

异步不用try…catch,回调的第1个参数就是错误捕获。

1.1 文件信息 fs.stat

功能:检查文件是否存在、文件基本信息、检查是目录/文件

代码示例:


  size:17,大小
  atime: 2021-03-19T07:07:42.664Z,  access 访问
  mtime: 2021-03-19T07:07:47.176Z, modify 修改
  ctime: 2021-03-19T07:07:47.176Z, create 创建
  
    const fs = require('fs')

    let stats = fs.statSync('./test/a.txt')
        //返回一个对象
    // console.log( stats );

    // isFile() //是否是文件
    // isDirectory() //是否是目录

    console.log( stats.isFile() ) //true
    console.log( stats.isDirectory() ) //false

1.2 写入文件

http://nodejs.cn/api/fs.html#fs_file_system_flags

'a': 打开文件用于追加。 如果文件不存在,则创建该文件。

'w': 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则删除文件。

代码示例:

const fs = require('fs')

//需求:往test/b.txt中写入hello

    //fs.writeFile( 路径,写入的内容,[option],callback )  / writeFileSync(路径,写入的内容,[option],)
                    //option:{ flag:'a' } append   默认flag为w:write
    //写入操作,只要不报错就代表写入成功。
    // 如果没有文件,则创建文件
    // 默认会覆盖原内容
    // fs.writeFile( './test/b.txt','node.js真强大',( err1,res )=>{
    //     console.log( err1,'我是err1' );
    //     console.log( res,'我一定是个undefined' );
    // } )


    fs.writeFile( './test/b.txt','猪八戒',{ flag:'a' },( err1,res )=>{
        console.log( err1,'我是err1' );
        console.log( res,'我一定是个undefined' );
    } )

换行操作:

\r\n :代表换行

fs.writeFile( './test/b.txt','猪八戒\r\n',{ flag:'a' },( err1,res )=>{
            console.log( err1,'我是err1' );
            console.log( res,'我一定是个undefined' );
     } )

1.3 读取文件

代码示例:


//1. 引入fs模块
const fs = require('fs')

//2. 使用fs模块中的读取方法
    //2.1 同步方法
// let result = fs.readFileSync( './test/a.txt' )
// console.log( result.toString() );
    //2.2 异步方法
   let r = fs.readFile( './test/a.txt','utf8',function(err,res){//
        // console.log( res.toString() ,'我是结果');
        console.log( res,'--------' );
        console.log( err,'没有错,则为null' );
    } )
    console.log( r,'我是undefined,异步方法没有返回值' );

1.4 修改文件名称、可以操作文件名称

fs.renameSync( 完整的源路径,新的路径名称 )

间接地实现生重命名和剪切

代码示例:

const fs = require('fs')

//
// let result = fs.renameSync('./test/a11.txt','./test/a111.txt')

//剪切操作
let result = fs.renameSync('./test/a11.txt','./test2/a11.txt')

console.log( result,'没有返回值则代表执行成功' );

//修改文件夹名称
fs.renameSync('./test2','test22')

1.5 删除文件

fs.unlinkSync( 文件路径 )

代码示例:

const fs = require('fs')

fs.unlinkSync( 'test/demo.js' )

文件的删除、创建、写入、读取等等操作。只局限于服务器上的文件 。

2.文件夹操作

2.1创建目录

fs.mkdir( ‘目录地址’ )

代码案例:

fs.mkdirSync('./test3')

2.2读取目录

fs.readdir( ‘目录地址’ )

代码案例:

let files = fs.readdirSync('./test') //以一个数组结构返回。
 
console.log( files );
递归在控制台输入 每一个文件夹中的文件

2.3删除目录

fs.rmdir( ‘目录地址’ )

代码案例:

fs.rmdirSync('./test3')

二、模块系统

在Node.js中,每一个js文件就称之为一个模块(Module)。每一个模块都是独立的,互不影响的。因为每一个js文件都是被一个匿名函数包起来的。

1.模块概述

简述优势

每一个模块,按照要求和规范封装以后,可以不同的项目中重复使用。必然可以提升开发效率 。

index.html
<script src="a.js"></script>
<script src="b1.js"></script>
<script src="b3.js"></script>
<script src="b2.js"></script>
index.html 入口文件
<script src="main.js"></script>

main.js

2.模块的分类

在Node中,模块分为两类:一类是Node提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块,自定义模块。

​ fs :内置模块

2.1 内置模块/核心模块

使用步骤:

1、引入模块 require( ‘模块名称’ )

2、查看手册,看模块的具体使用方法( 看的提供的方法 )

3、根据自己的业务合理编写

代码示例:

要求:想查询a.txt中有哪些内容 。
//1. 引入模块
const fs = require( 'fs' );

//2. fs.readFileSync( '路径'[,options] )
// let result = fs.readFileSync( './a.txt',{ encoding:'utf-8' } ) //
// console.log( result );

let result = fs.readFileSync( './a.txt','utf8' ) //
console.log( result );

2.2 文件模块

文件模块常见的有:自定义模块、第三方模块

每一个js都是被一个匿名函数包起来的
function (exports, require, module, __filename, __dirname) {
//adfsafdsafd

// asdfsafdasf

let a = 3

console.log( arguments.callee.toString() );
}

自定义模块

按照规范去封装功能。Commonjs规范

暴露模块:module.exports / exports

​ 但是在js文件中。默认都是用module.exports进行暴露的,而exports是 module.exports 的影子而已。

​ 而 module.exports是个对象

​ exports = module.exports

引入模块:require()

代码示例1:
封装两个数的和的功能方法,再暴露一个人名
module.exports用法

function sum( a , b ){
    return a + b
}

let username = 'swk'

//暴露模块
module.exports = {
    username,
    sum
}

代码示例2

function sum( a , b ){
    return a + b
}

let username = 'swk'

//暴露模块
exports.username = username
exports.sum2 = sum

专家忠告,不要混用。容易出事。

module.exports与exports之间的关系 。

默认都是用module.exports进行暴露的,而exports是 module.exports 的影子而已。

实战:封装一个去除左右空格的方法

function Trim(str){
	let reg = /^\s+|\s+$/g
	return str.replace( reg,'' )
}



function Trim(str){
	let reg = /^\s+|\s+$/g
	return str.replace( reg,'' )
}
Trim.left = function(str){
    let reg = /^\s+/g
	return str.replace( reg,'' )
}

Trim.right = function(str){
    let reg = /\s+$/g
	return str.replace( reg,'' )
}

module.exports = {
    Trim
}
补充:使用技巧

如果某一个模块只有一个功能。则可以直接把这个功能暴露出去。

function Trim(str){
	let reg = /^\s+|\s+$/g
	return str.replace( reg,'' )
}
Trim.left = function(str){
    let reg = /^\s+/g
	return str.replace( reg,'' )
}

Trim.right = function(str){
    let reg = /\s+$/g
	return str.replace( reg,'' )
}

module.exports = Trim  //如果只暴露一个函数,则只能使用module.exports

三、包和npm

1.包的概念:

简单来说:包就是模块的升级版,理解为把模块js文件放在了一个文件夹中而已,而某个包会用到多个js模块 。包有包的规范。只要是包也一定是遵循模块规范的。

在Nodejs中包由由包结构和包描述文件两个部分组成.

包结构:用于组织包中的各种文件,例如:源代码文件、资源文件

包描述文件:描述包的相关信息,例如:package.json、bin、lib等文件

包的目标:会用第3方包即可。

优点:更加的提高开发效率 。

2.npm

npm是随着Nodejs一起安装的一个包管理工具。

1、npm.cmd :工具,下载包的。

2、npm社区,所有的第3方包就是在社区中。 https://www.npmjs.com/

3.快速体验:包的用法。

示例:去除空格为例

//1. 下载包(在自己的项目中)
// npm install trim

//2. 在自己的文件中引入包/引入模块
let trim2 = require('trim')

// console.log( trim2 );

let str1 = '    aaa    bbbb     '
console.log( '-'+trim2(str1)+'-' );
// console.log( '-'+str1+'-' );

console.log( '-'+trim2.left(str1)+'-' );

4.第1次下载包都 发生了什么

  • 在哪个目录下下载,会自动生成一个node_modules文件夹,第三方包都会在此文件夹中
  • 还会生成一个package-lock.json文件(记录了包的远程路径)

5.npm常见命令与package.json

package.json文件

1、往大了说叫项目的说明书

2、往小了说叫包的说明书

可以比喻管家。可以管理项目,它是管理包的信息的

node项目开发流程

1、先创建项目文件夹

2、先雇一个管家(创建一个package.json文件)

  • npm init 一问一答的方式创建
  • npm init -y 按照默认方式生成文件。文件夹不要有中文、特殊符号。

3、创建项目的入口文件(启动这个文件,项目就运行起来了)

4、下载一些必要的第3方包

package.json:

{
  "name": "my_project1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js", //*****
  "scripts": {  *****
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "hsk",
  "license": "ISC",
  "dependencies": {//*****    项目依赖包
    "trim": "^1.0.0"
  }
}

安装包
  • npm install 包名

  • npm i 包名

  • npm i 包名@版本号

  • npm i 根据package.json中的dependencies去下载包

    说明:如果不加版本号,默认最新的

    npm i trim

    npm i trim@0.0.3

    npm i time-stamp

卸载包
  • npm uninstall 包名
  • npm r 包名

关于版本

生活中、开发中。有很多版本。版本也遵循一个规范 ,由3个数字组成。

x.x.x

第1个数字:大更新的版本号 5.0.0

第2个数字:小更新更新的版本 5.1.0

第3个数字:小bug的修复 5.0.1

其它命令相关

npm i/install 包名 [ --save|-S ] 记录在dependencies :项目依赖

例如:npm i trim / npm i trim -S / npm i trim --save

npm i/install 包名 [ --save-dev | -D ] 记录在 devDependencies:开发依赖 。注意:到webpack的时候详细去说。 development:开发

全局名

npm i 包名 [ -g ] g: global 全局的。全局包需要安装在一个公共的地方。全局包不是在项目中用的。全局包是可执行程序,是在命令用的。和node、npm用法场景类似 。 nodemon webpack express脚手架 vue脚手架

全局包、工具。

需求 :把md文件转换成html文件。

​ markdown

1、下载
npm i markdown -g  全局

2、查看安装的位置
C:\Users\你的电脑用户名\AppData\Roaming\npm

3、转换
md2html 源文件.md > 目标文件.html

4、看一下环境变量吧。
;C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\Administrator\AppData\Roaming\npm
隐藏文件查看

组织-》文件和文件夹选项-》查看-》选择 展示隐藏的文件 -》 确定

6.淘宝镜像

产生:包默认都是在国外的,下载的时候可能会慢 。所以淘宝官方帮我们解决了此问题。

淘宝官方做了一件:把国外的完全地复制了一份到淘宝的服务器上。( 每10分钟淘宝就同步一次 )

开发者还是用之前方式下载,只不过是从淘宝上下载的。需要额外的配置 。

第一种:全局安装cnpm工具( 我们npm工具如何使用的,cnpm一模一样 )

npm install -g cnpm --registry=https://registry.npm.taobao.org

第二种:配置npm命令的源:

在任意目录下执行此代码 。
npm config set registry https://registry.npm.taobao.org 


在 C:\Users\Administrator 此目录下多了一个  **.npmrc**
registry=https://registry.npm.taobao.org

6 模块加载机制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值