[
  {
    "path": "Advanced/CS-Basic.md",
    "content": "# 计算机基础\n\n- 并行 并发\n- IPC\n  - 管道\n  - FIFO\n  - 消息队列\n  - 共享存储\n  - 信号量Semaphore\n  - 套接字Socket\n  - 信号Signal\n- 操作系统调度算法\n- 进程 线程 协程 纤程\n- 计算机网络,见网络章节"
  },
  {
    "path": "Advanced/Mini-Program.md",
    "content": "# 小程序\n\n- 基础架构\n- properties / data\n- behavior(封装性)\n- DOM BOM 是如何禁止访问的?\n- 生命周期\n  - 页面级\n  - 应用级\n- 性能优化\n- vs PWA / Hybrid / RN / Flutter ...\n- setState为何表现为数据更新同步UI更新异步?\n- 小程序中的鉴权"
  },
  {
    "path": "Advanced/React.md",
    "content": "# React\n\n- 性能优化\n\n  - pureComponent shallowEuqal\n  - React.memo\n  - 分析问题: React Devtools 的`Highlight Update`与`Profiler`, Chrome 的`Performance`工具\n  - 阻止无意义的重渲染, 通常通过缓存/更新控制(`useMemo`/`shouldComponentUpdate`)\n  - 懒加载(`React-Loadable` & `Suspense` + `React.lazy()`)\n  - 细粒度更新\n  - 谨慎使用 Context 或基于 Context 的数据流方案\n  - 不可变数据\n    - ImmutableJS\n    - ImmerJS(安利下IceStore)\n  - 减少不必要的重新计算, 如`useCallback`与`Reselect`\n  - 虚拟列表\n- 生命周期, 按照顺序, 废弃原因参见 [React16.4 生命周期初探](https://linbudu.top/posts/2020/06/29/react-life-cycle.html)\n\n  - 挂载\n    - **constructor**\n    - **static getDerivedStateFromProps**\n    - **componentWillMount** **已废弃**\n    - **render**\n    - **componentDidMount** 为什么数据获取要在这里? 而不是 WillMount?\n  - 更新\n    - **componentWillReceiveProps** **已废弃**\n    - **static getDerivedStateFromProps**\n    - **shouldComponentUpdate**\n    - **componentWillUpdate** **已废弃**\n    - **render**\n    - **static getSnapshotBeforeUpdate**\n    - **componentDidUpdate**\n  - 错误\n\n  - **static getDerivedStateFromError**, 在页面崩溃时, 与`componentDidCatch`如何搭配降级?\n- 为什么要废弃掉这几个生命周期?\n- 为什么新增的生命周期是静态方法?\n- Hooks\n\n  - useState\n  - useEffect\n    - deps array\n    - 与useLayoutEffect差异\n  - forwardRef & useRef & useImperativeHandle\n  - useCallback\n  - useMemo\n  - React Hooks倒计时(闭包陷阱)\n  - RenderWithHooks &`Render Fewer Hooks Then Expected...`错误\n- Fiber\n\n  - reconciliation\n  - commit\n  - Concurrent Mode\n    - Suspense\n      - Suspense 编排 资源竞态控制 见[聊聊 Concurrent 模式中的 Suspense](https://linbudu.top/posts/2020/07/06/concurrent-suspense.html)\n    - useTransition\n- Redux 与 Mobx 起码熟练一个\n\n  - 源码 看看吧 真不多不难\n  - Redux中间件原理\n  - 其他数据流方案, 如**Dva/Icestore/Hox/Reconciler...**\n- setState\n  - 批处理\n  - 延迟更新\n  - 同步? 异步?\n- React 的合成事件机制(为什么 Class 组件要 bind 方法的原因)\n- V-Dom 与 Diff 算法\n- 与 Vue 的比较\n\n  - 约束 / 迎合开发者\n  - 思想\n- React-Router(Reach-Router)等路由方案\n\n#### Vue\n\n> 实际不止这些 但我不是主要写 Vue 的\n\n- MVVM 原理\n  - Observer\n  - Compile\n  - Watcher\n- Vue 3.0 为什么使用 Proxy? 相比 defineProperty 有什么优势?\n"
  },
  {
    "path": "Advanced/Reality.md",
    "content": "# 业务场景\n\n- 页面优化\n  - 重绘重排\n  - 首屏优化\n  - 缓存\n  - 构建体积\n  - SSR\n  - OPR（离线预渲染）\n- 白屏问题排查\n  - IP 地址\n  - 日志\n  - 路由\n  - 请求返回\n- 骨架屏\n- 超长列表\n  - requesAnimationFrame\n  - 虚拟列表\n- 埋点\n  - 部分埋点\n  - 可视化埋点\n  - 全埋点\n  - 设计埋点 SDK\n- 扫码登陆\n  \n  - 长连接\n- 文件上传\n  - <form /\\> & multipart/form-data & POST\n  - [File MIME](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)\n  - koa-body\n  - 进度监听 xhr.upload.onprogress\n  - 取消 xhr.abort()\n  - 预览 window.URL.createObjectURL\n  - 拖拽上传 dragover drop dragleave drop 事件中 e.dataTransfer.files\n  - 剪贴板上传 contenteditable paste 事件 event.clipboardData(window.clipboardData) getAsFile\n- 大文件上传\n  - Blob.prototype.slice() 文件块标志（时间戳/索引） 合并告知请求 服务端合并文件\n  - TCP 并发控制\n  - 服务端 stream + pipe\n- 断点续传\n  \n  - spark-md5 contenthash webworker，本地保存已上传切片信息，重新上传时比对 hash 值"
  },
  {
    "path": "Advanced/Tool.md",
    "content": "# Tool\n\n### Git\n\n- 暂存区 等基本概念&命令\n- git fetch\n- **git rebase**\n- git merge\n- git reset\n- git revert\n- git branch 相关\n- Git Flow 工作流\n- 场景\n  - 回退\n  - 分支\n  - 清除已提交到暂存区/本地仓库的记录\n\n### Babel\n\n- 工作阶段\n  - 解析 babylon\n  - 转化 babel-traverse\n  - 生成 babel-generator\n- babel-plugin\n- babel-preset\n- babel-polyfill\n- @babel/plugin-transform-runtime\\\n- AST相关"
  },
  {
    "path": "Advanced/Ts.md",
    "content": "# TypeScript\n\n- TS相比于JS多了...?\n  - 类型系统\n  - 预实现的ES提案语法, 如可选链与空值合并\n\n- type 与 interface 的异同\n\n- Class 增强 -> 关键字\n\n- 类型编程\n\n  > 推荐阅读: [TypeScript 类型编程初探](https://linbudu.top/posts/2020/05/30/ts%E7%B1%BB%E5%9E%8B%E7%BC%96%E7%A8%8B%E5%88%9D%E6%8E%A2.html)\n  >\n  > 深入点: [TypeScript的另一面: 类型编程](https://linbudu.top/posts/2020/10/19/typescript%E7%B1%BB%E5%9E%8B%E7%BC%96%E7%A8%8B.html)\n\n  - 泛型\n  - 条件类型\n    - 分布式有条件类型\n  - 映射类型\n  - 索引类型\n  - 类型守卫 & is 关键字\n  - infer\n  - 工具类型\n    - Partical PowerPartical(深层 Partical)\n    - Exclude\n    - Pick\n    - 扩展: 自定义工具类型, 见上面的博客链接\n\n- 装饰器 / IoC 体系\n\n- 声明文件\n\n"
  },
  {
    "path": "Advanced/Webapck.md",
    "content": "# Webpack & Parcel\n\n> Parcel 是可选的\n\n- compiler 与 compilation, Webpack 构建流程\n\n- HMR(`Hot Module Reloading`)原理\n\n- Webpack 构建流程\n\n  - 校验配置文件, 生成本次构建配置及初始化Compiler对象 & Compilation实例\n  - 解析文件,生成依赖关系图, 依次执行loader\n  - 递归解析处理依赖, 生成chunk, 拼接文件\n  - 过程中plugin会在tapable的钩子上被调用\n\n- Plugin生命周期\n- Parcel 构建流程\n\n  - @parcel/transformer-xxx\n  - parcel-plugin-xxx\n\n  - 无配置(内置配置)\n  - 内置依赖, 自动安装缺失依赖\n  - HMR\n\n- Loader\n\n  - 以 Babel-Loader 为例, 讲讲 loader 都做了什么\n  - 常用的 loader\n\n- Plugin\n\n  - plugin 都做了什么?\n\n  - Webpack 事件流模型 [Tapable](https://github.com/webpack/tapable)\n\n- 性能调优\n\n  - 确定问题\n    - bundle-analyzer-plugin\n    - speed-measure-plugin\n\n  - 打包速率\n\n    - 分离Dev与Prod配置!\n\n    - 减少查找时间 \n      - resolve\n        - extension\n        - resolve\n        - alias\n      -  在 loader 中针对性的 exclude 掉无关文件夹, 比如在 url-loader/file-loader 处理图片的配置你就可以把 assets 以外的目录去掉\n    - DLL(`Dynamic Link Library`, 动态链接库, 已经不推荐使用)\n    - 开启多进程打包(thread-loader)\n    - 缓存(babel-loader与terser都有, webpack5默认的是hard-source-plugin)\n    - 合理配置source-map\n\n  - 打包大小\n\n    - 擦除JS&CSS死代码\n\n    - JS/CSS 摇树优化(仅在ESM的静态加载下生效) 按需加载\n    - 压缩 & Uglify(`Terser`)\n    - 代码分割(`Code Spilting`), 讲讲`SplitChunksPlugin`, 讲讲 Dynamic Import\n\n  - chunk hash值 & http缓存配置\n\n  - 打包交互友好度(可选, 但很好玩 hhh)\n\n    - 进度指示(`webpackbar`)\n    - 错误友好提示(`friendly-errors-plugin`)\n\n"
  },
  {
    "path": "Advanced/Wonder.md",
    "content": "# 漫谈\n\n## 跨端\n\n- 运行时跨端 与 编译时跨端\n\n- Remax Kbone Taro Rax...\n\n- Taro原理\n  - 运行时标准\n  - XML类(小程序/H5)与JSX类(RN等)\n  - 生命周期与事件处理函数\n  - 异步API Promise化\n  \n- RN & Weex 生成虚拟DOM，并调用原生控件进行渲染（编译为），即JS调用Native组件\n\n- Flutter \n\n  - 底层是Skia(2D跨平台绘图引擎库), 安卓自带Skia\n  - Why Dart Yes? 性能 Fuchsia 类型安全 安卓上有V8提供Native Binding，但IOS上JSCore就没那么容易了。由Dart可以很好实现Native Binding\n\n## 测试\n\n- 单元测试\n  - Jest\n  - Mocha\n- 集成测试\n  - React-Testing-Library\n  - Enzyme\n- 端到端测试(E2E)\n  - Puppeteer\n\n## 工程化\n\n- 错误监控\n\n  - Sentry 原理, 重写?方法\n  - 你理解的错误监控是如何的? 收集哪些信息? 如何上报?\n    - Web 埋点\n    - 客户端埋点\n\n- 性能优化\n\n  - Webpack\n  - http 缓存\n  - 使用**Performance API**获取应用表现并针对性的进行优化\n  - 针对框架的性能优化, 如上面提到的 React\n\n- 脚手架\n\n  - 如何自建脚手架? -> yeoman\n  - 自建脚手架的思路, 类似 Feflow\n  - Vue-CLI 思路\n\n- GraphQL & BFF & Apollo\n\n  - vs RESTFul 优劣势\n  - BFF 意义, 解决了什么问题?\n  - 接口清洗 聚合 胶水层...\n  - 带来的新问题\n  - **FaaS** + **BFF**! 现在你不需要担心自己的胶水层顶不住流量了\n  - GraphQL-Client, **Apollo** or **Relay**?\n\n- CI / CD, 自动化构建流程解决了什么问题?\n\n  - GitHub Actions\n  - Travis\n  - CircleCI\n\n- Serverless\n\n  - **Serverless 解决了什么问题...?**\n\n  - FaaS\n    - 冷启动 & NodeJS 冷启动优势(V8 JIT)\n    - 即用即毁 & 常驻进程\n    - 触发器\n    - FaaS 分层: 容器 runtime 代码\n    - 横向 & 纵向缩扩容\n  - BaaS\n  - BFF & SFF\n  - Midway-FaaS\n  - 小程序云函数思路\n\n- 前端趋势\n\n  - 智能化 如 Imgcook\n  - 跨端\n    - 5G 物联网带来的影响\n    - Flutter / RN / Taro / Rax / ...\n    - 演进\n  - 前端工程师的自我定位与市场定位\n  - 技能深度 & 广度\n\n- 工程化\n  - 模块化\n    - 以 React 为例, 你的组件模块化思路?\n    - Rax 开发的模块化\n  - 规范化\n    - 各种各样的 Lint\n    - Pre-Commit Hook(`Husky` + `Lint-Staged`)\n    - Code Review\n    - 规范的测试!\n  - 系统化\n    - 微服务\n    - 微前端\n    - Serverless\n    - BFF 中间层\n    - ...\n\n## 新趋势\n\n下一代前端思路? Maybe\n\n- Svelte 和 Sapper\n- Midway-Hooks & RedwoodJS & BlitzJS: 前后端一体化开发  构建时分离"
  },
  {
    "path": "Basic/Browser-WebSafety.md",
    "content": "# 浏览器 & Web 安全\n\n- 浏览器架构\n  - 主进程\n  - 渲染进程(单个Tab, 内有Blink布局引擎 + V8等)\n  - 站点隔离Site Isolation策略\n  - IE8的多进程: 依赖于Windows的DLL\n\n- 事件机制\n  - IE的特殊事件流及监听方式\n  - 捕获 & 冒泡 & 委托\n\n- 跨域与跨站\n\n- 强缓存与协商缓存\n\n  - 优先级\n  - 请求与响应中的缓存相关请求头\n- cache-control private\n  - E-tag 与 Last-Modified 及 if-none-match\n    - 对比: 性能 & 精度 & 优先支持\n  \n- prepload & prefetch(低优先级,在后台下载)\n\n- DNS prefetching <\\link rel=\"dns-prefetch\" />\n\n- 从输入 URL 到页面呈现\n\n  - 构建DOM树\n  - 样式计算\n  - 布局树 布局计算\n  - 分层\n\n  - 图层树 绘制指令 绘制列表\n\n    - 显式提升(显式合成)\n    - 隐式提升(层爆炸)\n  - 层叠上下文\n  - 绘制\n  - 分块\n  - 光栅化 栅格化线程池 位图\n  - 合成显示\n  - 重绘 回流\n  - GPU加速原理\n  - DOM 树与 CSSOM 树建树过程\n    - 令牌化->建树\n    - 样式收集\n  - 阻塞\n    - 加载 js 阻塞 dom\n    - css & js 的加载\n    - 给 js 标签添加 async & defer 的作用\n\n- 操作 DOM 为什么慢?\n\n  - 引擎切换\n\n  - 互斥\n  \n- cookie / session / token\n\n  - Chrome80 默认 cookie samesite 属性为 Lax, 造成的影响?\n    - 推荐阅读: [预测最近面试会考 Cookie 的 SameSite 属性](https://juejin.im/post/5e718ecc6fb9a07cda098c2d)\n    - 啊哦, Chrome83 又把这个属性默认值回滚了(因为考虑到新冠肺炎的影响), 最早恢复也要在 84 版本了(大概七月下旬)\n  - 双令牌机制 `auth_token` & `refresh_token`\n  - cookie session_id\n  - jsonwebtoken 机理\n  \n- 本地存储（web storage）\n\n- service worker（随便了解一些即可）\n\n- requesAnimationFrame\n\n  - 动画的循环时间间隔难以确定, 如果过短会导致浏览器重绘频率极限(16ms).\n  - 定时器只是指示多久以后将动画任务添加到 UI 线程任务队列中,不一定会被立刻执行\n  - rAF: 自动优化性能(不可见时不执行) & 绘制间隔为浏览器刷新频率\n  - 回调会在每一帧保证执行\n  \n- requestIdleCallback（可以在被问到 React Fiber 时提到）\n\n  - 不会保证被执行\n  - 只有在每一帧有空闲时间时间时执行\n  \n- 事件机制\n\n  - 委托发生的阶段\n  - IE 的事件模型\n  - 阻止事件与冒泡\n  - addEventListener 的第三个参数: useCapture\n  \n- RESTFul 规范（URL & 方法 & 请求头...）\n\n- 跨域\n\n  - JSONP 原理\n  - Nginx 原理 与 实际配置\n  - CORS\n    - Options 预检请求\n    - 简单 / 复杂 请求\n    - 相关字段\n  \n- 前端路由原理\n\n  - hash\n    - onHashChange\n  - history\n    - go\n    - push\n    - replace\n    - pushState\n    - replaceState\n    - onPopState\n  \n- XSS\n\n  - 文档型 & 反射型 & 存储型\n  - 防范: httpOnly & 转义 & CSP\n  \n- XSRF\n\n  - GET 型 POST 型 链接类型\n  - 防范: X-XSRF-TOKEN  cookie的samesite属性(Chrome 80 82 84做出的更改)\n  \n- 同源检测\n\n  - origin\n  - referer\n  - 同源检测伪造\n  - axios 的 XSRF 防御手段(X-XSRF-TOKEN)\n  - samesite！\n  \n- Fetch & XHR 对比\n\n  - cookie\n  - abort\n  - 使用`onProgress`监听进度\n  \n- 性能优化指标\n  - **First Pain**: 首次绘制，即页面第一次绘制像素的时间，越快越好\n  - **First Contentful Paint**: 页面第一次绘制文本/图片等非空元素的时间，越快越好\n  - **Largest Contentful Paint**: 视窗内最大元素绘制时间，会随着渲染过程变化（大元素可能会发生改变），会在用户第一次交互后停止记录。官方推荐在**2.5s**内为优秀，**2.5s-4s**为需要改进，比FP与FCP更能体现用户页面体验。\n  - **Time to Interactive**: 首次可交互时间，重要指标，代表页面进入真正可用状态。\n  - **First Input Delay**: 首次输入延迟， FCP与TTI之间用户首次与页面交互时3的响应延迟。\n  - **Cumulative Layout Shift**: 页面非预期位移波动，如影响体验的大块内容插入。\n  - 基于[Lighthouse](https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk)获取指标\n  - 资源大小及加载速度&网络速度：FP FCP LCP\n"
  },
  {
    "path": "Basic/Database.md",
    "content": "# 数据库\n\n- 脏读 / 幻读 / 不可重复读\n- 事务及边界\n- 索引\n- ORM(`Object Relationship Mapping`)的原理"
  },
  {
    "path": "Basic/ES6.md",
    "content": "# ES6 - Next\n\n- let const var\n\n  - 暂时性死区Temporal Dead Zone\n  - 变量提升\n  - 块级作用域\n\n- Number.EPSILON，无误差最小值\n\n- 尾调用优化：单项调用帧\n\n  - 尾递归\n\n- Object:\n\n  - keys()\n  - values()\n  - entries()\n\n- ES6的Class实质, 与ES5继承异同?\n\n  - Babel编译结果分析，见Babel-Playground\n  - 为什么需要先调用`super()`?\n\n- Generator\n\n  - 纤程 & 协程 & 线程 & 进程\n  - yield\n  - co模块\n  \n- Iterator接口\n\n  - 统一的访问接口（`Symbol.iterator`）与排列顺序\n\n  - 供for...of消费\n\n- Symbol类型使用, 一些类库的底层都用它来干什么?\n  \n  - 不可使用new关键字，因为不是对象嘛\n  - 使用for方法, 使用同一个Symbol值\n  - 作为key值, 无法被枚举, 但可以使用`getOwnPropertySymbols()`获取\n  \n- Promise\n\n  - Promise/A+\n\n  - 回调函数延迟绑定\n  - 链式调用\n  - 错误穿透\n  - 状态机制\n  - all race allSettled 及实现\n  - 实现并发限制Promise\n  - finally()\n  - 有一个抛错的promise 在.all中获得正确结果\n\n- Async/Await 的原理\n\n  - NodeJS 14.3.0版本实现的顶级await\n\n- Decorator，建议直接看ts的\n\n- Proxy\n\n  - 为什么Vue抛弃了Object.defineProperty\n  - 元数据 & 元编程\n  - revocable() -> { proxyInstance, revoke }\n    - Immer中的使用\n\n- Reflect\n\n  - 设计目的\n    - 函数式操作\n    - 更合理的行为\n\n  - 与Proxy的结合\n\n- map set\n\n  - map与对象互转\n  - set与数组互转\n\n  - weakMap weakSet\n\n- 其他新增API\n\n- 关于TC39的标准制定过程\n\n  - Strawman\n  - Proposal\n  - Draft\n  - Candidate\n  - Finished\n\n- ES 7/8/9/10 /...\n\n  - Promise.allSettled() resolve与reject都会返回\n  \n  - Dynamic Import: import()\n  \n  - [可选链(Optional-Chaining)](https://github.com/linbudu599/Penumbra) `a?.b?.c`\n  - null判断运算符（空值合并） `null ?? \"default\" `  \n  - 私有变量\n  - 装饰器(ES的实现还没确定下来, 可以看TS的实现)，但是ES现在的装饰器提案感觉越变越诡异了，所以不要以TS的装饰器为准。\n  - 第七种原始类型 `BigInt`\n  - `Array.flat()`\n  - `Object.fromEntries()`\n  - 稳定的`Array.sort()`方法 （稳定：键值相等的对象排序前后顺序相同）\n  - `export * as otherName from \"../xx\"`\n\n"
  },
  {
    "path": "Basic/HTML-CSS.md",
    "content": "# HTML CSS 基础\n\n> 这一块的话，我的个人想法是不需要准备的太细致，大概的知识点足矣。\n\n- 语义化\n- SEO\n- DTD `<!DOCTYPE>`\n- W3C与WHATWG规范\n- Html5新增API\n- DOM/BOM API\n- 常见布局\n  - Flex\n  - Grid\n- Flex布局及容器/子元素属性取值\n  - flex:1 -> ?\n- 优先级\n- 伪类与伪元素\n- 预处理器与后处理器\n- 盒模型\n- CSS3动画\n\n  - GPU加速原理\n- 定位\n\n  - 文档流\n- 子绝父相 blabla...\n- position\n  \n  - 文档流 相对位置\n  \n  - relative\n  - absolute\n  - static\n  - sticky\n- src & href 区别\n- 伪类与伪元素\n  - DOM下状态\n  - 冒号\n- Flex 布局属性及其可取值\n- rem & em & px-> 手淘的Flexible方案, 小程序与Rax的rpx方案\n- BFC / IFC\n- 水平 / 垂直 / 水平垂直居中\n- 预处理器与后处理器\n- reset与normalize.css\n- 移动端\n\n  - 像素比\n  - 检测横屏\n  - 图片模糊问题(`srcset`, 自动选择符合像素比的图片)\n  - 视口类型\n  - vw vh\n  - 1px\n"
  },
  {
    "path": "Basic/HandWritting.md",
    "content": "# 基础手写/算法\n\n> 算法我就帮不上太多忙啦，以下这些，不仅要会基本实现，还要会各个方面的优化版本。\n\n- 原生ajax，axios思路（浏览器与Node中），我有一个仓库是自己实现的axios的http部分，有兴趣的同学可以翻翻，[ts-axios](https://github.com/linbudu599/ts-axios)\n\n- bind / call / apply\n\n- debounce / throttle\n\n- instanceof\n\n- Object.create()\n\n- 花式去重\n\n- 深浅拷贝\n\n- Promise\n\n  - 实现符合Promise/A+规范的Promise\n  - race()\n  - abort()\n  - 并发限制的all()\n\n- lazy man\n\n- new\n\n- 用setTimeout实现setInterval, 为什么要这么做\n\n- 继承\n  \n  - 各种xx式继承\n  \n  - 实现ES6 Class实质的继承\n  \n- 冒泡 / 快排 / 选择 ...\n\n- 观察者与发布订阅模式\n\n- 数组展平\n\n- 实现一个函数，每隔wait秒执行func，一共执行times次\n\n- TS类型编程，可参考[TS类型编程初探]([https://linbudu.top/posts/2020/05/30/ts%E7%B1%BB%E5%9E%8B%E7%BC%96%E7%A8%8B%E5%88%9D%E6%8E%A2.html#%E7%B4%A2%E5%BC%95%E7%B1%BB%E5%9E%8B-%E6%98%A0%E5%B0%84%E7%B1%BB%E5%9E%8B-infer-%E5%85%B3%E9%94%AE%E5%AD%97](https://linbudu.top/posts/2020/05/30/ts类型编程初探.html#索引类型-映射类型-infer-关键字))\n\n- 刷刷leetcode吧...\n\n  - 大数相加\n  - 比较版本号\n  - 回文\n  - 格式化（三位隔一个','）\n"
  },
  {
    "path": "Basic/JS-Basic.md",
    "content": "# JavaScript基础\n\n- 常用设计模式\n  - 单例\n  - 装饰者\n  - 中介者\n  - 观察者\n  - 迭代器\n  - 设计模式的实际应用\n  \n- 装箱 & 拆箱 & 类型转换\n\n- 数据类型判断\n\n  - typeof 基于底层机器码的判断 对于对象不准确(都会显示object)\n- typeof\n  - instanceof 基于原型链的判断 可准确判断Array/Function/Object\n- 对于基本数据类型?\n    - 111 instanceof Number -> false 字面量值(111) 与 实例(new Number())的不同\n- constructor 同样可以理解为基于原型链, 但修改原型会使得结果不准确\n  - **Object.prototype.toString.call()**  最准确的判断 可用于深拷贝中判断数据类型, 返回`\"[object array]\"`这种形式\n  \n- 常用位运算\n  \n  - 位运算在算法中也可以起到让人眼前一亮的作用，如`~~undefined -> 0`\n  \n- 原型与原型链\n  \n  - 原型链的设计初衷\n  \n  - _\\_proto__与prototype\n  \n  - 顶级原型对象Object\n  \n  - Function与Object，鸡生蛋与蛋生鸡问题\n  \n  - 原型链继承与类式继承的本质差异, 二者的同名属性分别会如何起作用?\n  \n    > 两种继承的多态分别如何体现\n  \n  - ES6的Class与原型链的关系(编译结果中静态成员 与 实例成员的添加方式)\n  \n    > 可阅读 [从Babel编译结果看ES6的Class实质](https://linbudu.top/posts/2020/03/25/babel-class.html)\n  \n- 闭包\n  - 实现 & 应用 & 原理\n  - 经典问题 setTimeout + for循环\n  - 尝试使用一句话通俗的讲清闭包概念\n  \n- 执行上下文\n\n  > [搞懂执行上下文+闭包+AO/VO+作用域(链)]([https://linbudu.top/posts/2020/03/17/js%E5%9F%BA%E7%A1%80-%E9%83%A8%E5%88%86.html](https://linbudu.top/posts/2020/03/17/js基础-部分.html))\n\n  - 变量对象(VO)与活动对象(AO)\n  - 调用栈\n  - 作用域链\n  - 扩展: 尾递归优化\n\n- 继承\n  \n  - 寄生组合式继承(组合+原型)\n  \n- 异步 事件循环\n  \n  - 微任务 & 宏任务\n  - 浏览器UI渲染与事件循环?（UI渲染属于哪种任务，它的执行时机？）\n  - async与await在其中的处理\n  - 可扩展至NodeJS的事件循环\n  \n- Promise\n  \n  - 实现Promise(race/all(并发限制版)/abort/allSettled...)\n  - 并行 顺序 中断 Promise\n  - [Promise A+规范](https://segmentfault.com/a/1190000002452115)\n    - 立即resolved的Promise执行时机 >>> 事件循环\n  \n- 垃圾收集\n  \n  - 内存泄漏(如何使用Chrome排查)\n  \n  - 标记清除\n  - 引用计数\n    - 循环引用如何处理?\n  - 扩展 -> ES6的WeakSet与WeakMap设计原因\n  \n- this指向\n  - 作用 & 意义\n  - 隐式丢失\n  - 四种优先级\n  - 箭头函数的this\n  \n- Object.defineProperty() 与 descriptor(修饰符，即可配置(**configurable**) 可写(**writable**) 可枚举(**enumerable**) 及值(**value**))\n\n  - 与 Proxy 差异, 为什么Vue3.0切换到Proxy? 这解决了Vue2.x的哪些问题?\n\n- 模块化\n  \n  - AMD UMD ...\n  - ES Module与CommonJS差异\n    - 语法 & 导入 & 导出 & 加载方式\n    - export default可能存在的问题\n  - **二者对循环引用的处理**\n  - 为什么Webpack使用摇树优化, 需要将Babel编译结果设置为ES6?\n  \n- 其他\n\n  - new操作进行的步骤\n\n  - call & bind & apply\n  - caller / callee\n  - 柯里化(**尾递归优化**) & 函数式编程\n  - 类数组\n  - isNaN() 和 Number.isNaN()\n  - Obejct.is() 的不符直觉的处理（扩展：React的`ShallowEqual`底层对Object.is()进行了优化, 见[shallowEqual.js](https://github.com/facebook/react/blob/a9b035b0c2b8235405835beca0c4db2cc37f18d0/packages/shared/shallowEqual.js)）\n  - 深浅拷贝\n    - ...运算符\n    - JSON.parse(JSON.stringify())\n    - 真-深拷贝\n"
  },
  {
    "path": "Basic/Network.md",
    "content": "# 网络\n\n- 七层与五层模型\n- DNS查找机制\n  \n  - CDN CNAME\n- DNS 负载均衡\n- CDN原理\n- 请求/响应报文\n  \n  - 头 & 主体\n- http1\n  - HTTP队头阻塞 与 TCP队头阻塞 以及解决方式\n    - (非)管道化\n    - http2\n  - 解决方式\n- http1.1 -> http1\n  - 身份认证\n  - 断点续传(206状态码)\n  - 缓存\n  - keep-alive\n- http2 -> http1.1\n  - 多路复用\n  - 头部压缩\n  - server-push\n    - 主动释放\n- https 会话层机制\n  - (非)对称加密算法\n  - 中间人攻击\n  - 证书 数字签名 摘要 公钥\n  - 扩展: 浏览器预置的CA证书链\n- TCP 握手/挥手 过程中出错?\n- 泛洪攻击\n  \n  - RST包\n- TCP/UDP适用场景\n  - QUIC协议(Http3底层)\n  - 为什么DNS使用UDP\n- TCP拥塞控制\n  - 慢启动 & 拥塞避免\n  - 快速重传 & 快速恢复\n- 正向代理与反向代理\n- Get与Post区别\n  \n  - 长度(GET受限实质)\n  - 幂等性\n  - 安全性\n  - 缓存(GET主动缓存)\n  - TCP数据包个数(100 continue)\n- 状态码\n  - 100 101\n  - 200 201 204\n  - 301 302 304\n  - 400 401 403 404 405 413 418 429\n  - 500 501 502 504\n- 轮询 长轮询 长连接 ws"
  },
  {
    "path": "Basic/Node.md",
    "content": "# Node\n\n- Node架构：标准库 - Node Bindings - V8 & Libuv & C-ares & http_parser & zlib...\n\n- GC\n\n  - 标记清除：全部标记 - 清除运行及被运行引用 - 清除带有标记的\n  - 引用计数  循环引用\n\n  - 新生代: Scavenge算法，From空间 To空间\n  - 对象晋升到老生代条件\n\n  - 老生代\n\n  \t- 标记-清除\n\n  \t- 标记整理\n\n  \t- 增量标记\n  \n- 架构\n  - Node标准库（JS）\n  - Node Binding(C++)\n  - **V8** + C-ares + Http-Parser + Zlib + **Libuv**\n\n- 优缺点 适用场景\n\n  - 高性能\n  - 非阻塞I/O + 事件驱动模型\n  - 单线程\n  - 适用于I/O密集型应用，不适用于CPU密集型，因为单线程可能会导致线程卡住\n\n  > Nginx也是事件驱动\n\n- 进程 & 线程，单线程\n\n  - Node创建子进程的方式，这几种方式的底层，异同\n\n    - spawn\n    - exec\n    - execFile\n    - fork\n  \n- `child_process`与`cluster`: 多进程\n\n- worker_threads`: 多线程\n\n- `exports` 与 `module.exports`\n\n- npm install过程\n\n  - 确定首层依赖，以工程本身作为依赖树根节点，Node开启多进程寻找深层节点\n  - 获取模块信息 - 获取模块实体（检查缓存） - 查找是否有依赖 - 递归或回到上一步\n  - dedupe（flat / 扁平化）遍历所有节点，将依赖都放在根节点下，将模块名相同且在兼容范围内的重复依赖去掉，否则留在自己的依赖树里。\n  - 更新node_modules，执行生命周期。\n\n- npm script\n  - pre & post 钩子\n  - npm ci: 根据lock文件安装，且安装确切版本而非计算依赖，加速安装过程。删除已有的模块目录。不会写入package.json\n  - npm i eslint-{plugin-import,plugin-react,loader} express\n  - npm run env -> process.env.xxx\n  - && 串行 与 & 并行\n  - npm docs / npm home / npm repo  导航至文档/仓库\n  - npm dedupe(ddp) 删除重复依赖\n  - npm audit 扫描依赖漏洞 fix: 安装所有漏洞包的补丁版本\n  - npm doctor\n  - npm link 本地调试包\n  - npm list\n  - npm outdated --long / npm outdated -l 列举过时依赖\n\n  - 版本冲突 与 dedupe\n  \n- Buffer\n\n- Stream\n\n  - 可读/可写/可读可写/可转换流\n  \n- 错误优先的回调函数风格\n\n- V8内存管理GC\n\n  - V8内存限制，64位1.4G，32位0.7G（1.5GB执行一次GC需要50ms以上（增量式），甚至可能达到1s（非增量））\n  - Scavenge算法\n\n  - 新生代与老生代机制\n  - From空间与To空间\n  - 标记清除与标记整理\n    - 触发点\n  - 增量标记\n  - 内存泄漏 排查\n    - Express / Koa项目\n\n- Cluster & IPC\n\n  - child_progress\n  - 主从模式\n  \n- Node异步I/O & Libuv工作线程池: Libuv是如何赋予NodeJS高并发能力的?\n\n- 事件循环\n\n  - timer\n  - I/O\n  - Idle prepare\n  - poll\n    - 阻塞\n  - check\n  - close CB\n  - 每一阶段均有的nextTick与microTask\n  \n- Koa\n\n  - vs Express: 异同点 & 各自优势\n  - 中间件原理 与 洋葱模型(Koa-Compose模块)\n  - 选择Koa与选择Express的考量权衡\n\n\n- 服务端渲染(SSR)\n\n  - SEO\n  - 首次有效渲染\n  - **同构**\n  - 数据注水 & 脱水\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Linbudu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# 2020 前端基础知识\n\n> **注意: ** 这份清单里的知识点不包括解答, 因为我感觉如果知识点随着答案一起列出, 那么很容易使得你看过后产生了自己会的 **错觉** , 最好的方式是把这份总结当成知识图谱, 你要做的是根据这些点来构建自己的知识体系, 比如看到一个你能立刻回忆起相关知识.\n>\n> 不提倡以八股文的方式背面经知识点, 前端的知识自有其可爱之处.\n\n## 基础\n\n### [JavaScript 基础](./Basic/JS-Basic.md)\n\n### [HTML & CSS 基础](./Basic/HTML-CSS.md)\n\n### [基础手写/算法](./Basic/HandWritting.md)\n\n### [ES6 基础](./Basic/ES6.md)\n\n### [Node 基础](./Basic/Node.md)\n\n### [浏览器 & Web 安全](./Basic/Browser-WebSafety.md)\n\n### [数据库](./Basic/Database.md)\n\n### [网络](./Basic/Network.md)\n\n## 进阶\n\n### [TypeScript](./Advanced/Ts.md)\n\n### [Tool](./Advanced/Tool.md)\n\n### [Webpack](./Advanced/Webapck.md)\n\n### [React](./Advanced/React.md)\n\n### [业务场景](./Advanced/Reality.md)\n\n### [小程序](./Advanced/Mini-Program.md)\n\n## [漫谈](./Advanced/Wonder.md)\n\n## 巨佬博客链接\n\n- [粥里有勺糖](https://www.sugarat.top/)\n- [艾浩的个人博客](https://sherrybabyone.github.io/)\n- [2NaCl的Java校招面试点总结](https://blog.csdn.net/qq_41936805)\n"
  }
]