GithubHelp home page GithubHelp logo

linjiayu6 / fe-notes Goto Github PK

View Code? Open in Web Editor NEW
13.0 13.0 2.0 287 KB

[2020] Front-End Notebook

JavaScript 100.00%
algorithms cache cdn css javascript leetocde network nodejs optimization react security vue

fe-notes's Introduction

Hi there, I'm Lin.JY 🍓

An engineer and explorer. Let's improve everything.

  • 👧 Lin.JY
  • 🔭 Working as Senior FE Engineer @bytedance. former @meituan staff.
  • 🌱 Learning more in domain of Artificial Intelligence, Data Structure.
  • 💬 Ask me about anything, I'm happy to help!
  • 📫 Read more of contact me via Email, Twitter or Wechat.
  • 📚 2022 Goals: Learn something new / Expand knowledge / Alive

Have a fun day!

fe-notes's People

Contributors

linjiayu6 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

fe-notes's Issues

11 - 算法 I

1- 深度优先和广度优先搜索实现 TODO

  • 题外话: React 和 Vue都是深度优先遍历
  • 深拷贝和浅拷贝

3 - React / Redux

React.js

理解数据结构 树和链表 (为什么会有React16+ 版本的大变更)
理解函数式编程 为什么React 和 Redux如此使用
理解数据结构基础上 还要理解 React生命周期变更 / 在Fiber基础上 React Hook等应用
....

[React] 1 - 组件是什么? Virtual Dom?

- 组件是什么?
- virtual dom?
- 简单手写virtual dom创建?

[React] props vs state ?

[React] 2 - 生命周期

- 生命周期?
- 哪些不可以用setState?
(我理解要硬都可以,但看你怎么用,  加个判断条件, 但考虑的肯定是性能方面,尽可能减少不必要的render。只执行一次的生命周期函数肯定是能用,但要考虑到会触发重新render。最好不要在shouldUpdateComponent, WillUpdateComponent 阶段主要是 因为会死循环的。包裹在render() 里面去更新也会。

[React] 3 - 自动绑定 (事件绑定)

- 为什么会需要自动绑定?
- 有什么方法解决?

[React] 4 - setState / 异步还是同步?

- 异步 还是 同步?
- 批量更新意义?
- 更新流程?
- setTimeout / 原生事件里面, 为什么是同步现象?
- 为什么建议传递给 setState 的参数是一个 callback 而不是一个对象?  
因为是异步的更新, callback保证state处理成功后, 回调其他的处理。

[React] 无关平台

不用关心具体运行环境, 可到处运行。 

因为React本质是个UI层的东西, 用js来封装个函数, 产物是个Vnode。 

UI层在小程序 客户端 小程序都是差不多的

[React] 5 - react / react-dom

- import React from 'react'; ???
- import ReactDOM from 'react-dom'; ???

[React] 6 - React Fiber 基于浏览器的单线程调度算法

- React Fiber? 解决什么问题?
- 工作流程?

[React] 7 - 组件通信

1. 父组件传给子组件
2. 子组件传给父组件
3. 类似 Node.js  EventEmitter (注册事件, 调用事件)
4. Context方式 (Provider,  Consumer)

[React] Ref

可以用于获取一个 DOM 节点或者 React 组件的引用

// <h3 ref="vm">2. Virtual Dom</h3>
componentDidMount()
    this.refs.vm.setAttribute('class', 'vmstyle')

    console.log(this.refs.vm)
// 输出 <h3 class="vmstyle">2. Virtual Dom</h3>

[React] super(props)

// super(), 继承父类(React.Component)的this方法,  但无法得到从父组件传的props。

constructor() {
  super()
  // 如果不加上super 
  // 继承的子类不能使用React.Component this
}

// super(props), 使用this, 并得到从父组件传来的props
constructor(props) {
  super(props)
}

[React] 8 - React 自身或工程性能优化点?

[React] 9 - Redux 图解原理

[React] 10 - HOC高阶组件 / React Hook

[React] 11 - diff算法 / 算法简单实现 (15版以下)

[React] 12 - React16 VDOM 链表结构

[React] 13 - SSR / CSR / Isomorphism

15 - Summary

KS ✋

  • 强缓存协商缓存
  • css BFC 清除浮动? 高度坍塌? 怎么解决清除浮动? 什么条件生成BFC?
  • css 盒模型理解
  • 垂直居中布局
  • 隐藏元素方法
  • rem 理解 ? 如何变化? 设计稿给你的是640px, 如何切换。
  • this 绑定
  • 事件循环机制 (浏览器 和 Node端)
  • new都做了什么
  • React 生命周期 (React 16+ 为什么生命周期有变化?)
  • React setState
  • React fiber 理解
  • React hook / useState / useEffect
  • React diff
  • React/Vue 技术选型的依据

编程:

一面是技术leader, 问了很多项目细节 一小时
二面是工作2年的小朋友, 问的问题偏细节
三面是工作5年, 问题更偏还可以吧

// 一面
function Foo() { 
  console.log(1)  
  return this
}

function getName() {
  console.log(4)
}

Foo.getName = function() {
  console.log(2)
  return this
}
var getName = function() {
  console.log(3)
}
// 声明提升
// Foo.getName()  // 2
// getName() // 3
// Foo().getName() // 1, 3
// getName() // 3
// new Foo.getName() // 2 指向Foo内部
// Foo.getName().getName() // 2, 2

curry 问题

// 一面
const add = function(a,b) {
  return a + 1 + b
}
const adder = memorize(add)

adder(1, 2) // 2
adder(2, 3) // 3
adder(1, 3) // 2

14 - 函数式编程

概念

  • 函数式编程 特点是pure function 纯函数 给定相同输入就一定有相同输出
  • 通过高阶函数实现复用

compose 函数组合

概念:  c(b(a('......'))) 先执行的是a, b, c
合成:  解决嵌套多层的问题,  compose([a, b, c])
// 同步事件串联起来 a => b => c
var a = str => str.toUpperCase() + '+'
var b = str => str.split('').join('&')
var c = str => str + 'bye'

c(b(a('abc')))

实现1 reduce / reduceRight

function compose (funcs) { 
  // 或 funcs.reduceRight((prev, curr) => (...args) => prev(curr(...args)))
  return funcs.reverse().reduce((prev, curr) => (...args) => prev(curr(...args)))
}
compose([a, b, c])('abc')

实现2 指针 + 递归

function compose (funcs) { // funcs 所有执行函数队列 [a, b, c]
  var pointer = 0 // 指针概念
  var _len = funcs.length
  var result = null
  return function fn (...args) {
    if (pointer === _len) return result

    result = funcs[pointer].apply(this, args) // 当前执行
    pointer += 1 // 指针 + 1
    return fn.call(this, result) // 继续往下面执行
  }
}

compose([a, b, c])('abc')

10 - JS 2.0

1. ['1', '2', '3'].map(parseInt) what & why ?

  • 结果: [1, NaN, NaN] ??? 满脸问号???
  • parseInt(value, 进制) 默认是10进制
// 展开后
['1', '2', '3'].map((data, index) => parseInt(data, index))
所以 编程了这样
- parseInt('1',  0)  
- parseInt('2',  1)
- parseInt('3',  2)
['10','10','10','10','10'].map(parseInt)
// 结果: [10, NaN, 2, 3, 4]
['1', '2', '3'].map((value) => parseInt(value)) 这样写就没问题了

6 - 网络 / 安全 / 缓存

1 - JavaScript 基础

JS 基础

[JS基础] 1 - 内存空间

- 基本类型, 引用类型
- 变量对象 和 堆内存

[JS基础] 2 - 执行上下文

- JS执行环境: 全局, 函数环境, eval
- 执行栈: 全局在最底下, 函数执行才入栈, 遇到return立刻出栈

[JS基础] 3 - 变量对象 Variable Object

- 函数的执行上下文 Execution Context, 分为两个阶段 创建 和 执行
- 创建阶段 VO: 变量声明,函数声明提升
- 执行阶段 AO (入栈执行)

[JS基础] 4 - 作用域与作用域链 scope / scope chain

- EC创建阶段: VO, 作用域链, this
- EC执行阶段: AO赋值, 其他code .....

[JS基础] 5 - 闭包 Closure

1. 函数执行的地方: Function Call Stack 函数调用栈
2. 在Function Call Stack 函数调用栈里面,存放着可执行上下文EC
3. 执行上下文EC, 告诉函数你周遭的环境是什么样的。
   生命周期有两个:
   - 创建: 又可以简单的理解为 你写代码的环境。主要负责VO, scopechain, this 的声明。
        声明包含函数提升声明 和 变量声明
        变量给它分配个内存空间, 函数或对象类型的是key分配个内存空间,对象类型放到堆内存中。

   - 执行: 负责AO参数赋值, 其他代码执行。

4. 可执行环境分为: 全局环境 和 函数环境。可以简单理解为作用域
   而作用域链是在你写代码阶段已确定的作用域环境。

5. 当EC在执行阶段,会push进函数调用栈,此时当前函数里参数的获取 是按照作用域链创建的来的。
6. 闭包: 我个人理解是作用域链的应用。上级函数保存当前函数执行的内容。

[JS基础] 6 - 执行机制, 同步异步, 事件循环, 宏任务, 微任务

# 事件循环 Event Loop
本质是: 
1. 作为单线程js对于异步事件的处理机制 

2. 或者可以说是 只有一个主线程js的处理逻辑

3. 如何保证主线程, 有序并高效 或非阻塞 的处理呢? => 事件循环机制 Event Loop

4. 异步任务也是有优先级的,分为 宏任务 MacroTask, 微任务 MicroTask

[JS基础] 7 - this, call/apply/bind/箭头函数

1. 在执行上下文 EC 的创建阶段this已经被创建出来了

2. 独立函数运行,this指向函数内部, 但因为非严格模式下,this 会指向window
   对象调用的函数,this指向对象

3. this绑定
   - call, apply
   - bind
   - 利用闭包和apply你自己实现个 bind方法
   - 手动绑定 例如const that = this

[JS基础] 8 - 从 Chrome 看 闭包 / this / 作用域链

闭包的产生条件:

函数a 里 写着函数b。
b执行的时候, 用到了a_EC.VO  a的执行下上文的变量对象。
(要用到人家a里的才产生, 知道window下的不算)

[JS基础] 9 - 函数式编程 Functional Programming

没有完成 TODO

[JS基础] 10 - 构造函数 原型 原型链 继承 new

创建对象
- 工厂模式? 问题是重复分配内存给相同的函数或方法,寻求共享模式。
- 构造函数? 对象私有化
- prototype: 方法共享方式 (其实也是利用引用类型)。
  __proto__: 指针, 某个对象要使用共享方法, 用指针指向该引用类型即可。
  prototype chain: 继承 想共享方法都连在一起。

- 继承? 原理是什么? prototype chain
- new都干了啥? 创建对象,私有内容赋值(this的绑定),指针__proto__指向共享的公共内容

[JS基础] 11 - Promise

[JS基础] 12 - 深拷贝 VS 浅拷贝

1. 值类型 基本类型 or 引用类型?
2. 遍历对象的三个方法及不同? (for - in , Object.keys() ,  Object.getOwnPropertyNames())
3. 浅拷贝?
4. 浅拷贝 + 迭代? code? 问题? 解决?
5. 深拷贝? 
   三种 (JSON, 浅拷贝+循环, 浅拷贝+循环+校验)
6. 会遇到什么问题? 怎么解决?

[JS基础] 13 - 其他 JS 基础

[JS基础] 14 - V8的回收机制 ♻️ / 内存泄露

[JS基础] 15 - 节流 防抖 / Event Bus / new实现

9 - Promise

  • 执行api / 基础题等 / try catch 是否有效等 问题
  • 实现 Promise / Promise.prototype.then
  • 实现 static Promise.race 谁快先返回谁 作业帮 promise.race 当得知返回 如何停止掉其他的请求 写代码
  • 实现 static Promise.all 并行异步
  • 实现 static Promise.resolve / static Promise.reject
  • 实现 串行异步 reduce实现
  • 实现 Promise.prototype.finally 阿里一面🔥🔥🔥🔥🔥
  • 实现 Promise.prototype.catch

13 - Node

1 - 进程 & 线程

【1. 概念】
【进程】 process 资源分配和调度任务。

【单线程】进程(黑盒)是线程thread(工人)容器, 单线程是一个工人干活。
异步任务是走队列的, 同步任务过多占用主进程, 可能会导致线程阻塞, 就是只有一个人干活干太长时间了,其他任务block。

【进程通信】多进程用fork模式, 每个都是隔离独立空间(多造出来几个黑盒)。只能建立IPC通信, 进程间才能共享。
可以利用CPU核数, 创建多个进程。


【2. 模型】
【Node是单线程模型】基于事件驱动/非阻塞模型, 适合高并发场景 高I/O类型。
   原因: 利用事件循环机制,不是启动每个线程为每个请求服务,资源占用较少。
   避免线程创建和切换产生的资源开销。不适合密集计算类型, 会CPU飙升为服务挂掉情况。

   Node处理计算密集型问题: 长时间运行,占用资源,CPU时间片不会释放,后续I/O无法发起。

【Java是个多线程模型】利于密集计算类型。不适合高并发类型。
   原因在于多线程是每来一个请求都要创建线程, 执行期间需要切换线程带来的开销。


【3. 多进程 + 单线程模式 / 解决什么问题?】
- Node是单进程 + 单线程模式, 但是可以利用多核CPU, 多开辟几个进程空间, 就是多雇佣几个工人干活。
=> 扩展 多进程 + 单线程模式
- 多进程不是为了解决高并发, 主要解决的是 Node CPU利用率不足问题, 利用机器多核特性。

对于浏览器来说,为什么设计JS是单线程?

浏览器有 UI线程(渲染引擎是多线程) + JS单线程
UI线程和JS线程互斥,因为JS 会影响UI的,只能是JS空闲,UI才会更新。

假设JS是多线程,那么DOM操作也是多线程,DOM不知道听谁的了,都是leader很混乱。
不如只有一个worker 去调度,异步放到队列里。等待执行。

浏览器对异步机制 有两个队列 micro queue 和 macro queue
只有同步 > micro queue > macro queue 只有当前队列空了,才能走下一步

2 - Common.js Node模块化经历了什么?

Node模块分为: 核心模块 和 文件模块。
核心模块: fs http math ....
文件模块:
const a = require('/src/a.js')
1. 路径分析 '/src/a.js'
2. 文件定位
3. 编译执行

- 核心模块 (例如http, fs)  是直接被写到内存中,这样会二次加载更快。
- 文件模块 (RD写的代码),  运行时动态加载,按照路径分析,定位,再编译执行。

7 - 访问资源链路: CDN / 浏览器渲染机制 / 性能指标等

[FE 资源链路] 1 - 资源访问优化(全量) - CDN加速 / 负载均衡 / 缓存刷新 预热

- CDN基本原理
- CDN节点优化, CDN主站

[FE 资源链路] 2 - 资源访问优化 - 补丁 + 本地缓存

- 资源优化
- 本地缓存 + 补丁模式

[FE 资源链路] 3 - CDN返回资源异常 / 分析 / 解决

- CDN 请求 或 返回资源的异常情况
- 如何解决?

[FE 链路] 4 - 针对整个链路 性能优化

[FE 链路] 5 - 浏览器渲染机制 / reflow repaint / async defer

[FE 链路] 6 - 前端性能指标

- TTFB
- DOM Ready DOM 解析完成
- 首屏 首次渲染FP, 首次有内容渲染FCP, 首次有意义渲染FMP, 最大内容渲染 LCP
- 可操作时间评估
- L onLoadEventEnd 所有资源均请求结束

16 - 关于跨端一些思考记录

前端发展到现在一直绕不开几个方向。

  1. 怎么开发:还是JS那一套,只不过如何高效运行,如何开发更爽,前端工程能力等。
  2. 怎么打包:webpack那一套组织JS。
  3. 编译运行:不是在浏览器运行就是在Native运行,或者 Native + Webview混合运行方式。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.