36 归档分页
370 留言互动
4 核心专题

从A标签跳转后JS失效?我踩过的坑和填坑方法

在博客列表页通过普通 `<a>` 跳转到文章详情时,页面加载正常但灯箱、复制按钮等 JS 功能失效,刷新或直接访问 URL 则一切正常。原因是浏览器在普通跳转时可能复用旧的 JS 环境或缓存页面,导致新页面的脚本未完整重新执行。临时解决办法是给链接加 `target="_self"`,强制完整加载;更根本的做法是改进 JS 初始化时机:在 `DOMContentLoaded`、`load`、`pageshow` 等事件中检查关键元素是否已出现,必要时使用 `setTimeout` 或 `Promise` 等方式等待后再调用 `initLightbox、initCopyButton` 等函数;文中还提供了基于 `PageManager` 的完整初始化管理器,能够在页面恢复、前进/后退等场景下安全重置并逐个等待所需元素。经验教训包括:不要盲目信任 `DOMContentLoaded`,要防御性地检查 DOM,了解浏览器缓存机制,并可考虑使用 `MutationObserver` 监听 DOM 变化。

OpenCodeAI 从入门到精通:全方位终端AI编程助手指南

OpenCodeAI 是面向终端的 AI 编程助手,采用本地客户端 + 云端模型服务的混合架构,能够读取、修改项目文件并在安全沙箱中执行操作,实现 AI 结对编程。文中详述了跨 macOS、Windows、Linux 的安装方法(Homebrew、Scoop、脚本、包管理器等),以及桌面版的图形化特性。随后提供 API 密钥获取、环境变量或配置文件安全存储的最佳实践,并给出国内模型(智谱 GLM、DeepSeek)以及多模型并存的配置示例。项目初始化通过 `opencode init` 自动生成上下文、忽略文件和模型偏好。核心功能以 Plan 模式为例,展示 AI 分析代码、制定实现计划、用户审查后执行的完整工作流,帮助完成如邮箱验证等复杂任务。全文覆盖概念、架构、安装、配置、使用全链路,帮助开发者快速上手并在命令行中高效利用 AI 编程。

深入解析CompletableFuture的设计哲学与实践

本文系统阐述了 Java 8 中 CompletableFuture 的设计哲学与实现细节。首先说明它受函数式编程和 Promise 思想驱动,提供链式、流式 API(thenApply、thenCompose 等)以实现回调与组合。随后解析内部状态机(INCOMPLETE、NORMAL、EXCEPTIONAL)和基于 Treiber 栈的依赖管理,揭示完成、异常传播的核心实现。接着通过电商订单处理案例演示并行检查、价格计算、库存扣减等业务的完整异步流水线,涵盖 thenCombine、allOf、异常处理、超时控制等实用技巧。最后列举条件执行、重试、超时降级等高级模式,展示 CompletableFuture 在高性能、可维护异步服务中的广泛应用。

Java7/8 中的 HashMap 和 ConcurrentHashMap 源码解析

文章系统地解析了 Java7/8 中 HashMap 与 ConcurrentHashMap 的实现细节。HashMap 采用数组+单向链表结构,容量始终为 2ⁿ,使用 loadFactor 与 threshold 控制扩容;put 时先计算 hash、定位桶、遍历链表去重,必要时双倍扩容并重新分配节点;get 通过相同的 hash 与 index 直接查找链表。ConcurrentHashMap 在此基础上引入 Segment(分段锁)实现并发,默认 16 段,每段内部类似 HashMap 并保持线程安全,初始化时将整体容量划分给各段,put 通过高位 hash 确定段并在对应 Segment 加锁后操作。全文重点说明了数组初始化、索引计算、节点插入、扩容机制以及并发控制的实现原理。

JVM对象创建与内存分配机制

JVM在执行new指令时首先检查类是否已加载、解析、初始化,然后在堆中为对象分配内存,采用“指针碰撞”或“空闲列表”方式,并通过CAS或TLAB解决并发冲突。分配后进行零值填充,设置对象头(包含hash、年龄、锁状态、类指针等),最后执行构造函数完成属性赋值。对象大小受对象头、实例字段和8字节对齐填充影响,默认开启指针压缩(UseCompressedOops/UseCompressedClassPointers)以降低内存占用并支持最高32 GB堆。JVM通过逃逸分析和标量替换可将不逃逸对象分配到栈上,减轻GC压力。

微服务入门(SpringCloud Alibaba)

本文以 Spring Cloud Alibaba 为例,演示了微服务项目的搭建流程。首先创建 Maven 父工程 cloud2021,统一管理 Spring Boot、Spring Cloud、Alibaba 以及 MySQL、Druid、MyBatis 等依赖,并通过 dependencyManagement 锁定版本。随后在父工程下新增支付服务模块 cloud‑provider‑payment8001,编写子模块 pom 引入公共 api 包及 Web、Actuator、MyBatis、Druid 等必要依赖;在 application.yml 中配置服务端口、Spring 应用名、Druid 数据源及 MyBatis 扫描路径;最后提供启动类 PaymentMain8001。全文展示了父子模块结构、依赖声明、资源配置及启动入口的完整实现,为新手快速搭建 Spring Cloud Alibaba 微服务提供了可复制的模板。

JVM类加载机制

JVM在执行 main 方法时先通过类加载器把主类加载到方法区,加载过程依次为加载、验证、准备、解析、初始化。加载阶段在内存生成对应的 Class 对象;验证检查字节码合法性;准备为静态字段分配默认值;解析把符号引用转为直接引用;初始化执行静态代码块并赋予真实值。JVM 提供引导、扩展、应用和自定义四种加载器,启动时由 Launcher 创建 ExtClassLoader 与 AppClassLoader。类加载遵循双亲委派机制:先交给父加载器(最终到引导加载器)尝试加载,若失败再由当前加载器自行查找。示例代码展示了按需加载、静态块打印以及各加载器的加载路径,说明了类加载的延迟性和层次结构。

使用Spring Boot整合Mybatis-Plus实现数据库的增删查改

文章详细演示了在 Spring Boot 项目中使用 Mybatis‑Plus 完成增删改查的全过程。首先在 MySQL 中创建 `tbl_employee` 表并插入示例数据;随后初始化 Spring Boot 项目并在 `pom.xml` 中加入 Mybatis‑Plus、MySQL、Druid 等依赖。将数据库连接配置写入 `application.yml`,使用 Lombok 编写实体类并通过 `@TableName`、`@TableId`、`@Version` 注解映射表结构。定义继承 `BaseMapper` 的 Mapper 接口并在启动类上使用 `@MapperScan` 指定扫描路径。最后提供 JUnit 测试代码,分别演示 `selectList`、`insert`、`update`、`delete` 等 CRUD 操作的使用方法,验证 Mybatis‑Plus 与 Spring Boot 的无缝集成。

Elasticsearch初体验-----将MySQL的数据导入kibana并展示到页面

本文详细演示了在已装 Docker 的服务器上,使用 Docker 部署单节点 Elasticsearch(7.12.1)和 Kibana(7.12.1),包括创建专用网络、加载镜像、配置容器参数及端口映射。随后通过 Kibana 的 DevTools 界面验证 ES 连接,并使用 MyBatis‑Plus 编写 Java 示例代码,将 MySQL 中的酒店数据批量转换为文档(HotelDoc),利用 RestHighLevelClient 的 BulkRequest 写入名为 hotel 的索引。最终在 Kibana 页面成功展示导入的数据,实现 MySQL 数据在 Elasticsearch 与 Kibana 可视化的完整流程。