Node基础

Node-基础

1.Node.js介绍

Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。 Node.js主要用于编写像Web服务器一样的网络应用 官网地址:Node.js 中文官网:Node.js 中文网

1.什么是Node.js?

它是一个环境。比如浏览器可以解析(html、css、js[ecma]),Node就是ECMAScript的环境(它对es6支持非常友好).

javascript ECMAScript

2.为什么学习Node.js?

前端--》与后端交互《--  后端(操作数据库)【node-express】 数据库【mysql】

浏览器是前端工程师特有的环境,而node它是后端环境。而后端有哪些语言(php、java、python、C#....) js的脚伸到后端了。比如:java能做的事情我们node也能做。 前端干不了的事情后端来干(比如我们的node)。因为语法不用学了,已经学完了,降低成本。 比如前端干不了以下事情:数据库操作、删除文件、动态网站。 通过学习Node.js深刻认识前后端交互,而且后端学习的Vue、React它们环境都依赖Node。

3.Node.js简史

它是2009年发布-2021年,经过这几年发展,Node也已经很成熟了。

4.Node.js特点

铃铛
1个服务员  
    张三
    李四
    王五
    
    
1个服务员---单线程
不等待-----非阻塞I/O input/output
铃铛-------事件驱动

1.单线程

单线程的好处,减少了内存开销

2.非阻塞I/O

I/O:是文件读写操作,指令操作。非阻塞:程序顺利往下执行

3.事件驱动【回调函数】

程序怎么知道该执行了呢?就是由事件驱动(事件触发)

5.Node.js和javascript的区别

JavaScript:ecmascript/BOM/DOM,以及其它的内置对象 RegExp、Date、Math... Location

有window|document

Node: Ecmascript/Node提供的方法,没有DOM和BOM,无window|document 纯语法:let const if for switch 数据类型、表达式、运算符、函数、class、RegExp、Date、Math

Node提供的方法: fs.rmfile( ) .

6.Node.js的应用领域

API接口 动态网站开发 即时通信 有一些第三方团队会基于Node开发一些前端工具

2.安装

1.下载

如果你的电脑是wind10,就直接官网下载即可。如果是win7 win8.1 就下载网盘链接

1.官网下载
2.window10以下电脑
链接:https://pan.baidu.com/s/1iPeZV2mub_tZjEuTHsiUTQ
提取码:o4lu

不要更换安装路径

2.验证是否安装成功

node -v 

3.运行第一个node程序

node 1.js

3.命令行和cmd(终端)

1.打开cmd的方式

第1种:开始->输入cmd->回车
第2种:win+r=>输入cmd->回车,wind键是ctrl和alt中间的键
第3种:在任意目录下的地址栏输入cmd->回车
第4种:在文件夹中--》 按shift键+右键--》在此处打开命令窗口 --》打开

2.常用命令

cd 目录名称 //进入某个目录
cd .. //返回上一级目录
F:  //切盘
dir //查看目录下的信息
cls //清屏
md 目录 //创建目录
rd 目录 //删除目录
上键 :查询上一次命令
下键:查询下一个命令
tab键:自动补全名称

https://jingyan.baidu.com/article/6766299796ce9354d41b8443.html https://jingyan.baidu.com/article/36d6ed1f0355235bcf4883d4.html cmd命令不是重点,重点是使用技巧和cd、cls

4.环境变量

1.演示

mspaint //打开绘画板
notepad //打开记事本

2.演示配置环境变量

Win10:

 

Win7:

 

3.总结

xxx不是内部或外部命令,也不是可运行的程序。 你确实没有安装,要么就是环境变量出了问题。 而node.js安装成功以后,自动把node的路径安装到了环境变量path中。所以可以直接在任意目录下运行node.exe

5.文件系统 fs

1.文件的操作流程

打开文件-> 对文件进行操作-> 关闭文件。

1) 打开文件

语法:

fs.openSync(path[,flags])

参数说明: path:必写参数,是要打开的目标文件名的字符串(可以包含文件所在的具体路径) flags:可选参数,设置打开文件的模式(访问模式),常用的模式为写入、追加。

模式说明
a文件用于追加。如果文件不存在,则创建该文件
w打开文件用于写入。如果文件不存在则创建文件,如果文件存在则截断文件

2)对文件进行操作

fs.writeSync(fd,内容)

3)关闭文件

fs.closeSync(fd)

2.进制(了解)

2.1 常见进制简述

二进制、八进制、十进制、十六进制... 以二次幂往下增。因为所有数据底层都是二进制(0和1),计算机只认识0和1. 而且文件的数据读写和网络中的数据 传输都是2二进制传递的

2.2 进制转换原理

二进制转十进制即可。 2进制逢2进1,10进制逢10进1 十六进制:0-9 A B C D E F 十进制:143

1*10^2+4*10^1+3*10^0=143

二进制:1010 =》十进制

1*2^3+0*2^2+1*2^1+0*2^0=10

在线转换器 进制转换 - 在线工具

2.3 计算机存储原理

最小的存储单为是: b(byte)位 存储文件的最小单位:B 字节 1B = 8b

1T = 1024M
1M = 1024KB
1KB = 1024B
1B = 8b

2.4 ASCII

每一个ascii码值代表了一个具体的字符。底层都会用二进制数表示具体的字符。 但是:世界上有很多国家(中国), utf-8国标码(国际通用的)

3.两种编程风格(同步和异步)

同步的特点:可以用变量接收函数的返回值。node中所有内置函数都以Sync结尾。 回调的特点:node中的回调风格的方法,必须传递回调函数,否则报错,然后不以sync结尾。同时结果必须用回调 函数接收。 注意:推荐使用同步风格。

4.文件操作

1.读取文件

回调风格:

fs.readFile(path[,options],callback)

同步风格:

fs.readFileSync(path[,options])
const fs = require("fs");
// 文件操作推荐使用同步

//读取文件 同步读取
let result = fs.readFileSync("./demo/2.txt")
// console.log(result);//<Buffer 68 65 6c 6c 6f 2c 77 6f 72 6c 64>  默认是二进制,但是二进制太长了,所以最后以十六进制展示
console.log(result.toString());//hello,world


// 万国码 utf-8
let result2 = fs.readFileSync("./demo/1.txt", { encoding: "utf-8" })
// console.log(result2);//hello threehello four

// 万国码 简写 推荐
let result3 = fs.readFileSync("./demo/1.txt", "utf-8");
// console.log(result3);//hello threehello four

2.写入文件

语法:

fs.writeFileSync(path,data[,options])

参数说明: path:必选参数,文件路径 data:文件中写入的数据 options:可选参数,设置以何种方式写入内容,主要有替换和追加{flag:'a'} a代表追加append,w代表替换,默认为替换

// fs.writeFileSync("./demo/2.txt","abcdefg",{flag:"w"})

fs.writeFileSync("./demo/2.txt","hijklmn",{flag:"a"})

3.文件信息

语法:

 fs.statSync(path)

判断文件或文件夹是否存在,如果不存在则报错。还可以判断是文件还是文件夹

参数说明: path:必选参数,文件或文件夹的路径地址

其他: 判断文件:stat.isFile() 判断目录:stat.isDirectory() Stats{ size:8,//文件的大小 atimeMs:1620626644219.5903,access:访问时间 mtimeMs:1620634078057.7815,modify:修改时间 ctimeMs:1620634078057.7815,create:创建时间 }

// fs.statSync("./demo2/2.txt") 返回一个Stats类型
/* 里面有2个方法,
    isFile()  是否是文件
    isDirectory() 是否是文件夹
*/

let stat = fs.statSync("./demo2/2.txt")
console.log(stat.isFile());//true
console.log(stat.isDirectory());//false  


let s2=fs.statSync("./demo");
console.log(s2.isFile());//false
console.log(s2.isDirectory());//true

4.修改文件名称

语法:

fs.renameSync(oldpath,newpath)

参数说明: oldpath:必选参数,原文件|文件夹路径 newpath:必选参数,新文件|文件夹路径

//修改名称 fs.renameSync(oldPath,newPath)
// 1.可以修改名称
fs.renameSync("./demo/1.txt","./demo/2.txt") 

// 2.实现剪切功能
fs.renameSync("./demo/2.txt","./demo2/2.txt")

5.删除文件

语法:

     fs.unlinkSync(filepath)

参数说明: ​ filepath:必选参数,要删除的文件路径

//删除文件 fs.unlinkSync(文件地址)
fs.unlinkSync("./demo/2.txt")

6.捕捉同步代码错误

//如果一段代码可能会出错,建议使用try{}catch(err){}
//如果不使用try{}catch(err){},出错了,程序就停止了;如果使用了他们,出错了,会进入catch,程序继续运行
try {
    let result = fs.readFileSync("./demo2/3.txt", "utf-8");
    console.log(result);
}catch(error){
    console.log(error);
    console.log("出错了");
}


console.log("嘻嘻嘻");

5.目录操作

1.创建目录

语法:

   fs.mkdirSync(path[,options])

参数说明: ​ path:必选参数,要创建的文件夹完整路径名称 ​ options:可选参数,是否递归创建文件夹,{recursive:true}true代表递归创建

// fs.mkdirSync(目录地址,{recursive:true })
//如果要多层创建文件夹,需要使用递归模式

// recursive:递归
// fs.mkdirSync("./demo3")

// fs.mkdirSync("./demo4")
fs.mkdirSync("./aa/bb/cc/dd",{recursive:true})

2.删除目录

语法:

  fs.rmdirSync(path)

注意文件夹必须是空的,才可以删除 ​ 参数说明: ​ path:必选参数,要删除的文件夹完整路径 ​

//删除 fs.rmdirSync(地址)  
// 注意:文件空的,才可以被删除


// fs.rmdirSync("./demo3")

// fs.rmdirSync("./demo4")

// fs.rmdirSync("./demo")

fs.rmdirSync("./aa/bb/cc/dd")

3.读取目录

语法:

  fs.readdirSync(path)

参数说明: path:必选参数,要读取的文件夹的完整路径

//读取目录 =fs.readdirSync(地址) 返回该目录下的所有文件和文件夹

let a=fs.readdirSync("./demo4");//[ '1.html', '1.txt', 'aa' ]
console.log(a);

4.删除目录和目录下所有内容

const fs = require("fs")

//自己封装
let removeDir = (path) => {
    // 1.读取目录
    let files = fs.readdirSync(path);//["1.txt","aa"]

    // 2.遍历files,查看是不是文件
    files.forEach(item => {
        //3.取出文件信息
        let stat = fs.statSync(`${path}/${item}`)

        // 4.判断是否是文件
        if (stat.isFile()) {
            //文件 删除文件
            fs.unlinkSync(`${path}/${item}`)
        } else {
            //目录
            removeDir(`${path}/${item}`)
        }
    })
    //删除文件夹
    fs.rmdirSync(path)
}

removeDir("./demo4")

6.其他

1.全局变量

在浏览器 JavaScript 中,通常 window是顶层对象,而 Node.js 中的顶层对象是 global Node平台内置了例如:filename和dirname等全局变量setInterval() setTimeout()等方法

 console.log(global);
Object[global] {
    global: [Circular],
    clearInterval: [Function: clearInterval],
    clearTimeout: [Function: clearTimeout],
    setInterval: [Function: setInterval],
   setTimeout: [Function: setTimeout] { [Symbol(util.promisify.custom)]: [Function] },
    queueMicrotask: [Function: queueMicrotask],
    clearImmediate: [Function: clearImmediate],
    setImmediate: [Function: setImmediate] {
    [Symbol(util.promisify.custom)]: [Function]
    }
}

2.优化路径

相对路径的问题

①Node.js中使用的相对路径指的是当前的cmd指向的路径; ②避免过多使用相对路径而造成思维混乱 ③使用动态的绝对路径解决这个问题

具体优化代码

console.log(__dirname);//E:\0713-third\day04\代码
console.log(__filename);//E:\0713-third\day04\代码\17-其他.js


// fs.readFileSync("./demo/person.json","utf-8") //相对地址
let r = fs.readFileSync(__dirname + "/demo/person.json", "utf-8")//绝对地址 推荐
console.log(r);

6.面试题

●Node.js的特点是什么
●在使用fs模块操作文件的时候为什么要优化路径
	避免思维胡乱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值