一、文件系统/模块
在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