Node简介
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
Node.js主要用于编写像Web服务器一样的网络应用
官网地址:https://nodejs.org/en/
中文官网:http://nodejs.cn/
什么是Node.js
它是一个环境。它是对js代码非常友好的一个环境。(它使用是chrome V8引擎的环境)。
但是它是属于后端开发者环境(当然目前的前端你想很好的开发vue或react,也需要安装此环境)。
前端干不了的事情,后端去干 。node环境可以和任何一门后端语言相媲美(java/php/python…)。
为什么学习Node.js
因为语法已经学完了:就是js(es5和es6)
我们主要学习后端的思想,到底前后端是如何协作开发的。后端到底为前端提供了什么 。
重点:npm、http协议(前后端交互:如何传参)、ajax
Node.js简史
现在已经有11年了,node已经很成熟了。
Node.js的特点
-
单线程
和多线程对应 。
node单线程(它是主要来进行任务程序的调度工作),多线程可以能运行大型电脑上程序。
4G的内存:处理200个多线程
4G的内存:可能能处理2000个单线程
-
非阻塞I/O
但是:js本身是阻塞的。而且js本身是也是单线程 。
任务程序的调度,node不会阻塞的。
-
事件驱动
没有事件就不知道后续要干什么 了。
Node与JavaScript之间的区别
JavaScript:ecmascript/BOM/DOM
Node: Ecmascript/Node提供的方法(内置函数),没有DOM和BOM,更没有window
Node的应用领域
java/php/python这些后端语言可以做的,我们node都可以做
比如:动态网站、开发接口
即时聊天系统 。
基于node环境开发出来的一些前端工具:vue、react、webpack…
Node安装
下载与安装
下载地址1:https://nodejs.org/en/download/ (V14只能是win10及以上。)
下载地址2:https://npm.taobao.org/mirrors/node/ v12
第一个nodejs程序
打开cmd 然后运行 node -v,验证node是否有问题。
原理:node.exe是可执行程序,那么exe可以省略的。就是cmd窗口会自动去寻找你的node.exe,然后通过node.exe去解析你的js文件 。
命令行与cmd
cmd和命令介绍
可运行一些命令的一个窗口。包含:系统自带的命令、.exe程序、.cmd程序
node.exe/git.exe/npm.cmd
常用命令
https://www.jb51.net/article/141568.htm
输入help查看所有的命令。
-
切换目录
cd 目录名 切换到某一个子目录下 cd .. 上一级
-
查看目录下的信息
dir : directory
-
清屏
cls
-
创建目录
md 文件夹
使用技巧
tab →←↑↓
tab: 自动补全。
↑↓: 找到最近历史记录,关闭cmd后,历史记录会丢失 。
→←:
环境变量
4.1 什么是环境变量
就是让开发者快速的找到一个应用程序文件(exe、cmd)
一些程序就是要在cmd中运行的(node/git)等等。
注意:有些软件安装好以后会自动配置好环境变量(node/git),有些就没有配(qq)。
4.2 如何配置环境变量
win10:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cdiYoOT-1635505359643)(img/1-7环境变量win10.png)]
win7:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RANlM0qg-1635505359647)(img/image-20210318102602330.png)]
修改了环境变量,重启cmd才生效。
如果出现xxx不是内部命令或外部程序,无外乎3种情况:
1. 命令确实写错了
2. 没有安装此程序
3. 环境变量出了问题
文件fs模块(内置模块)
进制(了解)
常见进制简述
二进制、八进制、十进制、十六进制…
计算机只认识二进制 。
10: 逢10进1. 0 1 2 3 ——9
8:逢8进1. 0 1 2 3 4 5 6 7
2:逢2进1, 0 1
16: 0 1 2 3 4 5 6 7 8 9 A B C D E F
进制转换原理
https://tool.lu/hexconvert/
523
5 2 3
5*10^2 + 2*10^1 + 3*10^0 = 523
1 0 1 0
1*2^3 0 1*2^1 0 = 8+2
计算机存储原理
重量、长度、money
钱:毫、厘、分、角、元
文件存储单位。
计算机的最小单位:b:位 bit
而存储文件的最小单位是 B:字节(byte)
1B = 8b
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQ6CtJNV-1635505359649)(assets/1634021812741.png)]
0011 0110: 经过分析这个2进制在计算机中会解析成6 。
英文只需要1个字节就可以表示。 0-9 a-z A-Z 标点符号 特殊符号
**而国际上有很多语言(中文)。**所以才衍生通用的万国码utf8:3个字节
ASCII
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I7rl7vOk-1635505359652)(img/2-1ascii.png)]
文件的操作流程( 不常用方法 )
在Nodejs中可以通过内置的fs模块来操作系统文件。
文件系统操作都具有同步和异步两种方式。
操作:删除、创建、写入、读取…
打开文件
语法:
fs.openSync(path[, flags])
参数说明:
path:必写参数,是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
flags:可选参数,设置打开文件的模式(访问模式),常用的模式为只读、写入、追加。
打开模式表:
模式 | 说明 |
---|---|
a | 文件用于追加。 如果文件不存在,则创建该文件 |
ax | 类似于a,但如果路径存在,则失败 |
a+ | 打开文件用于读取和追加。 如果文件不存在,则创建该文件 |
ax+ | 类似于 ‘a+’,但如果路径存在,则失败 |
as | 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件 |
as+ | 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件 |
r+ | 打开文件用于读取和写入。 如果文件不存在,则会发生异常 |
rs+ | 打开文件用于读取和写入(在同步模式中)。 指示操作系统绕过本地的文件系统缓存 |
w | 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件 |
wx | 类似于 ‘w’,但如果路径存在,则失败 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVFUeRIC-1635505359654)(C:/Users/Administrator/Desktop/%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0/%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5/%E6%BC%94%E7%A4%BA%E5%A4%87%E4%BB%BD/this-is-the-803-web-notes/day04/%E7%AC%94%E8%AE%B0/assets/1634025169889.png)]
path参数未带中括号,程序里面代表必传参数 。
写入内容
语法:
fs.writeSync( fd,内容 )
关闭文件
语法:
fs.closeSync(fd)
完整案例:不需要练
//你使用什么功能模块,就需要先require:引入
// let fs = require('fs') //使用fs功能模块: file system
const fs = require('fs') //使用fs功能模块: file system
//这里用常量更好 ,因为这就是内置功能,我们不能改
// fs = 123
//从js语法上考虑require是个函数,只不过传递了一个fs字符串参数 。
//返回了一个对象
// console.log( typeof fs )//object,对象就是由属性和方法组成 。
//1. 创建文件并打开
//fs.openSync( 文件路径,打开模式 ) => 打开文件的标识
// console.log( fs.openSync )
let fd = fs.openSync( 'demo.txt','a' )// 默认是r
/*
w:write 以截取的方式打开文件,并可以写入内容
r:read 只以读取的方式打开文件
a:append 以追加的方式打开文件
*/
// console.log( fd,'标记就是一个数字' )
//2. 写入内容并保存
let str = '111平生第1次使用程序写入文件\r\n'
//fs.writeSync( 打开的文件标识,写入的内容 ) //无返回值
// \r\n 程序中的换行 html中是 <br>
fs.writeSync( fd,str )
//3. 关闭(要释放内存)
fs.closeSync( fd ) //关闭哪个文件
总结出来的。
fs = require('fs')
\r\n 程序中的换行
w:write 以截取的方式打开文件,并可以写入内容
r:read 只以读取的方式打开文件
a:append 以追加的方式打开文件
文件操作
写入文件
语法:
fs.writeFileSync( path,data[,options] )
参数说明:
path:必选参数,文件路径
data:文件中写入的数据
options:可选参数,设置以何种方式写入内容,主要有替换和追加 { flag:‘a’ }a代表追加append,w代表替换,默认为替换
代码示例:
// 写入操作
//fs.writeFileSync( 文件路径,写入的内容[,写入方式] )
const fs = require('fs') //引入fs功能
// fs.writeFileSync('demo2.txt','abc') //不需要返回值,无返回值
fs.writeFileSync('demo2.txt','abc',{ flag:'a' }) //不需要返回值,无返回值
//它自己打开了文件,写入内容,自己最后关闭
读取文件
语法:
fs.readFileSync( path[,options] )
参数说明:
path:必选参数,文件路径
options:可选参数 { encoding:‘utf8’ } | ‘utf8’,以utf8编码格式读取内容,中括号代表可选参数
代码示例1:
const fs = require('fs') //引入fs
// fs.readFileSync( 路径[,options|string] )
let result = fs.readFileSync('demo2.txt') //返回文件中的内容
// console.log( result,'默认是个二进制' ) //node中会以16进制来表示2进制 1010:a
//2 8 16 32 64 128 256 512 ...
console.log( result.toString() )
修改文件名称
语法:
fs.renameSync( oldpath,newpath )
参数说明:
oldpath:必选参数,原文件|文件夹路径
newpath:必选参数,新文件|文件夹路径
删除文件
语法:
fs.unlinkSync( filepath )
参数说明:
filepath:必选参数,要删除的文件路径
代码示例:
const fs = require('fs')
//1. 删除文件 fs.unlinkSync( 文件路径 ) 没有返回值
// fs.unlinkSync( 'test.txt' )
//2. 重命名( 剪切操作 )
//fs.renameSync( 原文件名,新文件名 )
// fs.renameSync( 'demo3.txt','demo33.txt' )//重命名 ,无返回值
fs.renameSync( 'demo33.txt','a/demo33.txt' ) //无创建文件夹的操作
文件信息
语法:
fs.statSync( path )
参数说明:
path:必选参数,文件或文件夹的路径地址
其他:
判断文件:返回对象.isFile()
判断目录:返回对象.isDirectory()
代码示例:
// file : 文件, directory:目录
//fs.statSync( 路径 ) =》 对象
const fs = require('fs')
let stats = fs.statSync( 'b' )
// console.log( stats,'文件信息' )
//stats.isFile()
//stats.isDirectory()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MklgWwr7-1635505359656)(C:/Users/Administrator/Desktop/%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0/%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5/%E6%BC%94%E7%A4%BA%E5%A4%87%E4%BB%BD/this-is-the-803-web-notes/day04/%E7%AC%94%E8%AE%B0/assets/1634086611915.png)]
atime: access time 访问时间
mtime:modify time 修改时间
ctime:create time 创建时间
文件夹操作
创建目录
语法:
fs.mkdirSync( path[,options] )
参数说明:
path:必选参数,要创建的文件夹完整路径名称
options:可选参数,是否递归创建文件夹,{ recursive:true } true代表递归创建
代码案例:
const fs = require('fs')
// fs.mkdirSync( 路径[,options] )
// fs.mkdirSync('b')
fs.mkdirSync( 'aa/bb/cc',{recursive:true} ) //递归创建目录
删除目录
语法:
fs.rmdirSync( path[,options] )
参数说明:
path:必选参数,要删除的文件夹完整路径
options:可选参数,是否递归删除文件夹,{ recursive:true } true代表递归创建,只有V14版本支持
代码案例:
const fs = require('fs')
//fs.rmdirSync( 非空目录 )
// fs.rmdirSync('b') //无返回值
fs.rmdirSync('aa') //非空,会报错。
读取目录
语法:
fs.readdirSync(path)
参数说明:
path:必选参数,要读取的文件夹的完整路径
如果读取成功返回一个数组。
代码案例:
const fs = require('fs')
//fs.readdirSync( 目录路径 ) //会返回一个数组(当前目录的第1层)
let files = fs.readdirSync( 'a' )
console.log( files ) //[ 'aa','bc.md','demo33.txt' ]
// 读取任意一个文件夹,要递归读取出来 。
/*
a/bc.md
a/demo33.txt
a/aa/aaaa/abc.xls
*/
const fs = require('fs')
let dir = 'a' //读取任意一个文件夹 a
function myReadDir( dir ){
let files = fs.readdirSync( dir )
// console.log( files ) //[ aa,bc.md,demo33.txt ]
//console.log( dir + '/'+ files[1],'------' )
// files[1]
files.forEach( file=>{
let filePath = dir + '/'+ file //要判断的文件名称,检查是文件/文件夹
let stats = fs.statSync( filePath )
//console.log( stats,'文件的信息' )
if( stats.isFile() ){
console.log( filePath,'是文件,所以我输出了' )
}else{ //如果是文件夹,则继续读取此目录
myReadDir(filePath)
}
} )
}
myReadDir( dir )
两种编程风格
编程风格
一、函数调用完毕有返回值的。
//1. 函数调用完毕有返回值的
// let result = myMethod()
function sum( a,b ){
return a + b
}
let result = sum( 10,20 )
console.log( result);
二、回调函数的风格,注意:返回值是通过回调函数拿到异步结果的。
//2. 回调函数的风格,注意:有返回值是通过回调函数拿结果的。
/*
function A( res ){
console.log( res,'这是A函数中输出的结果' )
}
function B( cb ){
let a = 20
let b = 30
let result = a + b
cb( result )
}
B( A ) //A是B的回调函数
*/
function A( res ){ //A函数可能是上一个业务的结果,再进行加工处理。
console.log( res + 5000,'这是A函数中输出的结果' )
}
function B( cb ){ //假设B函数是拿到某个员工的薪金,
setTimeout( ()=>{
let salary = 10000
//console.log( salary ,'此时是在B函数中' )
cb( salary )
//return salary //返回不了任何东西
} ,1000)
}
B( A ) //A是B的回调函数
两种风格方法
- 以读取文件为例
在node中以sync为结尾,是我们推荐的(函数调用完 有return返回值的)。不带Sync的就是回调风格,而且必须要写回调,不写报错。
fs.readFileSync()
fs.readFile()
const fs = require('fs')
// let result = fs.readFileSync('demo2.txt')
// console.log( 111 )
// let result = fs.readFileSync('demo222222.txt')
// console.log(222)
// console.log( result,'读取到了结果' )
//回调风格
//回调函数的第1个参数永远是错误信息
//如果没有错,那么错误信息为null,有错误那么就是具体的错误对象
//回调函数的第2个参数为这个函数执行完有结果。
// fs.readFile( 'demo2.txt',function(err,result){
// console.log( err,'我是错误信息对象' )
// console.log( result.toString(),'回调风格的内容' )
// } )
//fs.unlinkSync()
// fs.unlink( '0test.txt',(err,result)=>{
// console.log( err,result )//null undefined
// } )
其他
全局变量
在浏览器 JavaScript 中,通常 window是顶层对象,而 Node.js 中的顶层对象是 global
Node平台内置了例如:__filename
和 __dirname
等全局变量 setInterval() setTimeout()等方法
代码示例:
/*
__filename: 当前文件的完整地址(包含盘符和文件名)
__dirname: 当前文件的完整路径地址(包含盘符和不包含文件名)
*/
console.log( __filename,'filename' )
console.log( __dirname,'dirname' )
优化路径
我们使用fs的时候,一定要记录:相对路径指的是:相对于cmd中的路径, 也就是说在使用fs时,如果用相对路径不安全。所以要结合 __dirname 变成绝对路径
const fs = require('fs')
// let result = fs.readFileSync('./demo.txt','utf-8')
// console.log( result )
// let filepath = 'C:\\Users\\Administrator\\Desktop\\第三阶段服务端开发\\day04\\代码2\\demo.txt'
let filepath = __dirname + '\\demo.txt'
// console.log( filepath,'拼接的字符串路径' )
let result = fs.readFileSync(filepath,'utf-8')
console.log( result )
中的顶层对象是 global
Node平台内置了例如:__filename
和 __dirname
等全局变量 setInterval() setTimeout()等方法
代码示例:
/*
__filename: 当前文件的完整地址(包含盘符和文件名)
__dirname: 当前文件的完整路径地址(包含盘符和不包含文件名)
*/
console.log( __filename,'filename' )
console.log( __dirname,'dirname' )
优化路径
我们使用fs的时候,一定要记录:相对路径指的是:相对于cmd中的路径, 也就是说在使用fs时,如果用相对路径不安全。所以要结合 __dirname 变成绝对路径
const fs = require('fs')
// let result = fs.readFileSync('./demo.txt','utf-8')
// console.log( result )
// let filepath = 'C:\\Users\\Administrator\\Desktop\\第三阶段服务端开发\\day04\\代码2\\demo.txt'
let filepath = __dirname + '\\demo.txt'
// console.log( filepath,'拼接的字符串路径' )
let result = fs.readFileSync(filepath,'utf-8')
console.log( result )