跳到主要内容

question

整体结构​

核心红线:禁止在 <Answer> 内部使用 Markdown 标题(# ~ ######)

页面的右侧目录(Table of Contents)仅用于导航具体的面试题(即所有 ## 题目)。 在 <Answer> 标签内部,绝对禁止使用任何级别的 Markdown 标题(#、##、###、#### 等)! 如果使用了 ### 核心结论 或 ### 原理解析,Docusaurus 会将其解析为子级目录挂在题目下方,导致右侧 TOC 目录严重污染! 正确做法:答案内部的所有区块分隔必须使用加粗文本且以冒号结尾,例如:

  • **核心结论:** 或 **核心概念:**
  • **原理解析:** 或 **机制说明:**
  • **示例说明:** 或 **规范实现:**
  • **面试官视角:**
  • **延伸阅读:**

标准金牌范例请严格对照:docs/js/type-value。

题目标题拟定黄金法则(什么才叫面试题)

题库的本质是面试模拟与能力定级,绝不是技术手册的章节摘要。严禁生成“知识点拼盘”或“学术论文大纲式”伪题目!

  1. 真实面试口吻(Authentic Voice):题目标题必须是面试官在真实面试中能自然说出口的问题,避免堆砌英文术语和括号注释。
    • ❌ 错误:## 大型超万行前端遗留系统(Legacy)架构腐化治理与渐进式重构(Strangler Fig 绞杀者模式)实战?
    • ✅ 正确:## 面对超万行严重腐化的前端遗留系统,如何用绞杀者模式进行渐进式重构?
  2. 单一职责原则(SRP):每道题只聚焦一个核心考点,严禁用顿号/与/和拼接多个不相关的 API 或概念。
    • ❌ 错误:## Promise.try()、Promise.withResolvers()、Iterator Helpers 与 Set 集合代数?
    • ✅ 正确:拆分为 ## Promise.try() 解决了传统 Promise.resolve().then() 的什么痛点? 等独立真题。
  3. 疑问与情境引导:必须有明确的疑问代词(为什么、如何、区别)或具体的代码反直觉场景(如 0.1 + 0.2 !== 0.3),拒绝陈述句后简单挂问号。

模版的 BNF 范式描述如下

<InterviewQuestion> ::= <HeadingBlock> <DescriptionBlock>? <AnswerBlock>

# ------------------------------
# 题目头部区域(唯一标识 + ID,全站统一使用 ## 与小写 slug)
# ------------------------------
<HeadingBlock> ::= "##" <Title> <Anchor>
<Title> ::= <String>
<Anchor> ::= "{" "#" <Priority> "-" <QuestionID> "}"
<Priority> ::= "p0" | "p1" | "p2" | "p3" | "p4" | "p5"
<QuestionID> ::= <Slug>
<Slug> ::= <Word> ("-" <Word>)*

# ------------------------------
# 可选的题目说明代码区域(如命题代码、HTML结构等)
# 支持普通代码块与 jsx/tsx live 交互式代码块
# ------------------------------
<DescriptionBlock> ::= <CodeBlock> | <LiveCodeBlock>

# ------------------------------
# 答案区域,允许多区块组合(内部严禁使用 # 标题!)
# ------------------------------
<AnswerBlock> ::= "<Answer>" <AnswerContent> "</Answer>"

<AnswerContent> ::= (<BlockSeparator>? <BlockContent>)+

# ------------------------------
# 区块分隔标题:严禁使用 ### 标题,必须使用加粗文本且以冒号结尾
# 例如:**核心概念:**、**原理解析:**、**示例说明:** 等
# ------------------------------
<BlockSeparator> ::= "**" <BlockTitle> ":" "**"
<BlockTitle> ::= <String>

# ------------------------------
# 支持的内容类型
# 可混合任意顺序出现
# ------------------------------
<BlockContent> ::= <Paragraph>
| <MarkdownTable>
| <TipBlock>
| <CodeBlock>
| <LiveCodeBlock>
| <ComponentImport>
| <ComponentUsage>
| <TabsBlock>
| <ReadingList>
| <BulletList>

# ------------------------------
# Markdown 表格
# ------------------------------
<MarkdownTable> ::= "|" <TableHeader> "|" <TableSeparator> "|" <TableBody>+
<TableHeader> ::= <String> ("|" <String>)*
<TableSeparator> ::= "---" ("|" "---")*
<TableBody> ::= <TableRow>
<TableRow> ::= "|" <String> ("|" <String>)* "|"

# ------------------------------
# 提示块(:::tip ... :::)
# ------------------------------
<TipBlock> ::= ":::tip" <MultilineString> ":::"

# ------------------------------
# 代码块(普通代码展示)
# ------------------------------
<CodeBlock> ::= "```" <Language> <Code> "```"

# ------------------------------
# 交互式代码块(Docusaurus live editor)
# 形如:```jsx live / ```tsx live
# ------------------------------
<LiveCodeBlock> ::= "```" <LanguageJSX> " live" <Code> "```"

# ------------------------------
# 段落文本(多行 markdown 格式文本)
# ------------------------------
<Paragraph> ::= <MultilineString>

# ------------------------------
# Bullet 列表(如:面试官视角、关联问题)
# ------------------------------
<BulletList> ::= ("- " <ListItem> "\n")+
<ListItem> ::= <String> ("→" <String>)?

# ------------------------------
# 自定义组件 - 引用代码文件(Raw-loader)
# ------------------------------
<ComponentImport> ::= "import" <Identifier> "from" "'!!raw-loader!" <Path> "';"

# ------------------------------
# 自定义组件 - 代码执行与交互可视化组件:TestCode / Sandpack / CustomSandPack / Visualizer 等
# ------------------------------
<ComponentUsage> ::= <SandpackComponent> | <TestCodeComponent> | <CustomSandPackComponent> | <VisualizerComponent>

<SandpackComponent> ::= "<Sandpack template=" <StringLiteral>
" options=" <OptionsObject>? " files=" <FilesObject> " />"

<CustomSandPackComponent> ::= "<CustomSandPack template=" <StringLiteral>?
" options=" <OptionsObject>? " files=" <FilesObject> " />"

<TestCodeComponent> ::= "<TestCode" (" options=" <OptionsObject>)?
" files=" <FilesObject> " />"

<VisualizerComponent> ::= "<ViteHmrVisualizer />"
| "<StranglerVisualizer />"
| "<ElectronProcessVisualizer />"
| "<AgentTraceVisualizer />"
| "<InpVisualizer />"

# ------------------------------
# 多标签代码演示
# 支持可选 defaultValue;每个 TabItem 内允许混合说明文字、导入、Sandpack 或 TestCode
# ------------------------------
<TabsBlock> ::= "<Tabs" (<DefaultValueAttr>)? ">" <TabItems> "</Tabs>"
<DefaultValueAttr> ::= " defaultValue=" <TabValue>
<TabItems> ::= (<TabItemBlock>)+
<TabItemBlock> ::= "<TabItem value=" <TabValue> ">" (<BlockContent>)+ "</TabItem>"

# ------------------------------
# 阅读推荐项(标题 + 链接)
# ------------------------------
<ReadingList> ::= ("- [" <Title> "](" <URL> ")")+

# ------------------------------
# 代码文件结构定义(用于组件 files 属性)
# 约定:files 的键(文件路径)应以 "/" 开头;值可以是变量(如 raw-loader 导入)或字符串字面量
# ------------------------------
<FilesObject> ::= "{" <FileEntry> ("," <FileEntry>)* "}"
<FileEntry> ::= '"' <Path> '"' ":" (<Identifier> | <StringLiteral>)

<OptionsObject> ::= "{" <OptionKVPair> ("," <OptionKVPair>)* "}"
<OptionKVPair> ::= <Key> ":" <Value>

# ------------------------------
# 基本类型定义
# ------------------------------
<StringLiteral> ::= '"' <String> '"'
<TabValue> ::= <StringLiteral>
<Language> ::= "js" | "ts" | "html" | "css" | "bash" | "json" | "md" | ...
<LanguageJSX> ::= "jsx" | "tsx"
<MultilineString> ::= <String> ("\n" <String>)*
<String> ::= [^"\n]+
<Word> ::= [a-zA-Z0-9_\-]+
<Identifier> ::= <Word>
<URL> ::= <String>
<Path> ::= <String>
<Code> ::= <MultilineString>
<Key> ::= <Word>
<Value> ::= <String> | <Number> | "true" | "false"

问题说明​

先阅读好问题的标准 理解问题是否值得被收录。

元信息​

优先级​

按照面试准备的重要性和时间投入比例,将考察点分为以下优先级:

优先级说明关键性
P0必考知识点,面试必问,涉及核心基础概念必须深入理解并熟练应用
P1高频知识点,经常考察,涉及重要应用场景需要系统掌握并能举例说明
P2常规知识点,偶尔考察,体现知识广度理解基本原理和使用场景
P3进阶知识点,较少考察,体现技术深度了解核心概念和应用价值
P4前沿知识点,极少考察,体现持续学习知道基本概念和发展趋势

对于不同经验层级的优先级关注点

  • 校招生/实习生:

    • 优先级:重点准备 P0-P1,P2 选择性准备
    • 时间分配:P0(50%) > P1(30%) > P2(20%)
    • 重点:基础知识扎实度和编程能力
  • 社招(1-3年经验):

    • 优先级:P0-P2 必备,P3 要有了解
    • 时间分配:P0(30%) > P1(30%) > P2(25%) > P3(15%)
    • 重点:项目经验 + 技术深度
  • 社招(3年以上):

    • 优先级:P0-P3 全面准备
    • 时间分配:P0-P3 平均分配
    • 重点:技术广度 + 架构设计 + 技术决策

其他附属信息​

级别名称含义示例
domain领域指广义的技术范畴,如前端、后端、运维、测试、产品、设计等。目前只涉及前端前端(Frontend)
subject学科专题该领域内的核心技术模块,用于归类不同的技术方向。例如前端工程化(Frontend Engineering)
topic知识点主题具体的知识单元,可以是某个技术、工具或概念。Webpack 构建(Webpack Bundling)
related关联主题该知识点与哪些其他知识点存在关联,适用于学习路径和面试问答关联。Webpack ↔️ ES Module、Vite
prerequisites前置主题该知识点学习前需要掌握的内容,确保知识循序渐进。React 状态管理(需要 React 组件基础)
difficulty难度问题的难易程度,通常分为初级、中级、高级闭包 → 中级
duration预计回答时间回答该问题预计需要的时间,有助于面试官时间安排5分钟
job_type适用岗位问题适用的具体岗位类型前端通用/可视化/工程化等
tags标签该问题的标签,面试官能快速筛选匹配岗位的题目,候选人能按岗位特征刷题JavaScript、CSS、性能优化等

答案说明​

答案规范​

  1. 答案文字长度
    1. 概念/对比:200–300 5 分钟内能够阅读完毕
    2. 编程:代码为主 + 100–200 注释 20分钟内可完成
    3. 设计:400–700(允许结构图/要点表格) 30分钟内可完成
  2. 答案遵循金字塔结构,一句话结论(面试官要的点)、原理解释(为什么)、示例/代码(怎么做)、扩展思考(更高级场景)确保候选人学习高效
  3. 示例代码尽量简洁,确保编写成本 < 20 分钟,不要过于复杂
  4. 答案解析用来说明问题的解决思路,不要过于深入,避免过多细节,通过延伸阅读引导学习者深入学习

不同类型问题的回答策略​

基于对现有学科答案的分析,以下是优化的答案模版结构:

概念类问题​

<Answer>

**核心概念**
- 要点1
- 要点2
- 要点3

**示例说明**

import exampleCode from '!!raw-loader!./answers/example.js';

<TestCode
options={{
showConsole: true,
editorHeight: 400
}}
files={{
"/example.js": exampleCode,
}}
/>

**面试官视角**

该题一般作为面试热身题,帮助面试者快速进入状态,通过此题又可以引出很多知识点,来对面试者能力作进一步下探。

**延伸阅读**

- [相关文档链接](https://example.com)
- [相关书籍推荐](https://book.douban.com/subject/xxx)

</Answer>

编程类问题模版​

<Answer>

import solutionCode from '!!raw-loader!./answers/solution.js';
import solutionTest from '!!raw-loader!./answers/solution.test.js';

<TestCode
files={{
"/solution.js": solutionCode,
"/solution.test.js": solutionTest,
}}
/>

</Answer>

对比类问题模版​

<Answer>

| 方案 | 优点 | 缺点 | 适用场景 |
|:---- |:---- |:--- |:--- |
| 方案A | 优点1 | 缺点1 | 场景1 |
| 方案B | 优点2 | 缺点2 | 场景2 |

**实际应用场景**

结合具体项目经验,说明在什么情况下选择哪种方案。

**延伸阅读**

- [相关技术文档](https://example.com)

</Answer>

设计类问题模版​

<Answer>

**设计思路**

1. 需求分析:明确问题的核心需求
2. 技术选型:选择合适的技术栈
3. 架构设计:设计整体架构
4. 实现细节:关键实现步骤

**示例实现**

import designCode from '!!raw-loader!./answers/design.js';

<TestCode
options={{
showConsole: true,
editorHeight: 600
}}
files={{
"/design.js": designCode,
}}
/>

**优化考虑**

- 性能优化点
- 扩展性考虑
- 维护性考虑

**延伸阅读**

- [相关设计模式](https://example.com)

</Answer>

示例编写​

现有示例模式支持如下几种

内嵌代码片段​

适用场景

简单说明场景,给出核心代码片段进行解释或示例说明

格式

markdown code block 语法,需标注对应语言

示例

function add (a, b) {
return a + b
}

live code​

适用场景

只针对 React 单组件场景,没有任何其他函数依赖的逻辑,

格式

参考 docusaurus 交互式代码

示例

实时编辑器
function counter() {
  const [count, setCount] = React.useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
结果
Loading...

sandpack​

适用场景

提供最小 demo 对概念和场景进行说明。

格式

参考 sandpack 使用

示例

用在使用 html 说明功能的场景,或者使用 ESM 说明指定版本 Vue、React 等框架或工具场景

<style>
   #hello {
      font-size: 2rem;
      color: #2d8cf0;
      margin-bottom: 1rem;
      font-weight: bold;
   }
   #timer {
      font-size: 1.2rem;
      color: #555;
      background: #fff;
      padding: 0.5rem 1.2rem;
      border-radius: 6px;
      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
   }
</style>
<div id="app">
   <div id="hello">{{ message }}</div>
   <div id="timer">定时器: {{ count }} 秒</div>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
   const { createApp } = Vue;
   createApp({
      data() {
         return {
            message: "hello world",
            count: 0
         };
      },
      mounted() {
         setInterval(() => {
            this.count++;
         }, 1000);
      }
   }).mount("#app");
</script>

示例存放与命名规则​

  • 位置:示例文件放在与问题文档同级的 answers/ 目录。
  • 单文件:使用问题 ID 作为文件名,扩展名按类型选择(js/ts/mjs/ html/css/json 等)。例如问题头为 ## ... {#P0-tab-communicate}, 则示例为 answers/tab-communicate.js。
  • 多文件:以问题 ID 作为文件夹名,内部放置最小必需文件集。 例如 answers/tab-communicate/index.js、 answers/tab-communicate/worker.js。
  • MVP 原则:仅保留支撑核心概念的最小代码;在核心逻辑处添加简要注释; 可运行优先(便于 TestCode/Sandpack);避免与核心无关的样板代码。
  • files 用法:在组件 files 中引用时,键需以 / 开头并与导入内容对应。 例如 { "/index.js": demo }。

面试官视角​

每道题附带 评分 Rubric(要点清单 + 加分项)。保证信度,减少面试官主观性。 候选人也能知道什么是标准答案,自我检测更精准。

  1. 差 无法准确回答或有明显错误,不了解基本应用, 一般不会对问题做差的描述
  2. 良 理解核心概念和基本原理,能说明常见应用,但缺乏深度
  3. 优 全面掌握技术原理,能分析实现机制,结合实际场景讨论优化策略

其他规则​

必须包含的区块​

  1. 核心概念/解决方案:直接回答问题的核心要点
  2. 示例说明:提供可运行的代码示例(适用于概念类问题)
  3. 面试官视角:说明该问题在面试中的作用和考察点
  4. 延伸阅读:提供深入学习的方向

可选区块​

  1. 实际应用场景:结合项目经验的具体应用
  2. 性能分析:时间/空间复杂度分析(算法题)
  3. 优化策略:进一步的优化思路
  4. 常见陷阱:容易出错的地方和注意事项
提示

一个好的面试答案需要逻辑清晰、内容全面、结合实际。通过上述模版,候选人可以根据问题类型组织答案,展示自己的技术深度和实际经验,同时满足面试官对背景、使用方法、原理和实际应用的考察需求。