notes

类型系统

December 24, 2022
typescript

Union type # 基于基本类型构建的新的联合类型 e.g. type C = A | B 传值时: 只能传满足 A 类型或 B 类型的值过来 对值的操作时: 需要进行 type narrow,narrow 到具体的类型后再操作,因为值可能为多种类型。除非 union 的多种类型有共性行为(有行为/属性交集) Intersection type # 用来组合对象类型(interface), intersection 具有被组合 member 的所有属性,对已有的 interface 进行组合,生成新的类型 其他类型 # unknown # unkown 类型值上不允许任何操作 any # any 类型值上允许任何操作,为所欲为 never # 函数抛异常,或者终止程序的执行 void # 函数无明确返回值类型 Type 和 Interface # interface 可以通过 extends 关键字实现继承, type 通过 & 实现继承 ...

CI/CD

December 13, 2022
devops

Github Action # 灰度发布 # 将应用的变更增量推送给用户,避免一次性全量推送带来问题 灰度规则:根据性别,年龄,注册时间,手机号等特定的标识区分用户,推送不同的版本 服务端渲染 # 准备多个版本模板,客户端塞 cookie 标识用户,从灰度规则里判断当前用户应该返回哪个版本的 前后端分离 # 浏览器发请求,根据用户标识获取对应资源版本号 获取对应版本的资源后,再去渲染应用 缺点:较差的用户体验 优点:分散服务器的压力 架构层面 # 接口也需要做灰度 额外部署一个小规模的灰度集群,并通过流量控制,引入部分流量到灰度集群 蓝绿发布 # 理论上,灰度发布的需求都可以用蓝绿发布解决,而且可以更好地解决。 但是我们不能完全用蓝绿发布替代灰度发布,因为应用蓝绿发布期间两个集群同时在线,占用平时两倍的服务器资源,成本很高,而灰度发布只需要很小一部分服务器资源就可以验证大部分问题。 特性分支 #

React

December 13, 2022
react

Philosophy # 告诉我你要(展示)什么,剩下的由框架去做 Concepts # Element # React Element: js 对象,描述需要被渲染的元素,包括其类型及属性;比真实的 Dom element 更轻量 有 class and functional components, host components (DOM nodes), portals 这些类型 Dom Element: type 为 dom type string (e.g. ‘h1’) 的 React Element,用于描述 Dom 节点 Component Element: type 为 Function 或 Class 的 React Element,用于描述 React Component Component: class or function, 接收 props,返回 Element Tree Virtual Dom: 真实 dom 对象的轻量表示 JSX # UI 的声明式描述,可被 Babel 转为标准的 JavaScript 语法 ...

Interpreter

December 12, 2022
plt

Overview # Scanning # Source Code -> Token 词法分析,将源代码的一坨字符串变成有意义的 token 串 Parsing # Token -> AST IR # intermediate representation Code generation # Bytecode # p-code: portable code Each instruction is often a single byte(8 bits) long 供虚拟机执行的代码(指令),而不是真正的机器码,由虚拟机去抹平不同cpu架构的差异 Virtual machine # 执行 bytecode Interpreter # Transpiler # 转译器,例如各种转译为 javascript 的语言 Just in time #

JavaScript 常见题

November 29, 2022
code-question

大数相加 # 思路:从右到左循环去加 /** * js 大数相加 * 字符串拼接,用加法法则计算 * @param { string } a * @param { string } b * @returns string */ function sumBigNumber(a, b) { let res = "", temp = 0; /** @type {string[]} */ const arrA = a.split(""); /** @type {string[]} */ const arrB = b.split(""); while (arrA.length || arrB.length || temp) { // ~~ 将操作数转换成 int temp += ~~arrA. ...

Docker

October 20, 2022
devops

exec # 在 running 的 container 里执行命令 run # 把 image run 起来

OAuth

September 27, 2022
backend

OAuth # Role # Client # 需要获取用户权限的的三方应用,需要用户授权(主动授权,隐式静默授权) Resource server # 获取用户信息的 api 服务 鉴权服务 # 用于用户鉴权,通常跟 resource server 一起,也可独立拆开做鉴权服务 Resource owner # 用户,资源所有者 应用创建 # Redirect URI # Client ID # Client Secret # 需保密,不能暴露给端 Authorization # 获取用户授权 authorization code # 授权码, 通常用于 web server apps 的授权, 因为 client_secret 在服务端使用,是安全的 PKCE # proof key for code exchange,通常用于单页应用 single page apps, 纯 js 应用 ...

Nest.js

September 20, 2022
node

Providers # 提供者,生产者,由 @Injectable() 装饰的类即为 provider 注册 # 在 @Module 里注册,由 Nest IOC runtime 去解析并做依赖注入 (DI) Services # 可做为 provider,实现并提供具体的功能 Controller # 消费者,使用 provider 提供的 service 处理 client 的请求,并返回响应 DTO # Data transfer object 定义数据传输的结构,通过 class 去定义 Module # 由 @Module 装饰的类,nest 利用 @Module 提供的元数据组织应用结构 封装 providers,不属于当前 module 或 imports 里的 provider 无法被实例化 module 不可作为 provider,(避免循环依赖) imports # 导出 provider 给当前 module 使用的 module ...

RxJs

September 8, 2022
js

RxJs # 流式编程库 时序,多值 异步,事件,组合 Observable # 可观察量,流 lazy Push collections of multiple values 懒推送的时序的多值的集合 Higher-Order Observables # of # 将输入直接转为 Observable,不做任何转换 from # 将输入拍平转换为 Observable Observer # 观察者 消费 Observable Operators # 操作符 针对流的转换 concatAll # 按序订阅。串行 switchAll # 仅订阅最新。 花心 mergeAll # 同时,并发订阅。并发 exhaustAll # 仅订阅当前至其结束,期间丢弃新的。 专一 switchMap # map + switchAll 订阅切换,新订阅来值时,取消老订阅。 mergeMap # map + mergeAll ...

设计模式

August 25, 2022
js

Structural Design Patterns # Adapter pattern # 发布订阅 # 观察者模式 #