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
三、基础语法及运行
-
创建后缀名为
.js
的文件 -
编写如下代码
let arr = [1,2,3,4] console.log(arr)
-
找到文件位置,打开powershell窗口或cmd窗口
-
在命令行中输入下代码
node hello.js
就可以看到代码执行了
如此我们可以的到如下总结
- node文件的后缀名都是
.js
- 以往的学习中,都是把js放到html中才可以执行,但node不同,node是服务器技术,所以不存在Dom、Bom,所以运行方式会不一样
- 运行node的方式是使用node命令加上文件的名称
- 除了在命令行中运行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目录,此目录上存储下载的模块及其依赖
目录的文件存在两个问题
- 文件以及文件夹过多琐碎,拷贝项目给别人时影响传输速度
- 复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会报错
package.json解决问题
传输项目时删除node_modules
文件夹,使用者再使用命令来创建package.json
来记录当前项目使用了那些模块
创建package.json
npm init -y
恢复安装
删除node_modules
需要恢复安装
npm install
package.lock.json
此文件在第一次使用npm下载模块时就会被创建
作用如下:
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生的问题
- 加快速度,因为该文件中已经记录了项目所依赖第三方包树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
七、模块
基础认知
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结尾