我的Node.js学习历程【一】之基础认识

前言

2021年1月20日,初遇Node.js,有感而发,写出如此文章,若有错误敬请指正。

一、Node是什么

简单的说 Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

二、Node的组成

  • JavaScript由三部分组成:ECMAScript、Bom、Dom
  • node.js是由ECMAscript及node环境提供的一些附加API组成的、包括文件、网络、路径等等一些更强大的API

三、基础语法及运行

  1. 创建后缀名为.js的文件

  2. 编写如下代码

    let arr = [1,2,3,4]
    console.log(arr)
    
  3. 找到文件位置,打开powershell窗口或cmd窗口

  4. 在命令行中输入下代码

    node hello.js
    

    就可以看到代码执行了

    img

如此我们可以的到如下总结

  1. node文件的后缀名都是.js
  2. 以往的学习中,都是把js放到html中才可以执行,但node不同,node是服务器技术,所以不存在Dom、Bom,所以运行方式会不一样
  3. 运行node的方式是使用node命令加上文件的名称
  4. 除了在命令行中运行node,还可以在开发工具的终端中运行,如vs Code

四、Node.js全局对象

在浏览器JavaScript中,通常window是全局对象,而Node.js中的全局对象是global,所有全局变量都是global对象的属性

Node.js中全局对象有以下方法,可以在任何地方使用,global可以省略

  • console.log() 控制台输出
  • setTimeout() 设置超时定时器
  • clearTimeout() 清除超时时定时器
  • setInterval() 设置间歇定时器
  • clearInterval() 清除间歇定时器

新建global.js文件,编写如下代码

global.setInterval(()=>{
    console.log('全局变量')
},1000)

可以发现代码正常运行,证明这些API确实是global的属性

五、NPM

简单介绍了Node.js那接下来就要来介绍npm了,npm是随同node.js一起安装的包管理工具,能解决node.js代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

当安装node.js成功后,可以通过nmp -v来查看是否安装成功,显示版本号就代表安装成功了。

npm命令

安装模块

语法

npm install <Module Name>

全局安装

没有指定全局安装时,默认的是本地安装,若要全局安装加上-g即可

npm install mysql -g

默认安装到路径

C:\Users\a\AppData\Roaming\npm\node_modules

卸载模块

语法

npm uninstall <Module Name>

卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:

npm ls

更新模块

npm update <Module Name>

搜索模块

npm search <Module Name>

解决下载速度慢的问题

通过安装 nrm 的方式,可以选择和切换下载源

使用步骤

  • 使用npm install nrm –g 下载它
  • 查询可用下载地址列表 nrm ls
  • 切换npm下载地址 nrm use 下载地址名称
  • 下载模块 npm install 模块名称

在这里插入图片描述

淘宝镜像

在国内通过npm的官方镜像下载是很慢的,所以在这里大家可以使用淘宝的NPM镜像。

淘宝的频率目前为10分钟更新一次以保证尽量与官方服务区同步

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

当然要记住安装成功后就需要使用cnpm来安装模块了

cnpm install <Module Name>

六、package.json文件

node_modules问题

当安装模块时,会创建node.modules目录,此目录上存储下载的模块及其依赖

目录的文件存在两个问题

  1. 文件以及文件夹过多琐碎,拷贝项目给别人时影响传输速度
  2. 复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会报错

package.json解决问题

传输项目时删除node_modules文件夹,使用者再使用命令来创建package.json来记录当前项目使用了那些模块

创建package.json

npm init -y

恢复安装

删除node_modules需要恢复安装

npm install

package.lock.json

此文件在第一次使用npm下载模块时就会被创建

作用如下:

  1. 锁定包的版本,确保再次下载时不会因为包版本不同而产生的问题
  2. 加快速度,因为该文件中已经记录了项目所依赖第三方包树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作

七、模块

基础认知

node.js中的有些系统模块是自带的无需下载,我来为大家列出几个比较常用的

模块说明
http创建服务器
path处理文件和目录的路径
url处理与解析URL
fs可以与文件进行交互

那么其他的模块要如何下载呢

npm install <Module Name>

千万不要忘了,下载完成后一定要引入,通常都使用const常量来声明,原因是避免变量的冲突,命名的方式就叫模块名就好了,最后使用require('')方法引入

const 模块名 = require('模块')

使用package.json查看使用了那些模块

创建package.json

npm init -y

1、fs文件操作

读取文件

同步读取

var fs = require('fs')
var res = fs.readFileSync('./01.txt','utf8')
console.log(res)

异步读取

var fs = require('fs')
fs.readfile('./01.txt','utf8',(err,data)=>{
    console.log(err)
    console.log(data)
})

分析:

  • 系统模块的引入使用require来引入
  • 模块名称需要用引号包裹
  • readFile是一个异步方法,所以需要用回调函数接收接取的结果
  • 回调函数中,err获取的是读取中的错误信息,如果过程中没有出现错误,则结果为null,反之是false。data为读取的文件内容。

所以一般在处理读取的文件之前,先判断err的值

const fs =require('fs')
fs.readFile('./01.txt','utf8',(err,data)=>{
    if(err) throw err  //如果err为false,就抛出错误信息
    console.log(data)
})

写入文件

语法:

fs.writeFile(file,data,callback)

案例:

const fs = require('fs')
fs.writeFile('./01.txt','波动拳',err=>{
    if(err) throw err
    console.log('ko')
})

2、http创建服务器

此服务器非比服务器

通过node创建的node服务器是在电脑上启动一个服务,作用是让当前电脑中的资源可以被其他电脑通过URL访问

//引入http包
const http = require('http')
//创建服务
let app = http.creatServer()
/*为app对象注册request事件,当客户端有请求到达服务端后,会触发这个事件执行
1)req:表示客户端请求信息,可以从中获取客户端的数据
2)res:表示服务端的响应,可以使用此对象向客户端发送信息
*/
app.on('request',(req,res)=>{
    //服务端必须向客户端发送响应信息,否则客户端就会一直等待d
    res.end('ok')
})
//为app设置监听口
app.listen(3000,()=>{
    console.log('http://127.0.0.1:3000')
})

报文

在http请求和响应的过程中传递的数据块叫做报文

客户端发往服务器的叫做请求报文

服务端返回客户端的叫做响应报文

请求报文

  • get 请求数据

     app.on('request', (req, res) => {
         req.headers  // 获取请求报文
         req.url      // 获取请求地址
         req.method   // 获取请求方法
     });
    
  • post 发送数据

app.on('data',(params)=>{
    //定义一个空字符串来存储从前台接收到的数据
    let postData = ''
    postData+=params
})
//全部接收完成后触发end事件
	app.on('end',()=>{
    
})

3.path自动拼接路径

由于window系统与Linux系统的选取文件路径方式不同,所以我们需要用path模块来帮我们自动拼接路径

在Unix/Linux中,路径的分隔采用正斜杠"/",比如"/home/hutaow";

而在Windows中,路径分隔采用反斜杠"",比如"C:\Windows\System"

let static_file_path = path.join('publice','static',pathname)

__dirname

__dirname可以返回文件的绝对路径,可以和path一起使用来达到找到文件绝对路径的效果

let static_file_path = path.join(__dirname,'publice','static',pathname)

4、mine判断文件类型

let type = mine.getType(res.url)

文件类型大约分为

  • text/html
  • image/png
  • image/jpeg
  • text/css
  • application/javascript

5、url处理与解析URL

使用WHATWG的API解析URL字符串

let myUrl = new URL(req.url ,'http://127.0.0.1:3030/')
  • myUrl.pathname 获取文件路径
  • myUrl.searchParams 获取携带的参数

6、moment格式化时间

let time = moment('被格式化的字符串').format('格式化的格式')
时间令牌
M
季度Q
星期d
Y
小时H
分钟m
秒数s
时间戳X

部分时间可以连写两个表示两位数,后面加个o表示结尾以th结尾

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值