服务端2月18日 23:35
Kubernetes 亲和性和反亲和性如何控制 Pod 调度?Kubernetes 亲和性和反亲和性,本质上是在回答“Pod 应该靠近谁、远离谁、只能去哪里”。nodeAffinity 关心节点标签,比如把需要 SSD 的服务放到 `disk=ssd` 的节点;podAffinity 关心已有 Pod,比如把网关和同可用区缓存放近一点;podAntiAffinity 则常用于把同一应用副本打散,避免一个节点故障带走所有实例。真正落地时不要把所有规则都写成 required,硬约束越多,调度失败的概率越高;通常是“必须满足资源和隔离,性能偏好用 preferred”。
## 怎么用节点亲和性限制 Pod 去指定节点?
节点亲和性比 `nodeSe...服务端2月18日 23:46
Kafka 为什么曾经依赖 ZooKeeper?它到底负责什么?在早期和大量存量 Kafka 集群里,ZooKeeper 负责保存和协调集群元数据:Broker 注册、Controller 选举、Topic 与分区信息、部分配置和权限数据。它不是 Kafka 的消息存储层,真正的消息仍然写在 Broker 本地日志里。ZooKeeper 更像一个一致性协调中心,帮助 Kafka 判断“谁还活着、谁来当 Controller、元数据现在是什么状态”。
## ZooKeeper 管哪些事
Broker 启动后会连接 ZooKeeper,并在 `/brokers/ids` 下创建临时节点。临时节点和会话绑定,如果 Broker 宕机或网络断开超过会话超...服务端2月18日 23:50
Vite 相比 Webpack 快在哪里,又有哪些迁移坑?Vite 是一个面向现代前端项目的构建工具,开发期基于浏览器原生 ESM 提供按需转换,生产期默认用 Rollup 输出优化后的静态资源。它相比 Webpack 最明显的优势是启动快、HMR 快、默认配置更贴近现代框架。但如果把 Vite 理解成“Webpack 的全面替代品”,迁移时很容易踩坑,因为两者的开发模型、插件生态和打包边界并不完全一样。
## Vite 快在哪里
Webpack 开发服务器启动时,通常要从入口开始构建完整依赖图。项目越大,首次启动越慢。Vite 则把源码模块交给浏览器按需请求,开发服务器只在请求到某个文件时转换它。依赖部分由 esbuild 预构建,速度很...服务端2月18日 23:50
Vite HMR 是如何做到修改代码后几乎秒更新的?Vite HMR 的核心不是“重新打一个更小的包”,而是利用浏览器原生 ESM 和开发服务器的模块图,只更新真正变化的模块。文件改动后,Vite 服务器通过 WebSocket 通知浏览器,浏览器再按新的模块 URL 拉取更新内容。如果某个模块声明自己能接受更新,页面就不刷新;如果更新无法安全接住,Vite 才会退回整页刷新。
## HMR 的基本链路
开发服务器启动后,Vite 会维护一张模块图,记录 URL、文件路径、导入关系和被哪些模块引用。浏览器加载页面时,每个源码模块都以 ESM 方式请求,比如 `/src/App.tsx`、`/src/main.tsx`。当你保存文件,文...服务端2月18日 23:50
为什么 Vite 开发用 esbuild,生产构建却用 Rollup?Vite 在开发环境主要依赖原生 ESM、esbuild 和开发服务器,在生产环境默认使用 Rollup 打包。这个设计不是“开发一套、上线另一套”的随意拼接,而是把两个阶段最在意的目标分开处理:开发时要快启动、快更新、少等待;上线时要稳定产物、代码分割、tree-shaking、资源压缩和缓存友好。
## 开发环境为什么不先打包
传统打包工具在启动 dev server 前,通常要先分析入口、递归构建依赖图,再把一大包代码交给浏览器。项目越大,启动越慢,改一个文件也可能牵动一片模块。Vite 的思路更直接:源码模块先按浏览器原生 ESM 方式请求,浏览器需要哪个文件,开发服务器就转...服务端2月18日 23:51
Vite 依赖预构建有什么用?什么时候需要手动配置?Vite 启动快,并不是因为它什么都不做。业务源码交给浏览器按需请求,但 npm 依赖会先做一次依赖预构建。它把 CommonJS/UMD 转成 ESM,也把零散依赖合并成较少请求。
## 为什么需要预构建
浏览器原生 ESM 不认识裸模块导入,也不能直接执行 CommonJS。Vite 会扫描入口源码,找到第三方依赖,再用 esbuild 打到缓存目录。
```ts
import React from 'react'
import { debounce } from 'lodash-es'
```
如果让浏览器逐个请求某些 ESM 包内部的几百个文件,开发首屏会很慢。预构建的取...服务端2月18日 23:51
如何开发一个 Vite 插件?常用钩子怎么选?Vite 插件就是一个带 `name` 和若干钩子的对象。它和 Rollup 插件很像,因为生产构建阶段复用了 Rollup;但 Vite 还有开发服务器、HMR、HTML 转换和依赖预构建,所以写插件不能只按构建阶段思考。
## 最小插件怎么写
插件通常写成函数,方便接收选项。真正需要哪个钩子就写哪个,不要一开始就把所有钩子列满。
```ts
import type { Plugin } from 'vite'
export function replaceVersion(version: string): Plugin {
return {
name: 'repl...服务端2月18日 23:51
Vite 配置文件怎么写?路径别名如何避免踩坑?Vite 配置文件不复杂,但项目变大后,真正需要管理的东西会变多:开发服务器、代理、路径别名、构建输出、CSS、环境变量、依赖预构建和插件顺序。好的配置不是把所有选项都写满,而是把开发体验和生产产物的边界分清楚。
## 配置文件从哪里来
Vite 默认识别 `vite.config.js`、`vite.config.mjs`、`vite.config.ts`、`vite.config.cjs`。现代 TypeScript 项目通常用 `vite.config.ts`,配合 `defineConfig` 能拿到类型提示。
```ts
import { defineConfig } f...服务端2月18日 23:52
Vite 如何加载图片、CSS 和 public 静态资源?Vite 处理静态资源时,先分清两类文件:一类在 `src` 里被代码引用,会进入构建图;另一类放在 `public`,按原路径复制到输出目录。开发环境为了快,Vite 通常让浏览器直接请求资源;生产构建时,Rollup 会接管引用、加 hash、压缩或内联。
## src 中的图片和字体怎么加载
放在 `src/assets` 的图片、字体、视频,只要被 JS、TS、Vue、React 组件或 CSS 引用,Vite 就能分析到它们。开发时导入结果通常是一个可访问 URL,构建后会变成带 hash 的文件名,方便长期缓存。
```ts
import logoUrl from '....服务端2月18日 23:52
Vite 和 Webpack 该怎么选?Vite 和 Webpack 的区别,不是“新工具淘汰旧工具”这么简单。Vite 开发阶段用原生 ESM 按需加载,生产阶段交给 Rollup 打包;Webpack 从一开始就围绕完整依赖图和打包体系设计。一个默认轻快,一个承载复杂工程多年积累,选择时要看项目边界。
## 开发阶段差异最大
Webpack dev server 通常要先分析入口、loader、plugin 和依赖图,项目越大,冷启动越慢。Vite 启动时先把服务器跑起来,浏览器请求哪个源码模块,再转换哪个模块;第三方依赖则通过 esbuild 预构建,减少 CommonJS 兼容和请求过多的问题。
这也是 Vite...