摘要:
虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle + hard ,总结了一些刷题常用的模板代码。走过路过发现 bug 请指出,拯救一个辣鸡(但很帅)的少年就靠您啦! 常用函数 包括打印函数和一些数学函数。 阅读全文
摘要:
本人写了五年的后台管理。每次面试前就会头疼,因为写的页面除了表单就是表格。抱怨过苦恼过也后悔过,但是站在现在的时间点回想以前,发现有很多事情可以做的更好,于是有了这篇文章。 本文首发在 https://juejin.cn/post/7360528073631318027 写优雅的代码 一道面试题 大 阅读全文
摘要:
Easy 1. Easy - 4 - Pick 从类型 T 中选出符合 K 的属性,构造一个新的类型 type MyPick<T, K extends keyof T> = { [key in K]: T[key] } keyof 是 TypeScript 中的一个关键字,用于获取一个类型的所有属性 阅读全文
摘要:
完整 demo 和 lib 文件可以在 https://github.com/tengge1/webgl-guide-code 中找到。 第 2 章 WebGL 入门 第一个 WebGL 程序 function main() { // 获取canvas元素 var canvas = document 阅读全文
摘要:
oh-my-zsh nvm command not found 如果你在使用 oh-my-zsh 并且在终端输入 nvm 命令时提示 "command not found",这可能是因为 oh-my-zsh 没有配置 nvm 插件导致的。 首先,确保你已经在系统中安装了 nvm。如果没有安装,请参考 阅读全文
摘要:
关于pod install 慢的要死的问题 解决方法记录 开始时显示ruby有问题,卸载cocoapods重装的 然后启动不起来,到ios目录下执行 pod install 然后太慢尝试设置了域名ip /etc/hosts 151.101.1.194 github.global.ssl.fastly 阅读全文
摘要:
第15章、编译器核心技术概览 15.1 模板 DSL 的编译器 完整的编译包括 [源代码] -->词法分析-->语法分析-->语义分析(编译前端) -->中间代码生成-->优化-->目标代码生成(编译后端) -->[目标代码] 在 Vue 中编译器的工作流程 [模板]-->词法分析-->语法分析-- 阅读全文
摘要:
第14章、内建组件和模块 14.1 KeepAlive 组件的实现原理 KeepAlive 一词借鉴了 HTTP 协议。 KeepAlive 组件可以避免组件被频繁的销毁/重建。本质是缓存管理,再加上特殊的挂载卸载逻辑。 卸载时将组件放入另一个容器中,再次挂载时再拿出来。对应生命周期为 activa 阅读全文
摘要:
第13章、异步组件与函数式组件 13.1 异步组件要解决的问题 用户可以简单通过 import 异步导入组件。 <template> <component :is="asyncComp"> </template> <script> export default { setup() { const a 阅读全文
摘要:
第12章、组件的实现原理 12.1 渲染组件 在渲染器内部的实现看,一个组件是一个特殊类型的虚拟 DOM 节点。之前在 patch 我们判断了 VNode 的 type 值来处理,现在来处理类型为对象的情况。 // n1 旧node n2 新node container 容器 function pa 阅读全文
摘要:
第11章、快速 Diff 算法 11.1 相同的前置元素和后置元素 快速 Diff 算法包含预处理步骤,这借鉴了纯文本 Diff 算法的思路。 先把相同的前缀后缀进行处理,然后再比较中间部分。 function patchKeyedChildren(n1, n2, container) { cons 阅读全文
摘要:
第10章、双端 Diff 算法 10.1 双端比较的原理 上一章的移动算法并不是最优的,比如我们把 ABC 移动为 CAB,如下 A C B --> A C B 按照上一章的算法,我们遍历新的数组,然后定下第一个元素 C 的位置后,后面的 AB 都需要被移动。但是显而易见的,我们其实可以只移动 C 阅读全文
摘要:
第9章、简单 Diff 算法 9.1 减少 DOM 操作的性能开销 在之前的章节,如果新旧子节点的类型都是数组,我们会先卸载所有旧节点,再挂载所有新的子节点。但是如果存在相同类型的节点,我们完全可以复用节点,只修改类型即可。 所以这一节采取就朴素的复用思路,按顺序依次 patch 节点,如果旧子节点 阅读全文
摘要:
第8章、挂载与更新 8.1 挂载子节点和元素的属性 扩展子元素的类型可以为数组,并判断如果是数组的话,就先依次挂载所有的子元素。 同时新增节点属性。属性可以通过 el.setAttribute 添加到 DOM 上,也可以直接在 DOM 对象上设置。 function createRenderer(o 阅读全文
摘要:
第7章、渲染器的设计 7.1 渲染器与响应系统的结合 渲染器需要有跨平台的能力。 在浏览器端会渲染为真实的 DOM 元素。 const { effect, ref } = VueReactivity // VueReactivity 是前几章实现的响应式代码 function renderer(do 阅读全文
摘要:
第6章、原始值的响应式方案 6.1 引入 ref 的概念 既然原始值无法使用 Proxy 我们就只能把原始值包裹起来。 function ref(val) { const wrapper = { value: val, }; Object.defineProperty(wrapper, '__v_i 阅读全文