GraphQL 中非空标记与列表组合(如 [User]、[User!]、[User]!)各自表示什么含义?
GraphQL 中非空标记与列表组合(如 [User]、[User!]、[User]!)各自表示什么含义? 本文先给出可直接复述的结论,再用最小代码说明GraphQL Non-Null 列表 nullability 语义的工作方式、判断依据、项目边界和常见误区。
程序员面试题库第 39 页,收录第 1901–1950 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
GraphQL 中非空标记与列表组合(如 [User]、[User!]、[User]!)各自表示什么含义? 本文先给出可直接复述的结论,再用最小代码说明GraphQL Non-Null 列表 nullability 语义的工作方式、判断依据、项目边界和常见误区。
列表数据频繁增删时 GraphQL 分页如何保证不重复不遗漏? 本文先给出可直接复述的结论,再用最小代码说明GraphQL 分页 数据变动 一致性的工作方式、判断依据、项目边界和常见误区。
GraphQL 游标分页中游标应该如何生成,为什么不能直接暴露数据库主键? 本文先给出可直接复述的结论,再用最小代码说明GraphQL cursor 游标 编码 实现的工作方式、判断依据、项目边界和常见误区。
GraphQL 分页中游标(cursor)分页与 offset 分页各自适合什么场景? 本文先给出可直接复述的结论,再用最小代码说明GraphQL 分页 cursor offset 取舍的工作方式、判断依据、项目边界和常见误区。
GraphQL 持久化查询(persisted queries)解决了哪些生产问题? 本文先给出可直接复述的结论,再用最小代码说明GraphQL persisted queries 持久化查询的工作方式、判断依据、项目边界和常见误区。
GraphQL 查询复杂度(query complexity)如何计算并用于限流或拒绝请求? 本文先给出可直接复述的结论,再用最小代码说明GraphQL 查询复杂度 query complexity 限制的工作方式、判断依据、项目边界和常见误区。
如何防止恶意构造的超深嵌套 GraphQL 查询拖垮服务端? 本文先给出可直接复述的结论,再用最小代码说明GraphQL 查询深度限制 depth limiting的工作方式、判断依据、项目边界和常见误区。
GraphQL 中 Query 与 Mutation 在执行语义上有什么实质区别? 本文先给出可直接复述的结论,再用最小代码说明GraphQL query mutation 区别 串行 并行的工作方式、判断依据、项目边界和常见误区。
Relay Connection 规范中 edges、node、pageInfo 各自承担什么职责? 本文先给出可直接复述的结论,再用最小代码说明GraphQL Relay Connection edges pageInfo的工作方式、判断依据、项目边界和常见误区。
GraphQL resolver 的 context 应该放什么、不应该放什么? 本文先给出可直接复述的结论,再用最小代码说明GraphQL context 设计 用户 数据源的工作方式、判断依据、项目边界和常见误区。
GraphQL resolver 函数的四个参数分别是什么,各自在什么场景使用? 本文先给出可直接复述的结论,再用最小代码说明GraphQL resolver parent args context info 参数的工作方式、判断依据、项目边界和常见误区。
GraphQL 中如何定义和使用自定义标量类型(如 DateTime)? 本文先给出可直接复述的结论,再用最小代码说明GraphQL custom scalar DateTime 序列化的工作方式、判断依据、项目边界和常见误区。
多个 GraphQL 服务合并为统一入口时,schema stitching 与 federation 思路有何不同? 本文先给出可直接复述的结论,再用最小代码说明GraphQL schema stitching federation 网关的工作方式、判断依据、项目边界和常见误区。
GraphQL schema 演进中哪些变更属于破坏性变更? 本文先给出可直接复述的结论,再用最小代码说明GraphQL breaking change schema 演进的工作方式、判断依据、项目边界和常见误区。
GraphQL 开发中 schema-first 与 code-first 两种模式如何取舍? 本文先给出可直接复述的结论,再用最小代码说明GraphQL schema-first code-first 取舍的工作方式、判断依据、项目边界和常见误区。
GraphQL 的 schema 与类型系统由哪些核心部分构成? 本文先给出可直接复述的结论,再用最小代码说明GraphQL schema 类型系统 SDL的工作方式、判断依据、项目边界和常见误区。
GraphQL Subscription 的执行模型是什么,与普通查询有何本质不同? 本文先给出可直接复述的结论,再用最小代码说明GraphQL subscription 订阅 执行模型的工作方式、判断依据、项目边界和常见误区。
GraphQL Subscription 在多实例部署时如何保证事件正确分发? 本文先给出可直接复述的结论,再用最小代码说明GraphQL subscription 水平扩展 发布订阅的工作方式、判断依据、项目边界和常见误区。
GraphQL Subscription 常用哪些传输协议,各自有什么限制? 本文先给出可直接复述的结论,再用最小代码说明GraphQL subscription WebSocket SSE 传输的工作方式、判断依据、项目边界和常见误区。
实时性需求下 GraphQL Subscription 与轮询查询如何选择? 本文先给出可直接复述的结论,再用最小代码说明GraphQL subscription 轮询 实时 取舍的工作方式、判断依据、项目边界和常见误区。
GraphQL 返回 Union 或 Interface 类型时服务端如何确定具体类型? 本文先给出可直接复述的结论,再用最小代码说明GraphQL resolveType union interface 解析的工作方式、判断依据、项目边界和常见误区。
GraphQL 查询中变量(variables)解决了什么问题,为什么不能直接拼接字符串? 本文先给出可直接复述的结论,再用最小代码说明GraphQL variables 变量 注入 安全的工作方式、判断依据、项目边界和常见误区。
<form> 的 accept-charset 指定提交表单时用于编码表单数据的字符编码。现代 HTML 中实际应使用 UTF-8;省略时,浏览器通常按文档的字符编码处理表单提交。
HTML 的 value 内容属性给输入框初始值,DOM 的 input.value 属性表示当前可编辑值。用户输入后,input.value 会更新,而 getAttribute("value") 通常仍是标记上的初始值。
autocomplete 用来提示浏览器和密码管理器字段的用途。登录页现有密码使用 current-password,注册或重设密码使用 new-password,用户名可用 username。
autocomplete 不只是 on 或 off;shipping street-address、cc-number 等 token 会告诉浏览器字段用途和所属分组。填写收货地址与账单地址时,分组前缀能避免值被填错位置;token 顺序和字段名写错也会让自动填充失效。
页面或对话框出现时,autofocus 会让浏览器自动聚焦指定控件,但焦点位置与滚动位置可能因此变化。同一文档里多个候选只会有一个最终焦点;动态对话框打开时,还得考虑滚动位置和键盘、读屏用户是否被突然打断。
在 form 中,button 没写 type 时默认是 submit,点击取消或展开详情按钮也可能触发表单提交。submit、button、reset 的行为不同,非提交按钮要显式标类型;回车提交也不能靠拦截每个点击事件修补。
全选框常见的横杠状态由 DOM 属性 indeterminate 控制,它只是视觉上的混合态,不会替换 checked 布尔值,也不会作为单独值提交。结合三项列表说明如何根据子项重算状态,并提醒刷新或重新渲染后需要再次设置。
颜色输入过去常被认为只接受不透明的 #rrggbb,但当前规范和部分浏览器已支持更多 CSS 颜色语法,并提供 alpha 与 colorspace 属性。还要区分现代能力与兼容性回退,说明颜色选择器 UI 和提交值都需要按目标浏览器验证。
required 输入框在页面刚打开时就可能匹配 :invalid,立即标红会给用户造成“还没填就报错”的体验。:user-valid 与 :user-invalid 更适合在用户交互后显示状态;数值范围控件还可结合 :in-range、:out-of-range 分辨边界错误。
datalist 通过 input 的 list 属性提供候选建议,输入框仍接受列表外的自由文本,不具备 select 的强制枚举约束。候选标签、实际输入值与表单提交值可能不完全相同;若业务只允许已知选项,还需选择受控控件或在服务端校验。
原生 date 控件可能按用户地区显示日期,但它的 value 与表单提交值是 YYYY-MM-DD 形式的日历日期,不含时区和一天内的具体时刻。直接把日期字符串交给 new Date 再按本地时区显示,可能偏移一天;生日与预约时刻需要不同的数据模型。
datetime-local 让用户输入本地墙上时间,value 形如 YYYY-MM-DDTHH:mm,却不附带 UTC 偏移或时区名称。它与拆开的日期、时间字段各有取舍;跨地区预约还必须确定时区,并处理夏令时带来的歧义。
type=email 会做基础地址语法校验,并可配合 required、multiple 与 pattern;它不会验证邮箱真实存在或用户拥有收件权。加号别名和子域名不应被随意拒绝;国际化邮箱有兼容边界,确认所有权仍要发送验证邮件。
比较普通字段、文件分段和纯文本三种表单编码。文件上传常用 multipart/form-data 传递文件内容与字段边界;浏览器会生成 boundary。用 FormData 加 fetch 时不要手写不完整的 Content-Type,也要分清原生提交和脚本请求。
给 fieldset 加 disabled 可以批量禁用后代表单控件,禁用控件不能获得焦点,也不进入正常提交数据。但第一个 legend 内的后代控件是例外。首个组名里的开关可以让用户启用整组;禁用与只读在聚焦、校验、提交上的行为并不相同。
一组相关单选按钮若只靠视觉边框,读屏用户很难知道它们共同回答什么问题。fieldset 建立分组,首个 legend 提供组标题;组标题与各选项的 label 各有分工;占位文本不能代替说明,嵌套分组也要保持清楚。
file 输入的 accept 提示文件选择器显示哪些类型,multiple 允许一次选择多个文件;它们都不是服务器安全边界。扩展名、MIME 类型和通配符只影响选择提示;拖拽或伪造请求仍需由后端检查文件内容、大小和数量。
表单相关控件可用 form 属性指向同一文档中表单的 id,即使 DOM 上不在 form 内也能参与该表单的提交与校验。通过页面底部固定提交栏说明这种用法,强调关联不会自动传给后代控件,且 name、disabled 等规则仍然适用。
FormData(form) 按表单成功控件规则构造名称和值数据,包含已关联的表单外控件和已选文件,却跳过禁用字段与通常没有 name 的控件。复选框、多个同名字段、文件与提交按钮各有收集规则;要包含某个按钮的值还需指定提交者。
同一张表单可以有“保存草稿”和“正式发布”两条提交路径。提交按钮的 formmethod、formaction 会覆盖所属表单的 method、action,只对通过该按钮发起的提交生效。按钮只有作为本次提交者时覆盖设置才生效,服务端还要根据提交者区分草稿与发布操作。
提交按钮的 formnovalidate 能让这一次表单提交跳过浏览器的交互式约束校验,常用于内容未写完也要保存草稿。它不删除 required、pattern 等规则,更不会关闭服务端校验。对比正式发布按钮,可以看清何时适合跳过前端阻断。
type=hidden 的输入不显示也不能由用户直接编辑,但具名且启用时仍会随表单提交。它适合携带记录标识、页面上下文或表单状态,却不是保密或防篡改机制。服务器仍须根据登录身份核对权限;隐藏字段会提交,真正禁用的控件则不会。
input type=image 是以图片呈现的提交按钮,点击时除触发表单提交,还会发送相对图片的点击坐标。无 name 时提交 x、y,具名时变成 name.x、name.y;alt 要说明操作,图片失败时也应可用。
lang 表示字段期望的语言,dir 表示文字的基础书写方向,它们能帮助浏览器和辅助技术理解输入内容,却不能可靠锁定中文或英文输入法,也不会自动改变表单编码。还要区分输入语言、文字方向、虚拟键盘提示与提交方向信息。
显式关联通过 label 的 for 匹配控件 id,隐式关联可把控件嵌套在 label 内;两种方式都能为输入提供可访问名称并扩大点击区域。显式写法要求 for 对应文档里唯一的 id;嵌套控件时通常无需再写 for,一个标签也不应含糊地指向多个输入。
文本输入和 textarea 都可用 minlength、maxlength 约束文本长度,长度按 UTF-16 代码单元而非用户眼中的字数计算。minlength 不等于必填,脚本赋值和用户输入的校验时机不同;浏览器限制编辑也不能代替后端再次检查。
type=month 选择的是年和月,value 采用 YYYY-MM 字符串,不包含具体日期、时刻和时区。min、max 使用同样格式限制范围,step 可按月份递增;还要注意该控件并非所有主流浏览器都有一致的原生选择器,生产环境需测试回退。
number 控件默认步长为 1,合法值以 min、初始 value 或 0 为基准按整步递增。step=0.1 只允许落在该间隔上的值,step=any 则取消步长不匹配约束,但仍受数值格式及 min、max 影响。用 0.2、0.3 等值手算一次,就能看清步长基准怎样改变合法序列。