标题1 初识Node.js
- JavaScript可以在浏览器中被执行的原因是因为浏览器中的解析引擎(Chrome中的V8)
- 浏览器中的JavaScript运行环境:解析引擎和内置API(浏览器提供的特殊的接口)
- 概念:Node.js是一个基于chromeV8引擎的JavaScript的运行环境
- 浏览器是JavaScript的前端运行环境;Node.js是JavaScript的后端运行环境,node.js无法调用DOM和BOM等浏览器内置API
- 终端的一些命令:
tab键
快速补全文件路径、ESC键
快速清空当前已输入的命令,输入cls
可以清空终端,输入ls命令
获取文件目录
- 在Node.js环境中执行JavaScript文件的步骤:
- 打开终端
- 输入node 要执行的js文件的路径
- 在执行文件之前,要切换文件的路径到当前。在终端中切换文件路径:
cd 要去的文件路径
,如果切换不成功的话就输入所在盘的大写字母,比如切换到D盘,首先按照方法切换,如果没有成功就再输入D: - 打开终端就直接处于当前文件的方法:位置放在当前要运行的js文件,
按住shift加鼠标右键打开PowerShell
,打开终端即可,就直接定位到当前要执行的文件 - 所处文件的地址栏中输入cmd,打开终端
标题 2 Node.js内置API模块
- fs文件系统模块
使用前先导入:const fs=require('fs')
- fs中的方法:
- 1.1
fs.readFile()
,用来读取指定文件中的内容fs.readFile(path[,options],callback)
示例代码:readFileSync()同步的方式读取文件,不需要回调函数,直接就返回了读取的数据
path:读取文件的存放路径
options:参数格式
callback:执行后的回调函数
const fs=require('fs')
fs.readFile('/files/11.text','utf8',function(err,dataStr) {
consoloe.log(err)//读取成功,则err的值为null;读取失败,则err的值为错误对象
console.log(dataStr)//读取成功,dataStr打印成功的结果;读取失败,dataStr的值为undefined
})
err代表读取成功的结果
dataStr代表读取失败的结果
- 1.2
fs.writeFile()
方法,用来向指定的文件中写入的内容 :fs.writeFile(path,data,callback)
参数1:表示文件的存放路径
参数2:表示要写入的内容
参数3:回调函数
const fs=require('fs')
fs.writeFlie('文件存放路径','hello fs',function(err) {
console.log(err)//写入成功,err的值是null;写入失败,err的值是一个错误对象
如果文件不存在,则会先创建该文件再写入内容;如果文件存在则会覆盖原有的内容
//如果想向文件中追加内容就使用appendFile()方法
})
异步的创建目录:fs.mkdir()
删除文件:fs.unlink(path,callback)
- path路径模块
- 2.1 使用之前需要先导入path
const path=require('path')
path中的方法: path.join()
让多个路径片段拼接成一个完整的路径字符串
示例代码:
const path=require('path')
var p=path.join('/a','/b','../','/d')
console.log(p);//打印结果是\a\d
../
可以抵消它的上一层目录
path.basename()
可以获取路径文件中的最后一部分,通常用来获取路径中的文件名或者文件中的后缀名
var p=path.basename('./clock1/index.html','.html')
console.log(p);//打印结果是index,如果没有参数2,结果是index.html
//参数1:文件的存放路径 参数2:表示文件的扩展名 返回值:返回的是路径中的最后一部分
path.extname()
获取路径中的文件扩展名
参数1:文件路径的字符串
返回值:文件的后缀名
var p=path.extname('/clock/index.html')
console.log(p);//打印结果是.html
- http模块
- 3.1 概念:用来创建web服务器的模块,通过http模块提供的createSerer()方法可以创建一个web服务器
使用的步骤: - 导入 const http=require(‘http’)
- 创建web服务器实例 const server=http.createServer()
- 为服务器实例绑定request事件
server.on('request',function(req,res) {
//req:请求对象,包含与客户端相关的属性和方法
req.url:得到客户端请求的url地址,如果是根域名,返回的就是“/”
req.method:得到客户端请求的方式
//res:响应对象,包含与服务器相关的属性和方法
res.end()向客户端响应指定的内容,并结束这次请求的处理过程
res.statusCode 可以修改状态码
})
res.setHeader('Content-Type','text/html;charset=utf-8')
防止中文乱码的情况,必须设置响应头
- 启动服务器
server.listen(80,() => {
console.log('http server running at http://127.0.0.1')
//80,是端口号,可以修改,如果是80端口,在浏览器输入地址的时候可以不用写端口号,如果不是80端口,在发起请求的时候必须写上端口号
})
- 根据不同的url响应不同的html内容
标题3 模块化
- 模块化的分类:内置模块、自定义模块、第三方模块(包)
- 加载模块:
require()方法
- 加载内置模块:
const fs=require('fs')
直接导入内置模块即可 - 加载自定义模块啊:
const custom=require('自定义模块的路径')
自定义模块就是一个js文件,在 导入的时候可以省略后缀名 - 加载第三方模块,需要下载包
- 模块作用域:自定义模块中定义的变量,只能在模块内部使用,不能在导入模块的区域使用,如果想在外部使用自定义模块的变量,需要利用
module.exports对象
或者exports属性
module.exports对象
:在自定义模块中都存在这样一个对象,存储和当前模块相关的信息,比如exports属性,在外界使用require方法导入自定义模块的时候,得到的成员就是那个模块中通过module.export指向的那个对象。默认情况下这个对象的值是空- 自定义模块向外共享一个成员:在自定义模块的内部使用module.exports对象或者exports属性,示例代码:
module.exports.uname='zs';//这个uname属性就可以在外部使用
exports.uname='zs'
module.exports={
uname:'zs',
age:18,
sayhi:function() {}
}
//最后在导入使用模块的时候,结果是{uname:'zs',age:18,sayhi: [Function: sayhi]}
exports对象和module.exports对象作用一样,都可以向外共享一个成员,默认情况下这个对象是空值
注意:使用require()方法导入模块时,导入的结果永远以module.exports指向的对象为准,所以一般情况下我们都使用module.exports来向外共享成员
标题 4 第三方模块(又称为包)
- 网址https://www.npmjs.com
- 下载包的方法,在项目终端中输入以下命令
npm install 包的名称
或者
npm i 包的名称
安装指定版本的包:npm i 包的名称@版本号
版本号的代表意义:2.24.0
- 第一位数字代表:大版本
- 第二位数字代表:功能版本
- 第三位数字代表:BUG修复版本
版本书写规则:只要前面的版本号增长了,后面的版本号就要归零
- 使用包的步骤:
- 导入需要的包
- 查看官方的使用方法,进入官网,搜索需要的包,点击Documentation
- 初次安装包的时候,会在项目目录下多两个文档,它们分别是
node_module文件夹
和package-lock.json
文件
- node_module文件夹:这个文件夹存放的都是这个项目中安装的所有包,由于体积过大,一般在实际项目开发中,都存放在.gitgnore忽略文件中
- package-lock.json:这个文件中记录的是每一个包的下载信息,比如包的名称、版本号、地址等
- 包管理配置文件
作用:主要是用来存放项目主要用到的包信息,这个文件不是自己建的,是在终端输入命令创建的
- 项目根目录下必须提供一个package.json文件,创建的命令:
npm init -y
,文件中的 - 核心依赖包dependencies对象就是项目的,创建命令是
npm i 包的名称
- 开发依赖包devDependencies对象:包只在项目开发的时候用到,项目上线之后就不用了,创建的命令是
npm i 包的名称 -D
或者npm install 包名 --save-dev
创建的就是开发依赖包
- 下载包的时候,因为网站是国外的,所以就比较慢,这时候就可以通过切换镜像源来提高下载速度或者是安装全局的nrm即可,或者是安装nrm安装命令:
npm i nrm -g
查看安装成功:nrm ls
- 查看当前的下包镜像源
npm config get registry
- 将下包的镜像源切换到淘宝镜像源
npm config set registry='https://registry.npm.taobao.org/'
- 检查镜像源是否下载成功
npm config get registry
- 在发布我们自己包的时候,需要切换镜像源:
nrm use 镜像源名称(npm或者taobao)
- 全局包安装,只需要在安装包的时候在后面加一个
-g
- 规范包的结构:
- 存放包必须是一个单独的文件夹
- 包里面必须包含package.json这个文件
- 在package.json文件中,必须存在三个属性name、version、main,分别代表包的名称、包的版本号、包的入口函数
- 发布自己的包的步骤:
- 新建一个文件夹,当作自己的根目录
- 在根目录中,分别创建package.json包配置文件、index.js入口函数、、README.md包说明文档
- 在终端上输入
nrm ls
命令,查看镜像源,需要利用nrm use npm
命令切换到npm,之后输入npm login
登录自己的npm账号,接下来是发布自己的包,利用npm publish
即可发布
注:删除发布的包npm unpublish 包的名称 --force
只能删除72小时以内发布的包,删除的包,在24小时内不允许重复发布
- 模块的加载机制
- 内置模块的优先级最高
- 在使用require()加载自定义模块的时候,必须以
./
或../
作为路径标识符,否则就会把自定义模块当作内置模块或者第三方模块来加载 - 第三方模块的加载机制:在查找第三方模块的时候,如果没有找到第三方模块,那么就会向它的上一层父目录寻找,寻找的原则就是一直向上一层父目录查找
- 目录作为模块,先找package.json文件,如果找不到就-----试图加载目录下的index.js文件-----
标题 5 第三方模块(express模块)
- 概念:类似于node.js里面的htt内置模块的作用,用于创建web服务器的
本质:就是npm上的一个第三方包,提供快速创建web服务器的便捷方法 - 创建基本的服务器步骤:
//1.导入express
const express=require('express')
//2.创建web服务器
const app=express()
//3.启动web服务器
app.listen(80,() => {
consloe.log('express server running at http://127.0.0.1')
})
- 监听并响应客户端请求
- 监听客户端的请求
//1.监听客户端的GET请求
app.get('请求的url地址',function(req,res) {处理函数})
//2.监听客户端的post请求
app.post('请求的URL',function(req,res) {
//处理函数
})
- 响应客户端的请求
res.send();//响应的内容可以是JSON对象,也可以是文本字符串,和http内置模块响应方式res.end()不同的在于后者只能是字符串
- 获取客户端参数
- 获取URL中携带的查询参数,客户端使用?uname=zs&age=18这种查询字符串的形式发送到服务器的参数
req.query
app.get('/',(req,res) => {
//默认情况下req.query是一个空对象,如果要访问具体的参数,可以使用
req.query.uname req.query.age
})
- 获取URL中的动态参数,也就是URL地址中
:
后面的参数 ,通过req.params对象
就可以获取
- 托管静态资源
express.static()
概念:通俗点说就是创建一个静态的资源服务器,通过它的托管它的父目录就可以访问到里面的所有文件,通过如下代码就可以访问到public里面的html、css、js等文件
app.use(express.static('public'))
注:express在指定的静态目录下查找文件并对外提供资源的访问路径,因此存放静态文件的目录名不会出现在URL地址中
- 挂载路径前缀:通过以下方式就可以访问有前缀的路径地址
app.use('/public',express.statics())
//可以访问http://localhost/public/css/style.css这样的url