node基础

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 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值