Node.js
1.JavaScript组成:核心js语法和WebAPI
2.浏览器中的JavaScript运行环境:
(1)运行环境:代码正常运行所需的环境
3.Node.js:JavaScript的运行环境
1. 浏览器是JavaScript的前端运行环境
2.Node.js是JavaScript的后端运行环境
3.Node.js无法调用DOM和BOM等浏览器内置的API
3.Node.js的环境安装:打开官网,下载所需的版本,双击安装即可
(1)LTS版本:长期稳定版,
(2)Current:尝新版本
4.查看已安装的Node.js的版本号: node -v
5. 终端:用于人机交互的一种方式
6.在Node.js中执行javascript的代码:定位到要打开文件的目录页,然后按住Shift键,点击鼠标的右键,并选择在此处打开PowerShell即可 在终端窗口中输入node 文件名称 即可打开js文件
7.终端快捷键
- 上箭头:方向键中的上箭头:快速定位到上一次执行的命令
- 使用tab键,能够快速补全路径【只需要写出第一个字母】
- esc键能够快速清空当前已输入的命令
- 输入cls可以清空中断中的内容
fs文件系统模块
1.fs模块:用来操作文件的模块,提供了一系列的方法和属性,用来满足用户对问价操作的需求使用时一定要先导入模块
语法格式:const fs=require('fs')
2.fs中读取文件中的内容:fs.readFile()
语法格式:fs.readFile(path[options],callback)
path:字符串,必选,表示文件的路径
options:可选参数,表示以什么编码格式来读取文件
callback:必选函数 文件读取完成后,通过回调函数拿到读取的结果
实例:
// 引入fs模块
const fs=require('fs')
fs.readFile('./files/春.txt','utf8',function(err,datastr){
console.log(err);
console.log('-----------------------');
console.log(datastr);
})
如果读取文件失败==则err的值为 错误对象 datastr的值为undefined
文件读取成功 err的值为null
2.判断文件的值是否读取成功
// 引入fs模块
const fs=require('fs')
fs.readFile('./files/春.txt','utf8',function(err,datastr){
if(err){
return console.log('读取文件失败'+err);
}
else{
return console.log('读取文章成功'+datastr);
}
3.向指定的文件中写入内容
语法格式:fs.writeFile(file,data[,options],callback)
参数:file: 必须按参数 文件的存放路径
data:必须按参数 表示要写入的文件
options:可选参数 表示以什么样的格式写入文件
callback:必选参数 文件写入以后的回调函数
【文件写入成功是err的值为null】
const fs=require('fs')
fs.writeFile('./files/02火烧云.txt','火烧云',function(err){
if(err){
console.log('文件写入失败'+err);
}
else{
console.log('文件写入成功');
}
})
路径拼接问题:
解决相对路径的问题:完整路径【移植性差】
__dirname:表示当前文件所处的目录
path路径模块:用来处理路径的模块
1. 路径拼接:path.join()语法格式
语法规范 :path.join([…paths])
paths:字符串类型表示路径片段的序列
返回值:返回值是拼接好的string类型
const path=require('path')
var path1=path.join('/a','/b','//c')
console.log(path1);
var path2=path.join(__dirname+'/files/整理成绩ok.txt')
console.log(path2);
2.获取路径中的文件名:
path.basename():获取路径中的最后一部分,通常通过这个方法获取路径中的文件名
语法格式:path.basename(path,[ext])
path:字符串 必选参数,表示一个路径的字符串
ext:可选参数,表示文件的扩展名
const path=require('path')
var path1=path.join('/a','/b','//c','index.html')
var base1=path.basename(path1)
console.log(base1);
参数ext是除去文件的扩展名
3.获取文件中的文件扩展名
path.extname(path)
path:表示路径的字符串
返回值为字符串类型,是得到的扩展名字符串
将HTML文件中得代码提取出来变成css文件,script文件等
- 创建两个正则表达式,分别用来匹配
// 引入模块
const fs=require('fs')
const path=require('path')
// 创建正则表达式
const regStyle=/<style>[\s\S]*<\/style>/
const regScript=/<script>[\s\S]*<\/script>/
// 读取index.html文件
fs.readFile(path.join(__dirname,'./时钟案例/index.html'),'utf8',function(err,datastr){
if(err){
console.log('文件读取失败');
}
else{
console.log('文件读取成功');
// resolveStyle(datastr)
// resolveScript(datastr)
resolveHtml(datastr)
}
})
// 定义方法抽取文件
function resolveScript(scriptstr){
// 匹配正则表达式
var reg=regScript.exec(scriptstr)
// 将匹配好的内容中的标签替换成空格
var newScript=reg[0].replace('<script>','').replace('</script>','')
console.log(newScript);
// 将提取出来的内容写入到所对应的文件中去
fs.writeFile(path.join(__dirname,'./时钟案例/index.js'),newScript,function(err){
if(err){
console.log('文件写入失败');
}
else{
console.log('文件写入成功');
}
})
}
function resolveStyle(stylestr){
var reg=regStyle.exec(stylestr)
var newStyle=reg[0].replace('<style>','').replace('</style>','')
console.log(newStyle);
fs.writeFile(path.join(__dirname,'./时钟案例/index.css'),newStyle,function(err){
if(err){
console.log('文件写入失败');
}
else{
console.log('文件写入成功');
}
})
}
function resolveHtml(htmlstr){
// 将上面的正则表达式替换为引入连接的文件
const newHtml=htmlstr.replace(regScript,'<script src="./index.js"></script>')
.replace(regStyle,'<link rel="stylesheet" href="./index.css">')
fs.writeFile(path.join(__dirname,'./时钟案例/index.html'),newHtml,function(err){
if(err){
console.log('文件写入失败');
}
else{
console.log('文件写入成功');
}
})
}
http模块
1.http模块是Node.js官网提供的,用来创建web服务器的模块
2.IP地址:每台计算机的唯一地址
格式:“点分十进制”【a.b.c.d】其中a b c d都是0~255之间的十进制数
可以在windows的终端中运行ping www.baidu.com 就可以查看到百度服务器的IP地址
3.域名 域名服务器:IP地址和域名是一一对应的问题,这种对应关系存放在域名服务器中【域名服务器就是提供IP地址和域名之间转换服务的服务器】
4.端口号:每个端口号不能同时被多个Web服务器占用;在实际应用中,URL中的80端口号可以被省略
创建最基本的web服务器
1.步骤
- 导入http模块
- 创建web服务器实例、【http.createSever()】
- 为服务器实例绑定request事件,金婷客户端的请求
- 启动服务器.listen(端口号,回调函数)
// 导入http模块
const http=require('http')
// 创建服务器实例
var server=http.createServer()
// 给服务器绑定requet事件
server.on('request',function(req,res){
console.log('someone vist ');
})
// 启动服务器
server.listen(8080,function(){
console.log('server is running');
})
2.req请求对象:只要服务器接收到了客户端的请求,就会调研server.on()为服务器绑定的request事件处理函数。【包含了客户端相关的数据和属性】
- req.url():客户端请求的URL地址
- req.method():客户端请求的method类型
const http=require('http')
var server=http.createServer()
server.on('request',function(req){
const url=req.url
const method=req.method
const str='your request url is ${url}, and method is ${method}'
console.log(str);
})
server.listen(80,function(){
console.log('服务器已经启动');
})
```**3.res的响应对象**:访问与服务器相关的数据或者属性
可以调用res.end()方法,向客户端响应一些内容
```javascript
const http=require('http')
const server=http.createServer()
server.on('request',function(req,res){
const url=req.url
const method=req.method
const str='Your request url is'+url+' and your request method is '+method
console.log(str);
res.end(str)
})
server.listen(8080,function(){
console.log('服务器已经启动');
})
3.解决中文乱码:使用res.end()方法向客户端发送中文内容时,有可能出现乱码现象。此时,需要手动设置内容的编码格式
解决方法:设置响应头 Content-Type的值为text/html charset=utf-8【调用res,setHeader】
res.setHeader('Content-Type', 'text/html; charset=utf-8')
4.根据不同的URL响应不同的HTMl内容
步骤:
- 获取请求的URL地址
- 设置默认的响应内容为404 Not Found
- 判断用户的请求是否为/ 或 /index.html首页
- 判断用户请求是否为/about.html关于页面
- 设置请求头,防止中文乱码
- 使用res.end将内容响应给客户端
const http=require('http')
const server=http.createServer()
server.on('request',function(req,res){
const url=req.url
const method=req.method
let content='<h1>404 Not Found</h1>'
// const str='您的请求地址是'+url+' 您的请求方式是 '+method;
// res.setHeader('Content-Type', 'text/html; charset=utf-8')
// console.log(str);
// res.end(str)
if(url==='/'||url==='/index.html'){
// 用户请求的是首页应该将内容更改为首页的内容
content='<h1>首页页面</h1>'
}
else if(url==='/about.html'){
content='<h1>关于页面</h1>'
}
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(content)
})
server.listen(8080,function(){
console.log('服务器已经启动');
})
模块化
定义:解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程。【模块解释可组合,可分解和可更换的单元】
1.好处
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
2.Node.js模块的三大分类
- 内置模块(由Node.js提供。例如 fs path http等)
- 自定义模块:用户创建的每个js文件
- 第三方模块:有第三方卡发出来的模块 使用前需要下载
模块的加载:使用require()方法,客家仔需要的内置模块,用户自定义模块和第三方模块
使用require加载其他模块式,同样会加载引入模块中的代码
注意:在使用require方法加载用户自定义模块时,可以省略.js的后缀名
测试代码:
const m1=require('./14自定义模块')
console.log(m1);
Node.js的模块作用域:
1.模块作用域:在自定义模块中定义的变量,方法等成员,只能在当前模块被访问
测试代码
m2.js文件
const username='张三'
function sayhi(){
console.log('我是m2中的的方法');
}
m1.js
const m1=require('./2m2')
console.log(m1);
mi访问不m2中的属性和方法,只能输出一个空对象
模块作用域的好处:防止全局变量污染
向外共享模块作用域中的成员
1.module对象:存储了与当前模块有关的信息
- module.exports对象:将木块内的成员共享出去,供外界使用【我们使用require方法导入时,导入的就是module.exports指向的对象】
在一个自定义模块中,默认情况下,module.exports={}
我们想向外界共享的username为张三的属性
module.exports.username='张三'
module.exports.sayhi=function(){
console.log('你好');
}
注意点:
(1)使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准
2.CommonJS;
1.Nod.js遵循了CommonJS模块化,CommonJS规定了模块的特性和各模块之间如何相互依赖
2.CommonJS规定:
(1)每个模块内部,module变量代表当前的模块
(2)module变量是一个对象,它的exports属性(module.exports)是对外的接口【向外共享成员】
(3)加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块
3.npm管理包
4.规范的包结构
5.模块的加载机制