24暑假
ajax
1.AJAX概念和axios
什么是AJAX?
使用浏览器的 XMLHttpRequest 对象 与服务器通信
axios用法
1 引入axios.js文件
2 具体用法
url:资源定位符
params:请求参数
method:请求方法
data:请求体
1 | axios({ |
2.URL和URL参数查询
URL概念和组成
什么是 URL ?
- 统一资源定位符,简称网址,用于定位网络中的资源(资源指的是:网页,图片,数据,视频,音频等等)
URL的组成?
- 协议,域名,资源路径
URL参数查询
参数查询语法?
- 在 url 网址后面用?拼接格式:http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2
- 参数名一般是后端规定的,值前端看情况传递即可
URL参数查询类似axios用请求方法get 请求参数params
URL中的端口号
端口号的作用:标记服务器里对应的服务程序值为(0-65535 之间的任意整数)
http 协议,默认访问的是 80 端口
常用端口如 数据库3306 ssh22
注意:0-1023 和一些特定的端口号被占用,我们自己编写服务程序请避开使用
3.请求报文与响应报文
请求报文
请求报文:是浏览器按照协议规定发送给服务器的内容,例如刚刚注册用户时,发起的请求报文:
这里的格式包含:
- 请求行:请求方法,URL,协议
- 请求头:以键值对的格式携带的附加信息,比如:Content-Type(指定了本次传递的内容类型)
- 空行:分割请求头,空行之后的是发送给服务器的资源
- 请求体:发送的资源
响应报文
响应报文的组成:
- 响应行(状态行):协议,HTTP响应状态码,状态信息
- 响应头:以键值对的格式携带的附加信息,比如:Content-Type(告诉浏览器,本次返回的内容类型)
- 空行:分割响应头,控制之后的是服务器返回的资源
- 响应体:返回的资源
HTTP 响应状态码
1xx 信息响应
- 100 Continue: 服务器已接收到请求头部,客户端应继续发送请求主体(例如,在发送一个较大的请求主体之前)。
- 101 Switching Protocols: 服务器同意客户端请求更改协议(例如,从 HTTP 升级到 WebSocket)。
2xx 成功响应
- 200 OK: 请求成功。响应的内容随请求方法的不同而不同。
- 201 Created: 请求已成功并且在服务器上创建了新的资源。
- 202 Accepted: 服务器已接受请求,但尚未处理完成。
- 204 No Content: 服务器成功处理了请求,但没有返回任何内容。
3xx 重定向
- 301 Moved Permanently: 请求的资源已永久移动到新的 URL。客户端应使用新的 URL 进行请求。
- 302 Found: 请求的资源临时移动到新的 URL。客户端应使用原始的 URL 进行后续请求。
- 304 Not Modified: 请求的资源未修改。客户端可以使用缓存的版本。
4xx 客户端错误
- 400 Bad Request: 服务器无法理解请求,通常是因为请求语法错误。
- 401 Unauthorized: 请求需要用户认证。
- 403 Forbidden: 服务器理解请求,但拒绝执行。
- 404 Not Found: 服务器找不到请求的资源。
- 405 Method Not Allowed: 请求方法不被允许。
- 408 Request Timeout: 服务器等待客户端发送请求时间过长。
5xx 服务器错误
- 500 Internal Server Error: 服务器遇到未预期的情况,无法完成请求。
- 501 Not Implemented: 服务器不支持请求的方法。
- 502 Bad Gateway: 服务器作为网关或代理,从上游服务器接收到无效响应。
- 503 Service Unavailable: 服务器暂时无法处理请求,通常是因为服务器过载或维护。
- 504 Gateway Timeout: 服务器作为网关或代理,未能及时从上游服务器接收到响应。
4.Json字符串与js对象
json字符串的展开运算符…
1 | const jsonString = '{"name": "John", "age": 30, "city": "New York"}'; |
JSON.stringify(obj)
接受一个 JavaScript 对象或数组,并返回一个 JSON 字符串。
JSON.parse(jsonString)
接受一个 JSON 字符串,并返回一个 JavaScript 对象或数组。
Object.keys(obj)
是 JavaScript 中的一个内置方法,用于返回一个给定对象的可枚举属性名(即键)的数组。
获得对象obj某个键key的值 obj[key]
5.Ajax原理
ajax原理
ajax原理即xhr
XMLHttpRequest的使用四个步骤
1 | /** |
xmlhttprequest参数查询
简单参数查询即第二步里,url写成url?参数1=值1&参数2=值2这种格式
URLSearchParams API
URLSearchParams API 可以将js对象转成参数查询对象
示例代码
1 | const qObj = { |
请求参数 body参数 &设置请求头API setRequestHeader
对请求参数要求格式是JSON时 使用API setRequestHeader设置请求头
示例代码
1 | xhr.setRequestHeader('content-type','application/json'); |
传递请求参数
示例代码
1 | const userObj = { |
6.promise
promise概念
Promise 对象用于表示一个异步操作的最终完成(或失败)及其结构值
promise使用步骤
1 | // 1. 创建 Promise 对象 |
Promise 有哪三种状态?
每个 Promise 对象必定处于以下三种状态之一(fulfilled和rejected后不可改变)
- 待定(pending):初始状态,既没有被兑现,也没有被拒绝
- 已兑现(fulfilled):操作成功完成
- 已拒绝(rejected):操作失败
错误对象打印
console.dir(error)
7.封装简易axios
示例代码
1 | function myAxios(config) { |
8.同步 异步
同步代码 异步代码
JS 中有哪些异步代码?
setTimeout / setInterval,事件,AJAX
回调地狱
在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱
Promise链式调用
示例代码
1 | doSomething() |
async函数和await
使用方法:在async函数内,使用async函数内,使用await关键字取代then函数,等待获取promise对象成功状态的结果值
示例代码
1 | // 1. 定义async修饰函数 |
捕获错误 try…catch
try 和 catch 的作用:语句标记要尝试的语句块,并指定一个出现异常时抛出的响应
1 | try { |
遇到错误直接跳出,不再往下执行
示例代码
1 | /** |
事件循环(EventLoop)
事件循环:执行代码和收集异步任务的模型,在调用栈空闲时,反复调用任务队列里回调函数执行机制
js单线程 浏览器多线程
步骤:
- js执行同步代码,遇到异步代码交给宿主浏览器环境执行
- 浏览器异步有结果后,会把回调函数放入任务队列排队
- 当调用栈空闲后,反复调用任务队列里的回调函数
宏任务与微任务
异步任务分为宏任务和微任务
宏任务:由浏览器环境执行的异步代码
微任务:由JS引擎环境执行的异步代码
宏任务与微任务的具体划分
执行顺序:同步代码->微任务->宏任务
Promise.all 静态方法
概念:合并多个 Promise 对象,等待所有同时成功完成(或某一个失败),做后续逻辑
语法
1 | const p = Promise.all([Promise对象, Promise对象, ...]) |
9.一些第三方库
serialize.js收集表单数据
引入form-serialize.js
获取表单元素(表单元素要有name属性作为收集数据中的属性名)
示例代码
const form = document.querySelector('.art-form');
配置对象
- hash:
- true - 收集出来的是一个 JS 对象结构
- false - 收集出来的是一个查询字符串格式
- empty:
- true - 收集空值
- false - 不收集空值
- hash:
示例代码:const data = serialize(form, { hash: true, empty: true})
富文本编辑器-wangEditor插件
1.引入wangEditor的css样式
2.html部分
1 | <div> |
3.js部分
1 | // 富文本编辑器 |
10.axios
axios配置基地址
1 | axios.defaults.baseURL = 'http://geek.itheima.net' |
配置后axios请求时都会baseURL + url
token 访问权限令牌
概念:访问权限的令牌,本质上是一串字符串
创建:正确登录后,由后端签发并返回
作用:判断是否有登录状态等,控制访问权限
注意:前端只能判断 token 有无,而后端才能判断 token 的有效性
axios传递请求头参数
参数headers
1 | axios({ |
axios请求拦截器
请求拦截器是发起请求到服务器前被调用的一个函数,对请求参数进行设置。
有公共配置和设置时,统一设置在请求拦截器中
示例代码
1 | axios.interceptors.request.use(function (config) { |
axios响应拦截器
axios 响应拦截器:响应回到 then/catch 之前,触发的拦截函数,对响应结果统一处理
示例代码
1 | axios.interceptors.response.use(function (response) { |
11.正则表达式
正则表达式(Regular Expression, 简称regex或regexp)是一种强大的字符串匹配和处理工具,用于搜索,匹配和操作字符串。正则表达式使用特定的语法规则来描述和匹配字符串模式。
基本概念
- 字面字符:普通字符在正则表达式中代表它们自己的值,如
a
匹配字母a
。 - 元字符:具有特殊意义的字符,用于指定复杂的匹配规则,如
.
、*
、?
、+
、[]
等。
常用符号
.
(点号):匹配除换行符以外的任意单个字符。- 示例:
a.b
可以匹配aab
、a1b
等。
- 示例:
*
(星号):匹配前面的元素零次或多次。- 示例:
a*b
可以匹配b
、ab
、aab
等。
- 示例:
+
(加号):匹配前面的元素一次或多次。- 示例:
a+b
可以匹配ab
、aab
、aaab
等,但不匹配b
。
- 示例:
?
(问号):匹配前面的元素零次或一次。- 示例:
a?b
可以匹配b
、ab
。
- 示例:
[]
(方括号):匹配方括号内的任意一个字符。- 示例:
[abc]
可以匹配a
、b
、c
中的任何一个。
- 示例:
[^]
(脱字符在方括号内):匹配不在方括号内的任意一个字符。- 示例:
[^abc]
可以匹配除a
、b
、c
之外的任何一个字符。
- 示例:
|
(竖线):表示逻辑或,用于匹配多个选项中的一个。- 示例:
a|b
可以匹配a
或b
。
- 示例:
()
(小括号):用于分组,分组可以作为一个整体使用量词,也可以提取匹配的子字符串。- 示例:
(abc)+
可以匹配abc
、abcabc
等。
- 示例:
\
(反斜杠):用于转义元字符,使其作为字面字符使用。- 示例:
\.
可以匹配.
字符。
- 示例:
预定义字符类
- **
\d
**:匹配任意一个数字,相当于[0-9]
。- 示例:
\d
可以匹配0
、1
、2
等。
- 示例:
- **
\D
**:匹配任意一个非数字字符,相当于[^0-9]
。- 示例:
\D
可以匹配a
、b
、@
等。
- 示例:
- **
\w
**:匹配任意一个字母、数字或下划线,相当于[a-zA-Z0-9_]
。- 示例:
\w
可以匹配a
、1
、_
等。
- 示例:
- **
\W
**:匹配任意一个非字母、非数字、非下划线的字符,相当于[^a-zA-Z0-9_]
。- 示例:
\W
可以匹配@
、#
、
- 示例:
- **
\s
**:匹配任意一个空白字符(包括空格、制表符、换页符等)。- 示例:
\s
可以匹配空格、\t
等。
- 示例:
- **
\S
**:匹配任意一个非空白字符。- 示例:
\S
可以匹配a
、1
、@
等。
- 示例:
常用示例
匹配邮箱地址:
1
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
匹配电话号码(假设为10位数字):
1
\d{10}
匹配日期(格式为YYYY-MM-DD):
1
\d{4}-\d{2}-\d{2}
匹配URL:
1
https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[\w.-]*)*
12.Node.js
了解Nodejs
nodejs的作用?
1.编写后端程序,提供数据和网页资源
- 作为前端工程化的工具,翻译压缩整合代码等,提高开发效率
Node.js 与浏览器环境的 JS 最大区别?
Node.js 环境中没有 BOM 和 DOM,但是也用 JS 语法
fs模块-文件系统交互
fs模块用于与文件系统 交互
使用步骤
1.加载模块对象,得到fs对象
1 | const fs = require('fs') |
2.写入文件内容
1 | fs.writeFile('文件路径', '写入内容', (err) => { |
3.读取文件内容
1 | fs.readFile('文件路径', (err, data) => { |
path模块-路径处理
nodejs的相对路径是?
nodejs的相对路径是终端所在文件夹的相对路径,而不是js文件本身所在文件夹的路径
所以用path模块,获得绝对路径解决
使用步骤
1.加载path模块
1 | const path = require('path') |
2.获取该js文件所在文件夹的绝对路径并拼接
1 | const pathStr = path.join(__dirname,'...','...') |
http模块-创建web服务
示例代码
1 | /** |
express模块-创建web服务
1 | const express = require('express'); |
nodejs模块化
什么是模块化?
每个文件都是独立的模块
commonjs 导入导出语法
导出
1 | module.exports = { |
导入
1 | const 变量名 = require('模块名或路径') |
nodejs默认支持commonJS标准
ECMAScript标准的导入导出
ECMAScript标准 默认导入导出语法
使用该标准前 先设置package.json 并设置 {“type”: module}
导出语法
1 | export default : { |
导入语法
1 | import 变量名 from '模块名或路径' |
ECMAScript标准 命名导入导出语法
导出语法
1 | // export 修饰定义语句 |
导入语法
1 | import {同名变量} from '模块名或路径' |
与默认导出如何选择:
- 按需加载,使用命名导出和导入
- 全部加载,使用默认导出和导入
包的概念
包:将模块,代码,其他资料整合成的一个文件夹
包分类:
项目包:主要用于编写项目和业务逻辑
软件包:封装工具和方法进行使用
注意事项:
- 需要有package.json记录软件包名字,作者,入口文件
- 默认引入的是包文件节下的 index.js 模块文件里导出的对象,如果没有 index.js 文件,则会引入 package.json 里 main 属性指定的文件模块导出的对象
入口文件应该集中工具模块的方法,再统一向外暴露
npm
初始化清单文件package.json命令
npm init -y
下载软件包命令 生产环境所需依赖
npm i 包名称
下载软件包命令 开发环境所需依赖
npm i 包命称 --save-dev
全局下载软件包命令
npm i 报名称 -g
npm安装所有依赖命令
npm i
使用情景:拿到它人项目后,没有包,根据package.json下载
pnpm
更快,更节省空间
安装pnpm
npm i -g pnpm
创建vue项目
pnpm create vue
安装所有依赖
pnpm install
安装软件包
pnpm add 包名
安装开发依赖
pnpm add 包名 -D
卸载某个包
pnpm remove 包名
13.Webpack
webpack概念和使用步骤
webpack是一个静态模块打包工具
静态模块:编写代码过程中的,html,css, js,图片等固定内容的文件
webpack打包步骤
1.先在项目文件夹下,初始化包环境,得到package.json文件
npm init -y
2.下载webpack webpack-cli到项目 (版本独立)
npm i webpack webpack --save-dev
–save-dev的意思是开发依赖
3.package.json中将webpack配置到自定义命令
1 | { |
4.运行命令
npm run build
weback修改入口和出口
修改入口和出口以改变打包设置
步骤:
在项目根目录,新建webpack.config.js文件
设置导出配置对象filename,配置入口entry,出口文件路径path
1
2
3
4
5
6
7
8
9
10const path = require('path')
module.exports = {
entry: path.resolve(__dirname, 'src/login/index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: './login/index.js',
clean: 'true' // 清空输出目录
}
}npm run build
webpack生成html
webpack默认只能打包js文件,打包html需用webpack插件 html-webpack-plugin
步骤:
下载 html-webpack-plugin 本地软件包到项目中
1
npm i html-webpack-plugin --save-dev
配置 webpack.config.js 让 Webpack 拥有插件功能
1
2
3
4
5
6
7
8
9
10
11
12// ...
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin({
template: './public/login.html', // 模板文件
filename: './login/index.html' // 输出文件
})
]
}指定以 public/login.html 为模板复制到 dist/login/index.html,并自动引入其他打包后资源
webpack打包css到js
最后结果是 css在js里
用到了webpack加载器 识别更多模块内容
- 加载器 css-loader:解析 css 代码
- 加载器 style-loader:把解析后的 css 代码插入到 DOM(style 标签之间)
步骤:
准备 css 文件引入到 src/login/index.js 中(压缩转译处理等)
1
2
3// 准备 css 代码,并引入到 js 中
import 'bootstrap/dist/css/bootstrap.min.css'
import './index.css'注意:这里只是引入代码内容让 Webpack 处理,不需定义变量接收在 JS 代码中继续使用,所以没有定义变量接收
下载 css-loader 和 style-loader 本地软件包
1
npm i css-loader style-loader --save-dev
配置 webpack.config.js 让 Webpack 拥有该加载器功能
1
2
3
4
5
6
7
8
9
10
11
12
13// ...
module.exports = {
// ...
module: { // 加载器
rules: [ // 规则列表
{
test: /\.css$/i, // 匹配 .css 结尾的文件
use: ['style-loader', 'css-loader'], // 使用从后到前的加载器来解析 css 代码和插入到 DOM
}
]
}
};打包后运行 dist/login/index.html 观察效果,看看准备好的样式是否作用在网页上
webpack提取css代码为独立文件
用到插件 mini-css-extract-plugin
步骤:
下载 mini-css-extract-plugin 插件软件包到本地项目中
1
npm i --save-dev mini-css-extract-plugin
配置 webpack.config.js 让 Webpack 拥有该插件功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// ...
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
module.exports = {
// ...
module: {
rules: [
{
test: /\.css$/i,
// use: ['style-loader', 'css-loader']
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
plugins: [
// ...
new MiniCssExtractPlugin()
]
};打包后观察效果
注意:不能和 style-loader 一起使用
好处:css 文件可以被浏览器缓存,减少 JS 文件体积,让浏览器并行下载 css 和 js 文件
webpack打包less代码
让webpack能够打包less代码
步骤
建立less文件,将less样式引入到src/login/index.js
import './index.less'
下载less和less-loader 本地软件包
npm i less less-loader --save-dev
配置webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14// ...
module.exports = {
// ...
module: {
rules: [
// ...
{
test: /\.less$/i,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"]
}
]
}
}
webpack打包图片
webpack有内置资源模块的打包
步骤
1.配置 webpack.config.js 让 Webpack 拥有打包图片功能
占位符 【hash】对模块内容做算法计算,得到映射的数字字母组合的字符串
占位符 【ext】使用当前模块原本的占位符,例如:.png / .jpg 等字符串
占位符 【query】保留引入文件时代码中查询参数(只有 URL 下生效)
2.注意:判断临界值默认为 8KB
大于 8KB 文件:发送一个单独的文件并导出 URL 地址
小于 8KB 文件:导出一个 data URI(base64字符串)
webpack搭建开发环境
webpack-dev-server可以让每次改动代码时,自动检测变化热更新到网页
步骤
下载webpack-dev-server软件包
配置自定义命令,设置打包模式为开发模式
1
2
3
4
5
6// ...
module.exports = {
// ...
mode: 'development'
}1
2
3
4"scripts": {
// ...
"dev": "webpack serve --mode=development"
},
注:默认public文件夹为服务器根目录 也会把webpack.config.js里设置的output放到内存
放到内存里的output结果和output目录里的并不一样
可以在public里设置 跳转到 output目录即可
–open每次代码刷新自动打开网页
webpack的打包模式
打包模式的分类
模式名称 | 模式名字 | 特点 | 场景 |
---|---|---|---|
开发模式 | development | 调试代码,实时加载,模块热替换等 | 本地开发 |
生产模式 | production | 压缩代码,资源优化,更轻量等 | 打包上线 |
如何设置打包模式?
方式1:在 webpack.config.js 配置文件设置 mode 选项
1 | // ... |
方式2:在 package.json 命令行设置 mode 参数
1 | "scripts": { |
注:命令行设置的优先级高于配置文件中的,推荐用命令行设置
webpack打包模式的应用
示例需求:在开发模式下用style-loader内嵌,在生产模式独立css代码
方案:
方案1:webpack.config.js 配置导出函数,但是局限性大(只接受 2 种模式)
方案2:借助 cross-env (跨平台通用)包命令,设置参数区分环境
方案3:配置不同的 webpack.config.js (适用多种模式差异性较大情况)
步骤:
1.下载cross-env软件包
npm i cross=env --save-dev
2.配置自定义命令,传入参数和值(会绑定到 process.env 对象下)
3.在 webpack.config.js 区分不同环境使用不同配置
1 | module: { |
前端注入环境变量
问题:
cross-env 设置的只在 Node.js 环境生效,前端代码无法访问 process.env.NODE_ENV
解决:
使用 Webpack 内置的 DefinePlugin 插件
使用方式
配置 webpack.config.js 中给前端注入环境变量
1 | // ... |
应用场景
前端项目中,开发模式下打印语句生效,生产模式下打印语句失效
webpack 开发环境调错 source map
解决问题:代码被压缩后,无法确认源代码的位置
注:只用于开发环境,不在生产环境使用
1 | module.exports = { |
设置解析路径别名 alias
例:
原来路径如下:
1 | import { checkPhone, checkCode } from '../src/utils/check.js' |
配置解析别名:在 webpack.config.js 中设置
1 | // ... |
这样我们以后,引入目标模块写的路径就更简单了
1 | import { checkPhone, checkCode } from '@/utils/check.js' |
优化cdn使用
[bootcdn](BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务) 查到cdn链接
unpkg 查到其他链接
npmjs 查到所有cdn
优化:开发模式使用第三方库,生产模式使用cdn加载引入
1.在 html 中引入第三方库的 CDN 地址 并用模板语法判断
1 | <% if(htmlWebpackPlugin.options.useCdn){ %> |
2.配置 webpack.config.js 中 externals 外部扩展选项(防止某些 import 的包被打包)
1 | if(process.env.NODE_ENV === 'production') { |
1 | // ... |
webpack 多页面打包
概念:
单页面:单个 html 文件,切换 DOM 的方式实现不同业务逻辑展示, Vue/React 会用到
多页面:多个 html 文件,切换页面实现不同业务逻辑展示
步骤
1.准备页面源码 改成模块化的导入导出方式
1.css代码包可以用cdn引入,但是自己写的css代码要模块化导入导出到index.js里
2.js代码包可以利用模板语法,生产模式引入cdn,开发模式用自己下到本地的包。自己写的js代码要模块化导入导出到index.js里
2.修改webpack.config.js 添加入口和出口和多页面的设置
1 | // ... |
优化-分割公共代码
将多个页面引用的公共代码提取
配置 webpack.config.js 的 splitChunks 分割功能
1 | // ... |
14.json-server
json-server
是一个用于快速搭建 RESTful API 的工具,它能够将一个 JSON 文件模拟成一个完整的 API 服务。这个工具非常适合用于前端开发过程中,需要一个简单的后端服务来提供数据和测试 API 的场景。
使用步骤
- 安装全局工具 json-server (全局工具仅需要安装一次)
1 | yarn global add json-server 或 npm i json-server -g |
- 代码根目录新建一个 db 目录
- 将资料 index.json 移入 db 目录
- 进入 db 目录,执行命令,启动后端接口服务 (使用–watch 参数 可以实时监听 json 文件的修改)
1 | json-server --watch index.json |