来自分类 Vue2026-01-04 14:40:09
通常说, ajax 请求错误有两种, 一种是网络问题或者代码问题所造成的 400, 500错误等, 另外一种是请求参数后端通不过验证, 由后端抛出的错误
第二种根据不同的后端框架或者程序猿又可以分成两种, 一种是直接返回 json, 用一个 特别的 code 来区别正常请求返回的数据, 如:
```
{
code: -404,
message: '这是错误信息',
data: '',
}
```
还有一种就是抛出 http 404 之类的, 然后把错误原因放在 header 里.
在组件写调用 ajax时, 通常都是这么写(这里以 axios 为例):
```javascript
import axios from 'axios'
axios.get('/user?ID=12345')
.then(function (response) {
if (response.data.code === 200) {
console.log(response.data)
} else {
// 由后端抛出的错误
alert(response.data.m...
来自分类 前端2025-12-31 15:54:16
## nodejs
===框架===
https://github.com/expressjs/express `快速、无约束、极简的node web框架` [[文档]](https://expressjs.com/)
https://github.com/koajs/koa `使用 ES2017 异步函数为 node.js 提供表现力的中间件` [[文档]](https://koajs.com/)
===其他===
https://github.com/cheeriojs/cheerio `为服务器特别定制的,快速、灵活、实施的jQuery核心实现` [[文档]](https://github.com/cheeriojs/cheerio/wiki/Chinese-README)
https://github.com/node-schedule/node-schedule `定时任务`
https://github.com/paulmillr/chokidar `最小和高效的跨平台文件监视库`
https://github.com/shelljs/shelljs `Node.js的...
来自分类 Vue2025-12-23 16:15:25
在Vue3中,ref和shallowRef的选择取决于数据的结构和性能需求。以下是详细的选择指南:
### 1. 基础类型(String, Number, Boolean等)
#### ✅ 优先使用 ref
```ts
// 基础类型 - 使用 ref(两者无性能差异)
const count = ref(0)
const name = ref('张三')
const isLoading = ref(false)
```
理由:对于基础类型,ref和shallowRef的行为完全一致,没有性能差异,使用ref更统一。
### 2. 单层对象(平坦对象)
#### ✅ 推荐使用 ref
```ts
// 单层对象 - 使用 ref
const user = ref({
name: '张三',
age: 25,
email: 'zhangsan@example.com'
})
// 修改属性会自动触发响应式更新
user.value.name = '李四'
```
理由:
- 对象属性会被自动深度响应化
- 代码更直观,符合预期
- 性能开销可接受(只有一层深度)
###...
来自分类 Vue2025-12-18 13:59:24
看到检测到新版本后自动更新版本, 第一反应想到就是`ServiceWorker`, 是的, 使用`ServiceWorker`好处多多, 包括提示更新版本, 但是使用`ServiceWorker`有一个硬性条件, 那就是必须是 https 或者 localhost, 一些时候需要部署在内网时, 就没法实现了, 那么就必须换个思路来
大概思路就是: 请求一个文件, 读取该文件内容里的时间戳, 和本地缓存里的时间戳做对比, 如果不一致就给出提示, 让用户点击刷新
第一步: 那就是编译时, 附带生成一个文件, 并记录编译时的时间戳
这个我们可以写一个简单的`vite`插件, 编译后自动生成一个json文件, 当然不嫌麻烦, 也可以手动来改动一个文件
```ts
export default defineConfig(({ mode }: ConfigEnv) => {
// 编译后保存文件的文件, 一般是dist文件夹
const outDir = 'dist'
return {
// 其他配置
plugins: [
...
来自分类 前端2025-07-25 17:55:05
因为国内网络的原因, 给 npm 设置 registry 是必须的事情, 不然安装个依赖都下到天荒地老, 然后设置了 registry 后, 使用`npm publish`又会将包发到非官方去, 简单的做法就是去`.npmrc`文件把 registry 给注释了, 然后整天改来改去也挺麻烦的, 有没有省事一点的方法呢?
## 1. 登录npm
首先, 我们需要先登录到npm, 登录的方法有两种
### 1.1 账号密码登录
```bash
npm login --registry=https://registry.npmjs.org/
```
这里不能直接使用`npm login`登录, 不然会链接到`registry`设置的环境去
```bash
npm login
# npm notice Log in on https://registry.npmmirror.com/
```
然后输入 npmjs 的账号密码, 即可登录
### 1.2 使用 token 登录
如果你不希望每次使用 npm 时都...
来自分类 其他2025-04-25 09:53:08
默认情况下,Docker 在 Linux 上安装时会将其数据(如镜像和容器)存储在 /var/lib/docker 目录下,这个目录通常位于根分区 /。
如果你的根分区 / 的空间不足,你可以考虑将 Docker 的数据目录移动到其他分区,或者在安装 Docker 时直接配置它使用其他分区。
要更改 Docker 的默认存储位置,你可以通过修改 Docker 的配置文件或在启动 Docker 服务时设置环境变量来指定新的数据目录。
下面是一些步骤说明如何进行配置:
# 1. 停止 docker 服务
```bash
systemctl stop docker
# 如果没有权限, 可以使用 sudo
sudo systemctl stop docker
```
# 2. 创建新的存储目录
```bash
mkdir -p /data/docker
```
# 3. 修改 Docker 配置文件
```bash
vi /etc/docker/daemon.json
```
如果是空文件, 添加以下内容
```json
{
"data-root": "/data/...
来自分类 其他2025-04-15 10:37:03
```bash
cd ~
cat > docker.sh << 'EOF'
#!/bin/bash
# 下载docker包
# 根据架构适当修改, 详情见: https://mirrors.aliyun.com/docker-ce/linux/static/stable/
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/aarch64/docker-28.0.4.tgz
# 解压
tar zxf docker-28.0.4.tgz
# 移动解压后的文件夹到/usr/bin
mv docker/* /usr/bin
# 写入docker.service开始 ===>
cat > /usr/lib/systemd/system/docker.service << EOF_DOCKER_SERVICE
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=networ...
来自分类 其他2025-04-15 10:31:48
```bash
# 查看磁盘
lsblk
# 输入类似内容
# nvme1n1 259:0 0 1.5T 0 disk
# nvme0n1 259:1 0 1.5T 0 disk
# nvme2n1 259:2 0 1.5T 0 disk
# 下面命令行中的`nvme0n1`为其中一块磁盘, 根据需要可修改
# 创建分区 (依次输入: n - 回车 - 回车 - 回车 - w)
fdisk /dev/nvme0n1
# 格式化分区
mkfs.ext4 /dev/nvme0n1
# 创建挂载目录
mkdir -p /data
# 临时挂载分区
mount /dev/nvme0n1 /data
# 设置开机自动挂载
UUID=$(blkid -s UUID -o value /dev/nvme0n1)
sh -c "echo 'UUID=$UUID /data ext4 defaults,nofail 0 2' >> /etc/fstab"
# 验证配置无误
mount -a
# 验证挂载
df -h /data
```
...
来自分类 React2025-01-16 10:27:34
一开始的思路是在列表页面, 利用`useEffect`钩子监听location, 在清除函数里获取滚动条的高度, 可惜获取时机好像不对, 一直获取的高度都是0, 通过打印`body`的`innterHTML`发现, 这时候路由已经开始渲染详情页了
然后开始尝试使用`addEventListener`监听`scroll`, 代码如下:
```ts
export function useSaveScroll(key: string) {
const location = useLocation()
const pathname = location.pathname
useEffect(() => {
const handleScroll = () => {
ls.set(`scroll_path_${pathname}`, window.scrollY)
}
const scrollY = ls.get(`scroll_path_${pathname}`) || 0
wi...
来自分类 Vue2024-10-29 16:46:20
### 1. 新建一个 js/ts 文件, 定义好常量
```ts
// design.config.ts
/** 设计稿宽度, 此处最好就是按 1920 来计算, 避免 element-ui 之类 UI 框架出现字体不对 */
export const designWidth = 1920
/** 设计稿宽度, 此处最好就是按 1920 来计算, 避免 element-ui 之类 UI 框架出现字体不对 */
export const designHeight = 1080
/** 设计稿倍数 */
export const designMultiple = designWidth / 1920
/** 兼容最小宽度 */
export const minWidth = 1440
/** 兼容最小宽度(px) */
export const minWindow = `${minWidth}Px`
/** 为什么设置 100? 设置成便于计算, 计算rem时只需要将 设计稿的宽度 / 100 即可 */
export const fontSize = 100
```
### 2. ...