Docker Compose 常用命令手册
Docker Compose 命令# 启动所有服务(后台模式)docker-compose up -d# 停止并删除所有容器docker-compose down# 构建/重新构建服务镜像docker-compose build# 查看服务日志(实时)docker-compose logs -f# 列出所有运行中的服务docker-compose ps# 启动指定服务docker-compose start [服务名]# 停止指定服务docker-compose stop [服务名]# 重启指定服务docker-compose restart [服务名]# 查看服务依赖关系docker-compose config# 执行单次命令(不持续运行)docker-compose run [服务名] [命令]# 指定不同环境文件docker-compose --env-file .env.prod up# 扩展服务实例数量docker-compose up --scale [服务名]=3# 拉取服务所需镜像docker-compose pull# 暂停/恢复服务docker-compose p ...
TypeScript 的优势是什么?
静态类型检查
在编译阶段进行类型检查,提前发现潜在的类型错误
支持类型注解和类型推断,明确变量类型let count: number = 5;count = "5"; // 编译时报错
增强代码可维护性
类型系统作为代码文档,提高代码可读性
接口(Interface)和类型别名(Type Alias)帮助定义复杂数据结构interface User { name: string; age: number;}
更好的开发体验
智能提示和自动补全更精准
重构代码时保持类型安全
支持最新ECMAScript特性
渐进式采用
兼容JavaScript语法,支持逐步迁移
允许混合使用.js和.ts文件
类型声明文件(.d.ts)支持现有JS库
面向未来
支持装饰器、泛型等高级特性
完善的类型系统支持复杂应用开发
编译时移除类型注解,生成干净JS代码
团队协作优势
明确的接口定义减少沟通成本
类型约束规范代码风格
降低新人熟悉项目的门槛
生产环境可靠性
编译阶段捕获约15%常见错误
支持类型断言和类型保护
与主流框架(React/V ...
Docker 常用命令手册
基础命令# 查看Docker版本docker version# 显示系统信息(镜像/容器数量等)docker info# 下载镜像docker pull [镜像名]:[tag]# 启动容器(前台模式)docker run [镜像名]# 启动容器(后台模式)docker run -d [镜像名]
镜像管理# 列出本地镜像docker images# 搜索镜像docker search [关键词]# 删除镜像docker rmi [镜像ID]# 构建镜像docker build -t [镜像名] [Dockerfile路径]
容器操作# 列出运行中的容器docker ps# 列出所有容器(包含已停止)docker ps -a# 启动/停止容器docker start/stop [容器ID]# 进入运行中的容器docker exec -it [容器ID] /bin/bash# 删除容器docker rm [容器ID]# 查看容器日志docker logs [容器ID]
常用参数组合# 运行交互式容器docker run -it --name my_container ubuntu /b ...
Webpack、Vite 等构建工具的区别?
构建原理
Webpack:从入口递归分析模块依赖,打包所有模块。
Vite:开发用 ES 模块按需加载,生产用 Rollup 打包。
启动与热更新速度
Webpack:大型项目启动和热更新慢。
Vite:秒级启动,热更新快。
配置复杂度
Webpack:配置灵活但复杂。
Vite:配置简单,有默认配置。
生态系统
Webpack:成熟,生态庞大。
Vite:生态不断完善。
适用场景
Webpack:适用于大型复杂项目。
Vite:适合中小型及快速迭代项目。
Vue3 响应式原理深度解析
核心机制 - Proxy 代理
使用 ES6 Proxy 替代 Vue2 的 Object.defineProperty
通过拦截 get/set/deleteProperty 等操作实现响应追踪const reactive = (target) => new Proxy(target, { get(obj, key) { track(obj, key); // 依赖收集 return Reflect.get(obj, key); }, set(obj, key, value) { Reflect.set(obj, key, value); trigger(obj, key); // 触发更新 return true; }});
依赖收集与触发
使用 WeakMap 建立 target -> key -> effect 的三级映射关系
effect 函数包裹副作用,自动建立依赖关系let activeEffect;function effect(fn ...
Vue3 生命周期有哪些变化?与 Vue2 有什么区别?
生命周期变化
选项式API改名为组合式API命名方式
beforeCreate和created被setup替代
其他生命周期添加on前缀:
beforeMount → onBeforeMount
mounted → onMounted
beforeUpdate → onBeforeUpdate
updated → onUpdated
beforeUnmount → onBeforeUnmount
unmounted → onUnmounted
新增特性
新增onServerPrefetch用于服务端渲染
支持在setup中使用多个相同生命周期import { onMounted } from 'vue'setup() { onMounted(() => { console.log('第一次挂载') }) onMounted(() => { console.log('第二次挂载') })}
与 Vue2 主 ...
JavaScript 中的深拷贝和浅拷贝
核心概念
浅拷贝(Shallow Copy):仅复制对象的第一层属性,引用类型属性共享内存地址
深拷贝(Deep Copy):递归复制对象所有层级,新旧对象完全独立
常见实现方式浅拷贝方法// 1. Object.assignconst copy1 = Object.assign({}, original)// 2. 展开运算符const copy2 = {...original}// 3. Array.prototype.sliceconst arrCopy = arr.slice()
深拷贝方法// 1. JSON 序列化(有局限性)const deepCopy1 = JSON.parse(JSON.stringify(original))// 2. 递归实现function deepClone(obj, map = new WeakMap()) { if (typeof obj !== 'object' || obj === null) return obj if (map.has(obj)) retu ...
React 中 Class 组件和函数组件的区别?
函数组件更简洁,性能更好,使用 Hooks 可以实现状态管理;Class 组件有生命周期方法,可以使用 this 关键字。目前 React 推荐使用函数组件和 Hooks。
Java实战之自定义注解(以excel导出为案例)
定义注解@Excel、@PrintExcelLog。
@Excel用于设置excel的标题和默认值
@PrintExcelLog用于标识是否打印excel导出日志/** * 用于设置excel的标题和默认值 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})@Componentpublic @interface Excel { String title() default ""; String value() default "";}```j```java/** * 用于标识是否打印excel导出日志 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface PrintExcelLog { boolean value ...
Spring设计模式-责任链模式
责任链模式
责任链模式是一种行为设计模式,它允许你创建一系列对象,使每个对象都有机会处理请求。在该模式中,请求沿着对象链传递,直到最后一个责任链对象为止,。
责任链模式的要点
Handler 接口:定义了处理请求的接口,通常包含一个处理请求的方法。
ConcreteHandler 具体处理者类:实现了处理请求的方法,并决定是否自行处理请求或将请求传递给下一个处理者。
Client 客户端:创建责任链,并将请求发送到链中的第一个处理者。在 Spring 框架中,责任链模式经常被用于实现过滤器、拦截器等功能,例如在 Spring Security 中就有一个基于责任链模式的安全过滤器链。
责任链模式在项目中可以用来做什么?
校验用户的权限:token权限、URL权限、是否已经被管理员禁用;
校验短信的数据:是否手机号码在黑名单里、参数是否合法、平台的短信功能是否开启
支付回调:验签、订单状态更新、发送通知告知用户支付成功、统计订单支付成功数量、金额。
案例验签、订单状态更新、发送通知告知用户支付成功、统计订单支付成功数量、金额这几个步骤进行拆分,每个步骤都是一个链条,具体代码如下:
...