面试题手册

梳理高频技术问题,帮助你按主题复习和查漏补缺。

前端阅读 05月29日 00:26

Bun 在 I/O 性能方面做了哪些优化?

Bun用Zig语言编写,I/O优化的核心是绕过libuv,直接走系统调用。具体优化:文件I/O使用Bun.file()API,底层通过mmap内存映射和直接syscall读写,Linux上利用io_uring实现异步,避免Node.js经libuv线程池的开销;HTTP服务用Bun.serve()构建,基于零拷贝响应和原生HTTP解析器(不用Node的http-parser),基准吞吐量高出Node.js约3倍;SQLite内置驱动直接编译进运行时,省去FFI调用开销;启动优化通过原生TypeScript执行(无需tsc编译步骤)和全局缓存减少冷启动I/O。总结:Node.js的I/O路径是JS→V8→libuv→OS,Bun是JS→JavaScriptCore→Zig syscall→OS,少了中间层。追问io_uring在Linux上的性能优势具体来自哪里?macOS上Bun用什么替代方案?Bun.serve的零拷贝是如何实现的?Response对象哪些场景下会触发拷贝?Bun.file()和Node.js的fs.promises.readFile在处理大文件时的内存占用差多少?内置SQLite驱动和better-sqlite3相比,性能差距主要在哪?Bun的HTTP客户端(Bun.fetch)也做了类似的零拷贝优化吗?写段代码// Bun: 零拷贝文件服务const file = Bun.file('./data.json');Bun.serve({ fetch: (req) => new Response(file), // 直接返回文件流,无需读取到内存 port: 3000});
前端阅读 05月29日 00:25

Dify 支持哪些类型的输入输出格式?如何自定义数据处理逻辑?

Dify工作流的输入支持:文本(短文本/段落)、结构化数据(下拉选择/数字/复选框/JSON)、文件上传(PDF/Word/TXT/Markdown,也支持图片和音频)。输出默认为LLM生成的文本,可配置为结构化JSON(通过JSON Schema约束)。自定义数据处理有三种方式:代码节点直接写Python/Node.js脚本做数据转换、JSON拼接、算术运算;模板节点用Jinja2语法灵活格式化输出文本;变量赋值节点对字符串/数字/数组进行覆盖、追加、扩展等操作。此外参数提取器能用LLM从自然语言中推理出结构化参数,迭代节点支持对数组批量处理。自定义工具还可通过OpenAPI/Swagger规范接入外部API。追问代码节点和模板节点分别适合什么场景?性能差异大吗?参数提取器如何保证提取结果的结构化可靠性?提示词怎么写?文件上传后Dify内部怎么处理?PDF解析用的是哪个库?迭代节点处理大数组时有没有并发或超时限制?自定义工具的OpenAPI Schema最大能定义多少个接口?写段代码# Dify代码节点:提取关键字段并格式化import jsondef main(input_text: str) -> dict: result = { "length": len(input_text), "summary": input_text[:100] } return {"result": json.dumps(result, ensure_ascii=False)}
前端阅读 05月29日 00:25

FFmpeg支持哪些常见的音视频格式?

FFmpeg支持100+容器格式和200+编解码器,需区分容器和编码两层。容器层主流格式:MP4(兼容性最广)、MKV(多音轨/字幕)、WebM(Web优化)、MOV(Apple生态)、FLV(直播推流)、TS(HLS切片)。视频编码:H.264/AVC(最通用)、H.265/HEVC(同质量体积减半)、VP9(WebM默认)、AV1(开源下一代,FFmpeg 5.0+支持)。音频编码:AAC(流媒体标配)、Opus(低延迟实时通信最优)、MP3(兼容旧设备)、FLAC(无损)。关键认知:容器决定封装结构,编码决定压缩算法,同一容器可装不同编码(如MP4可装H.264或H.265)。用ffmpeg -encoders查看本地支持的编码器列表。追问H.264和H.265在FFmpeg中用什么编码器?libx264和h264_nvenc性能差多少?MP4容器能装VP9视频吗?为什么WebM比MP4更适合Web场景?Opus相比AAC在延迟和码率上有什么优势?为什么WebRTC选Opus?FLV容器为什么逐步被淘汰?HLS的TS切片方案解决了FLV的什么问题?ffmpeg -codecs和ffmpeg -encoders输出有什么区别?写段代码# 查看本地支持的所有H.265编码器ffmpeg -encoders 2>/dev/null | grep 265# MP4转WebM(VP9+Opus)ffmpeg -i in.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus out.webm
服务端阅读 05月29日 00:25

Cypress 中如何实现数据驱动测试?

数据驱动测试将测试数据与逻辑分离,Cypress 通过 cy.fixture() 加载 cypress/fixtures/ 下的 JSON 文件驱动测试。核心流程:在 fixtures 目录建数据文件,测试中用 cy.fixture() 加载后遍历执行,实现一组逻辑跑多组数据。更简洁的方式是结合 cy.each() 或原生 forEach 迭代数据,避免为每组数据写重复测试。外部数据文件适合管理多环境配置和边界值数据集,fixtures 适合静态模拟数据。追问cy.fixture() 和直接 import JSON 有什么区别?cy.fixture() 走 Cypress 管道,支持超时重试和命令日志;import 是编译时加载,不经过 Cypress 命令链,无法在报告中追踪。如何用 fixtures 实现参数化测试?用 cy.fixture() 加载数组数据,配合 cy.each() 或 forEach 遍历,每组数据生成独立 it 用例,失败时能精确定位是哪组数据有问题。fixtures 数据在不同测试间会互相影响吗?Cypress 默认每个测试前重置 fixtures 状态;但如果在 before 中修改 fixture 返回的对象,会影响后续测试,建议每次加载用深拷贝。大量测试数据该怎么管理?按模块分目录(fixtures/auth/、fixtures/products/),公共数据放 fixtures/common/;环境相关数据用 cypress.env.json + CYPRESS_ 环境变量区分。写段代码// fixtures/users.json: [{"name":"Alice","role":"admin"},{"name":"Bob","role":"user"}]describe('数据驱动权限测试', () => { let users; before(() => { cy.fixture('users').then(data => users = data); }); users.forEach((user, i) => { it(`用户 ${user.name} 角色为 ${user.role}`, () => { cy.login(user.name, 'pass'); cy.get('[data-testid=role]').should('contain', user.role); }); });});
前端阅读 05月29日 00:25

Dify 的部署方式有哪些?分别适用于哪些场景?

Dify提供三种主流部署方式:云服务(SaaS)即开即用,适合快速验证和中小团队,无需运维但数据存于Dify服务器;Docker自托管通过docker compose up一键拉起,适合需要数据自主可控的企业,是最常用的生产部署方案;Kubernetes集群部署基于Helm Chart编排,适合高可用、弹性伸缩和大规模并发场景。此外还有社区版源码部署,适合需要深度定制或二次开发的场景。选择依据:数据敏感选自托管,快速上手选云服务,企业级生产选K8s。Dify自托管依赖PostgreSQL、Redis和Nginx,Docker Compose方案已包含全部依赖。追问Docker自托管和K8s部署在资源开销上差多少?10人团队该选哪个?云服务版的数据隔离机制是什么?多租户场景下知识库数据是否会交叉?自托管升级版本时如何做到零停机?数据库迁移脚本谁负责执行?Dify的API扩展点和插件系统在不同部署方式下有差异吗?混合部署(敏感数据本地+推理云端)在Dify中如何实现?写段代码# docker-compose 自托管最小配置services: api: image: langgenius/dify-api:latest environment: DB_USERNAME: postgres DB_PASSWORD: ${DB_PW} REDIS_HOST: redis web: image: langgenius/dify-web:latest ports: ["80:80"]
服务端阅读 05月29日 00:24

Cypress 中 Page Object 模式有必要用吗?

Page Object 模式将页面元素选择器和操作封装为独立类,测试代码只调用方法不直接写选择器,页面变更时只需改 Page Object 不改测试。但在 Cypress 中,Custom Command 常能替代 POM 的大部分功能——cy.login() 比 loginPage.login() 更符合 Cypress 风格。POM 真正有价值的场景是:多页面复杂流程(如电商下单流程跨 4 个页面)、团队已熟悉 POM 模式、选择器需要跨多个测试文件共享复用。追问Cypress 官方对 POM 的态度是什么?官方认为 POM 不是必须的,Cypress 的 Custom Command 和组合式 API 已能很好复用逻辑;过度封装反而增加维护成本,简单场景用 Custom Command 更合适。Custom Command 和 POM 怎么选?单页面或少交互场景用 Custom Command(如 cy.login());多页面流程且团队习惯 OOP 风格时用 POM,两者可混合使用。POM 中选择器应该怎么管理?统一使用 data-testid 属性作为选择器锚点,不依赖 CSS class 或 DOM 结构,UI 样式变更不影响测试稳定性。POM 类变得臃肿怎么办?拆分为基础 PageObject(通用方法)+ 具体页面子类;组件级别的对象(如导航栏)独立为 Component Object,避免单类膨胀。写段代码// POM 类 + 测试使用class LoginPage { get username() { return cy.get('[data-testid=username]'); } get password() { return cy.get('[data-testid=password]'); } login(user, pass) { this.username.type(user); this.password.type(pass); cy.get('[data-testid=submit]').click(); }}// 测试中const login = new LoginPage();login.login('admin', '123456');cy.url().should('include', '/dashboard');
前端阅读 05月29日 00:24

FFmpeg的核心组件包括哪些?分别有什么作用?

FFmpeg的核心组件分为库和命令行工具两大类。库层面:libavcodec负责音视频编解码(H.264/H.265/AAC等),libavformat处理容器封装与解封装(MP4/MKV/FLV),libavfilter实现滤镜链(缩放/旋转/叠加),libswscale做像素格式转换(YUV↔RGB),libswresample处理音频重采样与通道转换,libavutil提供通用数据结构(AVPacket/AVFrame)和工具函数,libavdevice抽象硬件设备交互。工具层面:ffmpeg是转码命令行入口,ffprobe探测媒体流信息,ffplay轻量播放器。转码流水线为:demux(libavformat)→ decode(libavcodec)→ filter(libavfilter)→ encode(libavcodec)→ mux(libavformat)。追问libavcodec和libavformat的职责边界在哪?为什么要把编解码和容器处理拆成两个库?转码时用-c copy跳过了流水线中哪些环节?为什么能实现无损且秒级完成?libswscale和libavfilter的scale滤镜功能重叠,实际项目中该用哪个?ffprobe如何快速获取视频时长和码率?底层调用了libavformat的哪个接口?硬件加速编解码(NVENC/QSV)在组件架构中如何接入?是否绕过了libavcodec?写段代码# 查看视频流信息ffprobe -v quiet -print_format json -show_streams input.mp4# H.264转H.265,音频直接拷贝ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a copy output.mp4
服务端阅读 05月29日 00:24

如何优化 Cypress 测试的执行速度?

核心优化手段:用 cy.session() 缓存登录状态避免重复登录;通过 --parallel 并行执行拆分 spec 文件;用 cy.intercept() 拦截 mock 网络请求减少真实 API 调用;避免 cy.wait() 硬编码等待,让 Cypress 自动重试机制生效;配置 baseUrl 避免重复导航。综合使用可将 1000+ 用例执行时间从 20 分钟压到 5 分钟以内。追问cy.session() 和 before() 中登录有什么区别?before() 每个测试文件都会执行登录;cy.session() 在同文件内跨测试复用登录状态,且 session 失效时自动重建,减少冗余请求。并行执行为什么需要 Cypress Cloud?Cypress 的并行调度依赖 Dashboard 服务分配测试到不同机器,免费版可用 cypress-parallel 插件做本地并行,但缺少负载均衡。如何识别最慢的测试用例?运行 cypress run --reporter=json 生成报告,按 duration 排序定位瓶颈;或在 Cypress Cloud 查看耗时分布图。spec 文件应该怎么拆分?按功能模块拆分,每个 spec 控制在 10-20 个测试;避免单文件过大影响并行均衡,也避免过碎导致启动开销占比过高。cy.intercept() mock 数据会不会导致测试失真?会,应在关键流程用真实 API,仅在辅助请求(如第三方服务)使用 mock,并在 CI 中定期跑无 mock 的全量回归验证。写段代码// cy.session 缓存登录 + intercept mockbeforeEach(() => { cy.session('user', () => { cy.intercept('POST', '/api/login', { statusCode: 200 }); cy.visit('/login'); cy.get('[name=email]').type('user@test.com'); cy.get('[name=password]').type('pass123'); cy.get('button').click(); });});
服务端阅读 05月29日 00:24

Cypress 测试隔离和数据管理怎么做?

Cypress 默认每个 it 块前会重置浏览器状态(清 cookie、localStorage、sessionStorage),Cypress 12+ 开启 testIsolation: true 后更强——每次测试前自动 cy.visit() 恢复初始页面。数据管理分三层:fixtures 管理静态数据、cy.request() + 自定义命令做动态数据创建、cy.task() 操作数据库清理。核心原则:测试不依赖执行顺序,每个测试自给自足。追问cy.session() 怎么用?和 beforeEach 中登录有什么区别?cy.session() 缓存登录后的 cookie 和 localStorage,同一 spec 内重复使用时不重新登录,显著加速测试。而 beforeEach 每次都执行完整登录流程。session 在 spec 间不共享(Cypress 12+ 的限制),跨 spec 需配合 cy.request 预置状态。testIsolation: true 和 false 各适合什么场景?true(默认)适合功能测试,保证每个用例干净状态;false 适合需要跨测试保持状态的端到端流程测试(如多步向导),但需手动在 beforeEach 中清理关键状态。fixtures 和 cy.task() 生成数据怎么选?fixtures 适合不变的测试输入(表单数据、API 响应模板);cy.task() 适合需要与后端交互的动态数据(创建测试用户、插入数据库记录),task 在 Node 环境执行,能直连数据库。如何保证并行执行时测试数据不冲突?用唯一标识生成数据:Date.now() 或 Cypress._.random(),避免固定用户名。测试结束在 afterEach 中通过 cy.request 或 cy.task 清理自己创建的数据,不依赖全局 reset。写段代码// cy.session 加速登录 + fixtures 管理数据Cypress.Commands.add('login', (role) => { cy.session(role, () => { cy.fixture('users').then((u) => { cy.request('POST', '/api/login', u[role]); }); });});
服务端阅读 05月29日 00:24

JWT 如何满足 GDPR 等合规性要求?

JWT 与合规的核心矛盾:JWT 不可变(签发后不能修改内容),但 GDPR 要求用户可以删除数据(被遗忘权)。解决思路有三个:一是 payload 只放最小必要信息(用户 ID + 角色),不存个人数据;二是实现 token 黑名单或短期 TTL,用户请求删除时立即作废所有 token;三是审计日志记录所有 token 签发和使用,满足可追溯要求。对 HIPAA/PCI DSS 同理——JWT 中绝不放 PHI(受保护健康信息)和支付卡号,只存引用 ID。## 追问GDPR 被遗忘权与 JWT 不可变性怎么协调?JWT 内容无法修改,但可以通过作废来"遗忘":将用户所有 token 加入黑名单、使 refresh token 失效、删除服务端用户数据。过期 token 中的个人信息残留属于技术限制,GDPR 在合理范围内允许。HIPAA 对 JWT 有什么特殊要求?不能在 payload 中存储任何 PHI(诊断、药物、病历等),只放用户 ID 和 scope 声明。所有 PHI 访问必须记录审计日志(谁在什么时间访问了什么数据),JWT 中的 sub 和 scope 用于日志关联。密钥轮换与合规审计有什么关系?合规框架(SOC 2/ISO 27001)要求定期轮换密钥。实现方式:维护多个密钥版本,新 token 用新密钥签发,验证时按 kid 字段选择对应密钥。轮换期间旧 token 逐步过期,无需强制用户重新登录。JWT 的审计日志应该记录什么?至少包含:用户 ID、操作类型(签发/验证/撤销)、时间戳、来源 IP、User-Agent、token 前缀(不记录完整 token)。日志存储到不可篡改的系统(如 append-only 存储),满足 SOC 2 审计要求。## 写段代码javascript// GDPR 合规:数据删除 + token 作废async function deleteUserData(userId) { // 作废所有 token await redis.set(`deleted:${userId}`, '1', 'EX', maxTokenTTL); // 删除用户数据 await db.delete('users', { id: userId }); // 审计日志 await auditLog('DATA_DELETED', { userId, reason: 'user_request' });}// 验证时检查用户是否已删除if (await redis.get(`deleted:${decoded.sub}`)) { throw new Error('user data deleted');}