初识Node.js
什么是Node.js
Node.js是一个基于chrome V8引擎的JavaScript运行环境。
Node.js可以做什么
Node.js作为一个JavaScript的运行环境,仅仅提供了基础的功能和API。然而,基于Node.js提供的这些基础功能,很多强大的根据和框架层出不穷,所以学会了Node.js,可以让前端程序员胜任更多的工作和岗位:
1.基于Express框架,可以快速构建web应用
2.基于Electron框架,可以构建跨平台的桌面应用
3.基于restify框架,可以快速构建API接口项目
4.读写和操作数据库、创建实用的命令行工具辅助前端开发,etc…
总之:Node是大前端时代的大宝剑,有了Node.js这个超级buff的加持,前端程序员的行业竞争力会越来越强。
Node.js怎么学
JavaScript基础语法+Node.js内置API(fc,path,http等)+第三方API模块(express,mysql等)
在Node.js环境中执行JavaScript代码
终端的快捷键
在windows的powershell或cmd终端中,我们可以通过如下快捷键,来提高终端操作效率:
1.使用↑键,可以快速定位到上一个执行的命令
2.使用Tab键,能够快速补全路径
3.使用esc键,能够快速清空当前输入的命令
4.输入cls命令,可以清空当前终端里面的命令
fs文件系统模块
什么是fs文件系统模块
fs模块是Node.js官方提供的,用来操作文件的模块。它提供了一系列方法和属性,用来满足用户对文件的操作需求。
例如:
- fs.readFile()方法,用来读取指定文件中的内容
- fs.witeFile()方法,用来向指定的文件中写入内容
fs文件系统模块
导入fs模块
如果要在JavaScript代码中,使用fs模块来操作文件,则需要使用如下方法先导入:
const fs = require(‘fs’)
读取指定文件中的内容
1.fs.readFile()的语法格式
使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:
fs.readFile(path,[options],callback)
参数解读:
- 参数1:必选参数,字符串,代表文件的路径
- 参数2:可选参数,表示以什么编码格式来读取文件。
- 参数3:必选参数,文件读取完毕后,通过回调函数拿到读取的结果
判断文件是否读取成功
判断err对象是否为null
向指定的文件中写入内容
1.fs.writeFile()的语法格式
使用fs.writeFile()方法,可以向指定的文件中写入内容,语法格式如下:
fs.writeFile(file,data[,options],callback)
参数解读:
- 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
- 参数2:必选参数,表示要写入的内容
- 参数3:可选参数,表示以什么格式写入文件内容,默认值为utf8
- 参数4:必选参数,文件写入完成后的回调函数
判断写入文件是否成功
判断err对象是否为null
fs模块路径动态拼接的问题
在使用fs模块操作文件时,如果提供的操作路径是以./或…/开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会执行node命令时所处的目录,动态拼接出被操作文件的完整路径。
解决方案:在使用模块操作文件时候,直接提供完整的路径,不要提供./或…/开头的相对路径,从而防止路径动态拼接出问题
缺点:移植性差,不利于维护
最好的解决方法:__dirname 表示当前文件所处的目录
path路径模块
什么是path路径模块
path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
例如:
- path.join(),用来将多个路径片段皮杰成一个完整的路径字符串
- path.basename()方法,用来从路径字符串中,将文件名解析出来
导入path模块
const path = require(‘path’)
路径拼接
1.path.join()的语法拼接格式
使用path.join()方法,用来将多个路径片段皮杰成一个完整的路径字符串,语法如下:
path.join([…paths])
注意:凡是涉及拼接路径操作,都要使用path.join()方法进行处理。不要直接使用+号
获取路径中的文件名
1.path.basename()的语法格式
使用path.basename()方法,用来从路径字符串中,将文件名解析出来
path.basename(path[,ext])
参数解读:
- path:必选参数,表示一个路径的字符串
- ext:可选参数,表示文件扩展名
- 返回:表示路径中的最后一部分
获取路径中的文件扩展名
1.path.extname()的语法格式
使用path.extname()方法,可以获取路径中的扩展名部分,语法格式如下:
path.extname(path)
参数解读:
- path:必选参数,表示一个路径的字符串
- 返回:返回得到的扩展名字符串
http模块
什么是http模块
http模块是Node.js官方提供的、用来创建web服务器的模块。通过http模块提供的http.createServer()方法,就能方便的把一台普通的电脑,变成一台web服务器,从而对外提供资源服务。
如果要使用http模块创建Web服务器,则需要先导入它:
const http = require(‘http’)
了解http模块作用
服务器和普通电脑的区别在于,服务器上安装了web服务器软件,例如IIS、Apache等。通过安装这些服务器软件,就能把一台普通的电脑变成一台web服务器。
在Node.js中,我们不需要使用IIS,Apache等这些第三方web服务器软件。因为我们可以基于Node.js提供的http模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供服务。
服务器相关的概念
IP地址
IP地址就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性。如果把‘个人电脑’比作‘一台电话’,那么‘IP地址’就相当于‘电话号码’,如果在知道对方IP地址的前提下,才能对应的电脑之间进行数据通信。
IP地址的格式,通常用‘点分十进制’表示成(a.b.c.d)的形式,其中,a,b,c,d都是0-255之间的十进制整数。例如:用点分十表示的IP地址(192.168.1.1)
注意:
1.互联网中每台Web服务器,都有自己的IP地址,例如:大家可以在Windows的终端中进行ping www.baidu.com命令,即可查看百度服务器的IP地址。
2.在开发期间,自己的电脑既是一台服务器,也是一台客服端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址,就能把自己的电脑当做是一台服务器进行访问了。
域名和域名服务器
尽管IP地址能够唯一标记网络上的计算机,但IP地址是一长串数字,不直观,而且不便于记忆,于是人们发明了一套字符型的地址方案,即所谓的域名地址。
IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器的电脑中,使用者只需要通过记号的域名访问服务器即可,对应的转化工作由域名服务器实现。因此,域名服务器就是提供IP地址和域名之间的转化服务的服务器。
注意:
1.单纯使用IP地址,互联网中的电脑也能够正常工作。但是有了域名加持,能够让互联网的时间变得更加方便。
2.在开发测试期间,127.0.0.1对应的域名是localhost,它们代表我们自己的这台电脑,在使用效果上没有任何区别。
端口号
计算机中的端口号,就好像是现实生活中的门牌号一样。通过门牌号,外卖小哥可以在整栋大楼众多的房间中,准确的把外卖送到你手里。
同样的道理,在一台电脑中,可以运行成百上千个web服务。每个web服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应web服务进行处理。
注意:
1.每个端口号不能同时被多个web服务占用。
2.在实际应用中,URL中的80端口可以被省略。
创建最基本的web服务器
创建web服务器的基本步骤
1.导入http模块
2.创建web服务器实例
3.为服务器实例绑定request事件,监听客户端的请求
4.启动服务器
req请求对象
只要在服务器接收到了客户端的请求,就会调用通过server.on()为服务器绑定的request事件处理函数。如果想在事件处理函数中,访问和客户端相关的数据或属性,可以使用如下的方式:
res响应对象
在服务器的request事件处理函数中,想访问与服务器相关的数据或属性。
解决中文乱码问题
当调用res.end()方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式:
根据不同的url响应不同的html内容
核心实现步骤
1.获取请求的url地址
2.设置默认的响应内容为404Not found
3.判断用户请求的是否为/或/index.html首页
4.判断用户请求的是否为/about.html关于页面
5.设置Content-Type响应头,防止中文乱码
6.使用res.end()把内容响应给客户端
模块化的基本概念
什么是模块化
模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合,分解和更换的单元。
编程中的模块化
编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
把代码模块化拆分的好处:
1.提高了代码的复用性
2.提高了代码的可维护性
3.可以实现按需加载
模块化规范
模块化规范就是对代码进行模块化的拆分和组合时,需要遵守的那些规则
例如:
- 使用什么样的语法格式来引用模块
- 在模块中使用什么样的语法格式向外暴露成员
模块化规范的好处:大家都遵循同样的模块化规范写代码,降低了沟通成本,极大的方便了各个模块之间的互相调用,利人利己。
Node.js中的模块化
Node.js中模块的分类
Node.js中根据模块来源的不同,将模块分为三大类,分别是:
- 内置模块(内置模块是由Node.js官方提供的,例如fs,path,http)
- 自定义模块(用户创建的每个js文件,都是自定义模块)
- 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
加载模块
使用强大的require()方法,可以加载需要的内置模块,用户自定义模块,第三方模块进行使用。
注意:在使用require加载用户自定义模块期间,可以省略后缀名。
Node.js中的模块作用域
什么是模块作用域
和函数作用域类似,在自定义模块中定义的变量和方法,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
模块作用域的好处
防止了全局变量污染的问题
向外共享模块作用域中的成员
1.module对象
在每个.js自定义模块中有一个module对象,它里面存储了和当前模块有关的信息。
2.modele.exports对象
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。
外界使用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。
共享成员的注意点
使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准。
exports对象
由于module.exports单词写起来比较复杂。为了简化向外共享成员的代码,Node提供了exports对象。默认情况下,exports和module.exports指向同一个对象。最终共享的记过,还是以module.exports指向的对象为准。
Node.js中的模块化规范
Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何互相依赖。
CommonJS规定:
1.每个模块内部,module变量代表当前模块。
2.module变量是一个对象,它的exports属性是对外的接口。
3.加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块。
|