面试题手册

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

前端阅读 05月30日 19:40

Expo EAS Build、Submit 和 Update 分别解决什么问题?

Expo EAS 是 Expo Application Services,主要把移动应用从“本地能跑”推进到“团队可构建、可提交、可更新”。Build 负责在云端产出 iOS/Android 安装包,Submit 负责把产物提交到 App Store 或 Google Play,Update 负责在不改原生二进制的前提下推送 JS 和资源更新。追问EAS Build 解决的核心问题是什么?它把 Xcode、Gradle、证书、签名、构建机环境这些麻烦事集中到云端处理。团队成员不必每个人都配置一套原生打包环境。EAS Submit 和 EAS Build 有什么区别?Build 只负责生成 ipa、aab 或 apk,Submit 负责把产物交给应用商店。构建成功不代表一定能提交成功,商店账号、版本号和证书仍要匹配。EAS Update 能更新所有线上问题吗?不能。它只能更新 JavaScript、图片、字体等资源,不能新增原生模块、修改权限、scheme 或 Android 原生配置。eas.json 的 profile 应该怎么设计?development 用 developmentClient,preview 用于内测分发,production 放商店发布配置。不要让测试包和生产包共用同一条 update channel。团队使用 EAS 最容易踩什么坑?Expo Go 能跑不代表生产包没问题;OTA 更新也要记录 runtimeVersion、channel 和提交哈希,出问题才能回滚。写段配置{"build":{"development":{"developmentClient":true},"preview":{"distribution":"internal"},"production":{"autoIncrement":true}}}
前端阅读 05月30日 19:40

Expo Router 文件系统路由是如何工作的?

Expo Router 是 Expo 官方推荐的路由方案,它把 app 目录里的文件映射成页面路径:app/user/[id].tsx 对应 /user/:id,_layout.tsx 负责给同一层页面套 Stack、Tabs、Modal 或全局 Provider。它底层仍使用 React Navigation,不是另起炉灶,而是把手写 screen 配置改成文件约定。追问Expo Router 和 React Navigation 有什么关系?Expo Router 底层依然依赖 React Navigation,导航能力并没有少。区别是通过文件结构生成路由,适合页面多、需要深链或同时支持 Web 的 Expo 项目。文件系统路由是怎么工作的?app/index.tsx 是首页,app/settings.tsx 是 /settings,app/user/[id].tsx 是动态路由。(tabs) 目录用于分组,不直接出现在 URL 里。动态参数应该怎么读取?常用 useLocalSearchParams 读取当前页面参数。参数通常是字符串或字符串数组,接口需要数字时要自己转换和校验。深度链接和 Web URL 有哪些坑?改 scheme、Universal Links、Android App Links 后,通常要重新打 Development Build 或生产包验证。Expo Go 能跳不代表商店包配置正确。项目变大后怎么组织路由?把认证、Tabs、弹窗、业务模块分到不同分组里,让每个 _layout.tsx 只管当前层级的导航。写段代码const { id } = useLocalSearchParams<{ id: string }>();router.push(`/user/${id}/orders`);
前端阅读 05月30日 19:40

Expo Web 如何实现跨端开发并避开常见坑?

Expo 支持 Web 的基础是 React Native for Web:View、Text、Pressable 等组件会映射到浏览器 DOM,再配合 Metro、Expo Router 和静态导出,把同一套业务代码跑到 iOS、Android 和 Web。它最大的价值是复用,而不是把移动端应用一键变成高质量网站。上线时,Web 端还要单独处理 SEO、响应式宽度、鼠标键盘交互、无障碍和浏览器 API 差异。追问Expo Web 怎么启动和发布?开发时用 npx expo start --web。发布静态站点常用 npx expo export --platform web,再把产物交给 Vercel、Netlify、Nginx 或对象存储。React Native for Web 做了什么?它把 React Native 组件和样式模型翻译成 Web 可理解的结构。好处是组件复用,代价是并非所有原生能力都有 Web 等价物。哪些代码需要平台区分?相机、推送、文件系统、安全存储、分享、下载和路由跳转最容易分叉。简单差异用 Platform.OS,差异大时用 .web.tsx。跨端样式最容易踩什么坑?移动端固定宽度、全屏弹层、触摸优先交互放到桌面会很别扭。Web 端要补 hover、focus、键盘操作和宽屏断点。SEO 和 PWA 能自动做好吗?不能。Expo Router 能让 URL 更自然,但标题、描述、结构化内容、静态导出策略、manifest 和缓存策略仍要自己设计。写段代码const padding = Platform.select({ web: 24, default: 16 });
前端阅读 05月30日 19:40

Expo 开发应该用哪些调试工具排查问题?

Expo 调试工具可以按问题类型来选:启动失败先看 Expo CLI 和 Metro 日志,页面状态异常用 React Native DevTools,真机连接问题看设备日志和网络环境,性能问题再上 Profiler。现在不建议把老的“远程 JS 调试”当默认方案,因为 Hermes、New Architecture 和新版 React Native DevTools 已经改变了调试路径。追问Expo CLI 在调试里主要做什么?Expo CLI 负责启动 Metro、生成二维码、打开模拟器、切换连接方式和清缓存。常用 npx expo start,遇到 bundle 或资源缓存异常,先试 npx expo start -c。React Native DevTools 怎么打开?项目跑起来后,在终端按 j 通常就能打开。它可以看 Console、Sources、Network、Components 和 Profiler,比旧工具更贴近 Hermes 调试体验。Expo Go 和 Development Build 调试有什么区别?Expo Go 适合验证纯 JS 和官方内置模块,启动快,但不能覆盖所有自定义原生能力。加了 config plugin、推送、深链或第三方 SDK,就应用 Development Build。真机连不上开发服务器怎么排查?先确认手机和电脑在同一网络,防火墙、代理、VPN、公司 Wi-Fi 隔离都可能导致失败。LAN 不行可以临时用 tunnel,但不适合判断性能。性能问题应该看哪个工具?先用 Profiler 看组件是否重复渲染,再看 Network 是否重复请求或接口太慢。滚动、动画、输入卡顿一定要在真机或接近生产的 Development Build 里测。写段代码if (__DEV__) { console.group('user'); console.log(user.id, user.role); console.groupEnd(); }debugger;
前端阅读 05月30日 19:40

Expo 动画该用 Animated、Reanimated 还是 Lottie?

Expo 里做动画,先看动画的“控制权”在哪里:只是按钮淡入、卡片位移、骨架屏闪一下,用 React Native 自带 Animated 就够;动画要跟手势实时绑定、拖拽时不能掉帧,优先用 React Native Reanimated;如果设计师已经从 After Effects 导出了复杂插画,就用 Lottie。别把三者理解成替代关系,它们更像三种入口:Animated 轻、Reanimated 稳、Lottie 还原设计稿快。追问Animated 和 Reanimated 到底差在哪?Animated 适合透明度、缩放、平移这类常规过渡,API 学习成本低。Reanimated 的共享值和 worklet 能跑在 UI 线程,手势拖拽、底部抽屉、列表联动更稳,但写法和调试成本也更高。Lottie 适合替代手写动画吗?不适合全部替代。Lottie 很适合加载、空状态、品牌动效,因为它能最大程度还原设计资源;但它不适合承载复杂业务状态。Expo 项目里需要额外配置什么?依赖建议用 npx expo install react-native-reanimated lottie-react-native,版本会跟当前 SDK 对齐。Reanimated 还要确认 Babel 插件放在 plugins 最后。动画卡顿时先排查哪里?先看动画是不是被 JS 线程阻塞,比如大量 setState、日志、JSON 解析或列表重渲染。能用 transform 就别改布局尺寸。实战选型有什么取舍?简单动效别强行上 Reanimated,后续维护成本更高;设计师交付 Lottie JSON 时优先 Lottie;和手势强绑定再用 Reanimated。写段代码const x = useSharedValue(0);const style = useAnimatedStyle(() => ({ transform: [{ translateX: withSpring(x.value) }] }));
服务端阅读 05月30日 15:53

什么是 Nginx?它为什么适合高并发?

Nginx 是一个高性能 Web 服务器,也常用作反向代理、负载均衡器、静态资源服务器和 API 网关。它适合高并发,核心原因是事件驱动和异步非阻塞 I/O:少量 worker 进程通过事件循环处理大量连接,不需要给每个连接都分配一个线程。简单说,Apache 更像“一个请求安排一个人盯着”,Nginx 更像“少量工作人员按事件通知处理”,长连接和静态资源场景下资源消耗更低。追问Nginx 主要解决什么问题?它常解决三件事:对外提供 HTTP 服务,把请求转发给后端,以及把流量分摊到多台服务器。实际项目里还会让它处理 HTTPS 终止、静态资源缓存、限流、压缩、访问日志和灰度路由。为什么说 Nginx 适合高并发?它不为每个连接创建独立线程,而是通过 worker 进程和事件循环处理连接状态变化。大量连接处于等待网络 I/O 时,Nginx 可以把 CPU 留给真正有事件的连接,所以并发连接数上来后仍然比较稳。Nginx 和 Apache 有什么区别?Nginx 更擅长高并发连接、反向代理和静态资源;Apache 模块生态成熟,动态内容处理能力强。现代架构里常见做法是 Nginx 放入口层,业务逻辑交给 Node.js、Java、Go、PHP-FPM 等后端服务。反向代理和负载均衡分别是什么?反向代理是客户端只访问 Nginx,由 Nginx 转发到真实后端;负载均衡是在多个后端实例之间分配请求。两者经常一起用:Nginx 既隐藏后端地址,也按权重、轮询、IP Hash 等策略分流。实际项目里怎么用?常见链路是“用户 → CDN/云负载均衡 → Nginx → 应用服务”。Nginx 负责入口层的 TLS、路由、缓存、限流和日志;后端只关注业务处理。排查问题时也通常先看 Nginx access.log、error.log 和 upstream 响应时间。写段配置upstream app { server 127.0.0.1:3000; server 127.0.0.1:3001;}server { listen 80; server_name example.com; location /static/ { root /var/www; expires 7d; } location /api/ { proxy_pass http://app; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
前端阅读 05月30日 15:19

Expo 应用如何实现可访问性?有哪些最佳实践?

Expo 的可访问性主要靠 React Native 的 accessibility* 属性实现:给可交互元素补 label、role、hint,用 state/value 表达状态和值,动态变化用 AccessibilityInfo 或 liveRegion 通知读屏,并在 iOS VoiceOver、Android TalkBack 上真机测试。优先保证按钮、图片、表单、弹窗、列表项能被读屏准确读出、能被键盘或辅助触控操作,别只靠颜色传达信息。追问accessibilityLabel、Hint、Role 分别做什么?label 说明“这是什么”,role 说明“它是什么控件”,hint 说明“触发后会发生什么”。状态和值怎么告诉屏幕阅读器?复选框、开关用 accessibilityState;滑块、进度条用 accessibilityValue,提供 min、max、now。实际项目怎么验收?iOS 开 VoiceOver、Android 开 TalkBack,按完整流程走一遍:登录、表单报错、列表操作、弹窗关闭、深色/高对比、减少动画都要测。写段代码<Pressable accessibilityRole="button" accessibilityLabel="删除订单" accessibilityHint="删除后无法恢复"> <Text>删除</Text></Pressable>
服务端阅读 05月30日 12:39

Nginx 常见故障有哪些?如何快速排查?

Nginx 常见故障主要看三类:状态码、连接和性能。502 多半是后端不可用或 upstream 配错;504 是后端响应太慢;403 是权限、目录索引或访问控制问题;404 看 root、alias、tryfiles;413 调 clientmaxbodysize;并发打满就查 worker_connections、文件描述符和后端连接池。排查顺序:先确认现象,再看 error.log,再跑 nginx -t,最后查后端和系统资源。追问502 和 504 有什么区别?502 是 Nginx 连不上或拿不到有效后端响应;504 是连上了但后端超时。403 一定是文件权限问题吗?不一定。还可能是目录没有 index、allow/deny 命中、SELinux 拦截,或 root/alias 写错。响应慢怎么定位?access log 记录 $request_time 和 $upstream_response_time,区分慢在客户端、Nginx、网络还是后端。
服务端阅读 05月30日 12:39

Nginx 常见部署架构有哪些?如何选择?

Nginx 常见部署架构主要有单机、反向代理、负载均衡、多层代理、CDN 源站、高可用、缓存层和 API 网关。选择时先看业务规模:小站用单机;多应用统一入口用反向代理;高并发用负载均衡;怕单点故障用 Keepalived 或云负载均衡;全球访问配 CDN;读多写少加缓存。别一开始就堆复杂架构,出问题时没人知道流量走哪一层。追问反向代理和负载均衡有什么区别?反向代理强调统一入口和转发,负载均衡强调把流量分给多台后端。实际项目里两者通常一起用。高可用架构怎么做?常见做法是两台 Nginx 配 Keepalived 共享 VIP,主节点故障后 VIP 漂移到备节点。云上更常用 SLB/ELB。写段配置upstream backend { server 10.0.0.11:8080; server 10.0.0.12:8080; }location / { proxy_pass http://backend; }
服务端阅读 05月30日 12:39

什么是 Logstash?它的工作原理是什么?

Logstash 是 Elastic Stack 里的服务端数据处理管道,用来采集、解析、转换并转发日志或事件。它的核心模型很简单:Input 负责进数据,Filter 负责处理数据,Output 负责送到 Elasticsearch、Kafka、文件等目标。真正的价值不只是“搬运日志”,而是把杂乱文本变成可检索、可分析的结构化字段。追问Logstash 的三段式流程是什么?Input 从 File、Beats、Kafka、HTTP 等来源读取事件;Filter 用 grok、mutate、date、geoip 等插件加工字段;Output 把结果写到 ES、Kafka、Redis 或文件。Logstash 和 Filebeat 有什么区别?Filebeat 更轻,主要负责边缘采集和转发;Logstash 更重,适合复杂解析、字段清洗和多目标路由。它的主要瓶颈在哪里?常见瓶颈在 Grok 正则、输出端 bulk 写入和队列堆积。
服务端阅读 05月30日 12:39

Logstash Grok 过滤器是什么?如何解析日志?

Grok 是 Logstash 里把非结构化日志拆成字段的过滤器,本质是“命名正则模板”。它用 %{PATTERN:field} 把文本匹配成字段,比如把 Nginx 日志拆出 IP、状态码、请求路径。面试时要说清:Grok 适合解析固定格式文本;解析失败会打 _grokparsefailure;性能上要避免一上来就用 %{GREEDYDATA} 贪婪匹配。追问Grok 和普通正则有什么区别?Grok 是对正则的封装,内置了很多模式,如 IP、NUMBER、TIMESTAMP_ISO8601。解析失败怎么排查?先用 Grok Debugger 验证模式,再看事件里是否出现 _grokparsefailure。写段配置filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:time} %{LOGLEVEL:level} %{GREEDYDATA:msg}" } }}
服务端阅读 05月30日 12:39

Logstash 常用输入插件有哪些?File 和 Kafka 怎么配置?

Logstash 输入插件负责从数据源读取事件,常见的有 File、Beats、Kafka、HTTP、TCP/UDP、Syslog、JDBC、Redis。File 适合读取本机或挂载目录里的日志,Kafka 适合高吞吐、可回放的日志总线。生产里通常让 Filebeat 采集文件,再发给 Logstash;只有需要复杂本地读取规则时,才直接用 File input。追问File input 的 start_position 有什么坑?它只在文件第一次被 Logstash 发现时生效。读到哪里由 sincedb 记录,改成 beginning 不会自动重读旧文件。Kafka input 为什么要配 group_id?同组多个 Logstash 实例会分摊分区,不同组会各自消费一份。写段配置input { file { path => ["/var/log/app/*.log"] start_position => "end" } kafka { bootstrap_servers => "kafka:9092" topics => ["app-logs"] group_id => "logstash-app" }}
服务端阅读 05月30日 12:39

Logstash 常用输出插件有哪些?Elasticsearch 输出怎么配置?

Logstash 输出插件负责把处理后的事件送到目标系统。常见输出有 Elasticsearch、File、Kafka、Redis、HTTP、Stdout;生产里最常用的是 Elasticsearch,通常要配 hosts、index、认证、TLS、失败重试和条件路由。索引名建议按业务和日期拆分,比如 app-%{[service]}-%{+YYYY.MM.dd},不要所有日志都塞进一个大索引。追问Elasticsearch 输出必须配哪些参数?至少配 hosts 和 index。如果集群开启安全认证,还要配 user/password、ssl、cacert。Kafka、File、Stdout 分别适合什么场景?Kafka 适合解耦下游,File 适合落盘备份,Stdout 主要用于调试。实际项目里最容易踩什么坑?动态索引字段为空会生成脏索引,ES 认证或证书错误会导致持续重试。写段配置output { elasticsearch { hosts => ["https://es1:9200"] index => "app-%{+YYYY.MM.dd}" }}
服务端阅读 05月30日 12:39

Logstash 条件判断怎么写?常见操作符有哪些?

Logstash 条件判断写在 filter 和 output 里最常见,用来按字段、标签、正则或数值把事件分流。语法类似 if/else if/else:比较用 == != < > <= >=,逻辑用 and or not,正则用 =~ !~,包含判断用 in、not in。注意条件一般不能放在 input 插件内部,因为 input 阶段事件字段还没生成。追问in 判断字符串和数组有什么坑?"error" in [tags] 是判断标签数组是否包含 error;"err" in [message] 可能变成字符串包含判断。正则匹配适合放很多吗?不适合滥用。大量复杂正则会拖慢 pipeline,高频字段能用精确匹配就别用正则。解析失败怎么处理?利用 _grokparsefailure,再用条件把失败事件打标、落单独索引或输出到排查队列。写段配置filter { if [type] == "nginx" and [status] >= 500 { mutate { add_tag => ["server_error"] } }}
服务端阅读 05月30日 12:39

Logstash 集群如何部署?高可用方案怎么选?

Logstash 本身没有主从式集群,所谓 Logstash 集群通常是多实例横向部署:上游用 Beats 负载均衡、Kafka/Redis 缓冲,或 LB 分发流量;下游写 Elasticsearch。高可用重点不是“选主”,而是让输入可重放、实例可替换、配置一致、队列不丢数据。生产里优先推荐 Filebeat loadbalance + 多 Logstash;流量大或不能丢日志时,在前面加 Kafka,再让多个 Logstash consumer group 消费。追问Beats 直连和 Kafka 缓冲怎么选?Beats 直连简单、延迟低,适合可接受短暂重试的日志链路。Kafka 多一层运维成本,但能削峰、回放、隔离 Logstash 故障。持久化队列能替代 Kafka 吗?不能完全替代。persisted queue 只保护单个 Logstash 节点本地未处理事件,节点磁盘坏了仍可能丢。多节点配置怎么管理?配置放 Git,用 Ansible、K8s ConfigMap 或镜像发布同步。上线前跑 --config.test_and_exit。写段配置queue.type: persistedqueue.max_bytes: 1gbpipeline.workers: 4pipeline.batch.size: 500
前端阅读 05月30日 10:11

Prettier 支持哪些语言和文件类型?

Prettier 原生支持 JavaScript、TypeScript、JSX、TSX、CSS、SCSS、Less、HTML、Vue、Angular、JSON、YAML、Markdown、MDX、GraphQL 等常见前端和文档格式。Java、PHP、Ruby、XML 等也可以通过插件或社区解析器支持。判断能不能格式化,关键看 Prettier 是否有对应 parser。追问Prettier 原生支持哪些文件?常见有 .js、.jsx、.ts、.tsx、.css、.scss、.less、.html、.vue、.json、.yaml、.md、.mdx、.graphql。插件支持和原生支持有什么区别?原生支持开箱即用;插件支持需要额外安装包,团队里要统一依赖版本,否则 CI 和本地结果可能不一致。Prettier 怎么判断用哪个解析器?通常根据扩展名自动选择 parser。识别不了时,可以用 overrides 指定 parser。写段代码{"overrides":[{"files":"*.vue","options":{"parser":"vue"}}]}
计算机基础阅读 05月30日 10:11

什么是 ASCII 编码?字符集范围是多少?

ASCII 是一种用数字表示英文字符和控制符的编码标准。标准 ASCII 使用 7 位二进制,一共能表示 128 个值,范围是 0-127;其中 0-31 和 127 是控制字符,32-126 是可打印字符。它不支持中文,但 Unicode 前 128 个码位与 ASCII 保持兼容,所以它仍是理解字符编码的基础。追问ASCII 的字符范围怎么分?0-31 是控制字符,例如换行 LF、回车 CR、制表 TAB;32-126 是可打印字符;127 是 DEL 删除字符。标准 ASCII 和扩展 ASCII 有什么区别?标准 ASCII 是 7 位,只有 128 个字符。扩展 ASCII 通常使用 8 位,但 128-255 的含义并不统一。ASCII 和 Unicode 是什么关系?Unicode 是更大的字符集。为了兼容历史系统,Unicode 的前 128 个字符和 ASCII 完全一致。写段代码def ascii_type(ch): n = ord(ch) if 0 <= n <= 31 or n == 127: return 'control' if 32 <= n <= 126: return 'printable' return 'non-ascii'
计算机基础阅读 05月30日 10:11

ASCII 码在编程中有哪些常见应用?

ASCII 码在编程里最常见的用途,是把“字符”当成稳定的数字范围来处理:判断字母数字、做大小写转换、过滤可打印字符、解析协议文本,以及处理只允许英文符号的编码场景。它不适合处理中文,但在命令行、HTTP 头、日志、配置、Base64、URL 编码里仍然很常见。追问为什么可以用范围判断字母和数字?因为 ASCII 中数字 0-9 连续排列,字母 A-Z、a-z 也连续排列。大小写转换为什么经常提到 32?标准 ASCII 里大写字母和对应小写字母相差 32。但实际项目更推荐语言内置方法,避免误伤非英文字符。ASCII 在网络协议里还重要吗?重要。很多协议的关键文本部分仍以 ASCII 兼容方式定义,例如 HTTP 方法名、Header 名、状态行、SMTP 命令等。写段代码def is_ascii_digit(ch): return '0' <= ch <= '9'def to_ascii_upper(ch): return chr(ord(ch)-32) if 'a' <= ch <= 'z' else ch
计算机基础阅读 05月30日 10:11

ASCII 码的历史发展过程是怎样的?

ASCII 的发展主线很清楚:为了解决计算机和通信设备各用各的字符表示方式,美国在 1960 年代推动统一标准;后来 ASCII 成为网络、编程语言和 Unicode 的基础。追问ASCII 是什么时候出现的?ASCII 最早在 1963 年由美国国家标准协会发布,目标是统一英文字符、数字、符号和控制字符的编码方式。1967 年修订后,控制字符体系更完整。它为什么会成为标准?早期计算机、打字机、电传设备需要互相通信,如果字符编码不统一,同一个字节就可能显示成不同内容。扩展 ASCII 为什么会带来问题?8 位扩展 ASCII 增加了 128 个字符,但不同厂商和地区定义不一致,推动了 Unicode 的出现。ASCII 现在还有用吗?有。UTF-8 完全兼容 ASCII,很多协议、代码、配置文件仍以 ASCII 字符为基础。
计算机基础阅读 05月30日 10:11

ASCII 码有哪些优缺点?还适合现在使用吗?

ASCII 的优点是简单、稳定、兼容性强;缺点是字符太少,无法支持中文、日文、表情和复杂符号。现在它更像“基础层”:很多协议和编码仍兼容 ASCII,但现代应用通常会直接使用 UTF-8。追问ASCII 为什么说简单高效?它本质上是 7 位编码,只定义 128 个字符。英文、数字、常见符号和控制字符都能用固定 1 字节处理。ASCII 的兼容性好在哪里?几乎所有操作系统、编程语言、网络协议和文件格式都认识 ASCII。Unicode 和 UTF-8 也保留了 ASCII 的 0-127 区间。最大缺点是什么?字符集太小,不能表示中文、日文、韩文、数学符号、表情符号,也不适合国际化软件。扩展 ASCII 能解决问题吗?只能部分解决。不同厂商和地区的扩展版本不统一,反而容易造成乱码。