# web_advance_train
**Repository Path**: giserChan/web_advance_train
## Basic Information
- **Project Name**: web_advance_train
- **Description**: 极客时间-前端进阶训练营
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-09-05
- **Last Updated**: 2021-12-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 前端进阶训练营
> 介绍
本文档为该课程学习的学习内容总结。
> 课程总结大纲
+ 浏览器原理学习
+ 重学JavaScript
+ 前端发展方向
+ 组件化
+ 工具链
+ 发布系统
> 课程内容总结
### 一、浏览器原理(toy-browser)

> 步骤总结:以toy-browser为例,浏览器从输入一个url,到将html渲染为一张图片的过程
+ 按照http协议的标准,解析http response,提取body部分的html字符串
+ 解析html。拆分文件,解析标签,通过创建token,处理html字符串的属性,利用栈的数据结构,构建dom树。
+ 计算css属性绑定到dom树的每一个节点
+ 以flex布局为例,根据浏览器属性进行排版,根据主轴尺寸,把元素分进行,计算主轴和交叉轴。
+ 利用images的npm包,绘制一个viewport上进行,相关的属性包括background-color、border、background-image等。
> 详细步骤
1. [http解析](https://gitee.com/chj_home/web_advance_train/blob/master/week01/HTTP%E5%8D%8F%E8%AE%AE.md)
2. [html解析](https://gitee.com/chj_home/web_advance_train/blob/master/week02/1.html-parse/HTML%E8%A7%A3%E6%9E%90.md)
3. [css计算](https://gitee.com/chj_home/web_advance_train/blob/master/week02/2.css-computing/CSS%E8%AE%A1%E7%AE%97.md)
4. [css排版](https://gitee.com/chj_home/web_advance_train/blob/master/week03/3.layout/CSS%E6%8E%92%E7%89%88.md)
5. [css绘制](https://gitee.com/chj_home/web_advance_train/blob/master/week03/4.render/CSS%E7%BB%98%E5%88%B6.md)
### 二、重学JavaScript
#### 1. 语言学
+ 非形式化语言
+ 自然语言
+ 形式化语言
+ 乔姆斯基谱系
+ 0型 无限制文法
+ 1型 上下文有关文法
+ 2型 上下文无关文法
+ 3型 正则文法
+ 产生式
#### 2. 产生式
+ 终结符
+ 非终结符
+ BNF(巴克斯诺尔范式)
+ 终结符""
+ 非终结符<>
+ ::= "B"| "C"
+ 乔姆斯基谱系
+ 0型 ? ::= ?
+ 1型 ?? ::= ??
+ 2型 ::= ?
+ 3型 ::= ?
+ 计算机语言
+ 词法3型
+ 词法2型
+ HTML Parser
#### 3. Toy-JS产生式
+ 词法
```js
InputElement ::= WhiteSpace | LineTerminator | Comment | Token
WhiteSpace ::= " " | " "
LineTerminator ::= "\n" | "\r"
Comment ::= SingleLineComment | MultilineComment
SingleLineComment ::= "/" "/" *
MultilineComment ::= "/" "*" ([^*] | "*" [^/])* "*" "/"
Token ::= Literal | Keywords | Identifier | Punctuator
Literal ::= NumberLiteral | BooleanLiteral | StringLiteral | NullLiteral
Keywords ::= "if" | "else" | "for" | "function" | ......
Punctuator ::= "+" | "-" | "*" | "/" | "{" | "}" | ......
```
+ 语法
```js
Program ::= Statement+
Statement ::= ExpressionStatement | IfStatement | ForStatement
| WhileStatement | VariableDeclaration | FunctionDeclaration
| ClassDeclaration | BreakStatement | ContinueStatement
| ReturnStatement | ThrowStatement | TryStatement
| Block
ExpressionStatement ::= Expression ";"
IfStatement ::= "if" "(" Expression ")" Statement
TryStatement ::= "try" "{" Statement+ "}" catch "(" Expression ")" "{" Statement+ "}"
Block = "{" Statement "}"
Expression ::= AdditiveExpression
AdditiveExpression ::= MultiplicativeExpression
| AdditiveExpression ("+" | "-") MultiplicativeExpression
MultiplicativeExpression ::= UnaryExpression
| MultiplicativeExpression ("*" | "/") UnaryExpression
UnaryExpression ::= PrimaryExpression
| ("+" | "-" | "typeof") PrimaryExpression
PrimaryExpression ::= "(" Expression ")" | Literal | Identifier
```
#### 4. JS标准中的产生式
+ 词法规则ECMA-262 703页

#### 5. Toy-JS流水线

##### 5.1 编译原理之语法分析
+ Token -> 语法树
+ LL(k)
+ LR(k)
> 第一个L代表从左边开始扫描
> 第二个L表示产生式从左到右推导,R代表产生式从右到左归约
> 数字K表示每一步只需要向后看k个符号
##### 5.2 语法分析之LL
+ 自顶向下生成语法树
##### 5.3 语法分析之LR
+ 自下向上生成语法树
+ 构建方法:
+ 构造分析表,建立转移函数
+ 移进(shift) - 归约(reduce)
##### 5.4 JS标准中的产生式
+ 词法规则ECMA-262 717页

##### 5.5 运行时
+ 代码执行时内存的状态 -> 环境
+ 数字 123
+ 字符串 "abc"
> a. JS运行时之Number
> + 标准IEEE 754
> + 8字节 64位
> + 1个符号位
> + 11个指数位 以2为底数
> + 52个小数位
> + 1个隐藏整数位 值为1
> + 注意会有误差
>
> b. 运行时之String
> + 字符
> + 字体
> + 码点
> + 字符集
> + ASCII
> + Unicode
> + GBK
> + Big5
> + 编码方式
> + UTF-8最小以一个字节表示一个字符
> + UTF-16最小以两个字节表示一个字符
#### 6. 语法 && 运行时
##### 6.1 JS标准中的Number(ECMA-262 706页)
+ 十进制 123 1.23 1.23*10^3
+ 二进制 0b101
+ 八进制 0o127
+ 十八进制 0x12AD
##### 6.2 JS标准中的String(ECMA-262 707页)
+ "abc" 'abc' `abc`
+ 转义
##### 6.3 JS标准中的其他类型
+ Boolean true false
+ Null null
+ Undefined 不是关键字,是全局变量 void 0
+ Object 有结构
+ ObjectLiteral
+ ArrayLiteral
+ RegularExpressionLiteral
+ Symbol不能直接写出 用构造器构建
##### 6.4 对象Object
+ 认识世界的方式 客观概念
+ 对象
+ 标识符id 唯一性
+ 状态 描述对象
+ 行为改变自身状态
+ 面向对象编程
+ 基于类class
+ 基于原型prototype
+ 《面向对象分析与设计》
##### 6.5 JS中的对象
+ id内存地址
+ Property状态和行为
+ key
+ String
+ Symbol
+ Value
+ Data value
+ Accessor ger/set
+ [[prototype]]
+ 对象引用
+ 构成原型链
+ 特殊对象
+ Function[[call]]
+ Array[[length]]
+ Host[[call]] [[construct]]
##### 6.6 JS运行时中的ExecutionContext(执行上下文)
+ Variable Environment
+ Lexical Environment
+ Outer
+ This

##### 6.7 语法结构层级
+ Atom
+ Identifier
+ Literal
+ Expression
+ AdditiveExpression
+ CallExpression
+ MemberExpression
+ ... ...
+ Statement
+ IfStatement
+ ForStatement
+ VariableDeclaration
+ ... ...
+ Structure
+ Funciton
+ Class
+ ... ...
+ Program
+ Program
+ Moudle
+ Libary
+ ... ...
> a. 基本类型转换
> 
>
> b. 语句的完成记录
>
> c. 作用域
> + 静态
> + 作用域链
> + 获取变量的顺序
### 三、前端发展方向
#### 1. 组件化
+ 组件的基础知识
+ Property & Attribute & State & Config
+ Event & LifeCycle
+ 搭建JSX框架
+ Animation库
+ Timeline & Animation
+ Gestrure库
+ Listener & Detector & Dispatcher
+ Carousel组件
+ 同时支持动画和手势
+ Button & List
+ Children
#### 2. 工具链

##### 2.1 初始化工具
+ yeoman
+ Generator的Generator
+ 过程
+ 安装npm install
+ 构建目录结构和文件
+ Prompt
+ 文件系统
+ 依赖系统
##### 2.2 打包
+ webpack
+ 针对js的打包
+ 安装webpack和webpack-cli
+ 配置文件config.js
+ babel
+ ES6 -> ES5
+ 安装@babel/core cli 和 preset
+ 配置文件.babelrc
##### 2.3 测试
+ Mocha
+ 单元测试
+ 安装mocha
+ 构建test目录和文件
+ nyc
+ 测试覆盖率
+ 安装nyc
+ 配置.nycrc
#### 3. 发布系统
##### 3.1 实现一个线上web服务
> + 初始化机器配置环境
> + 安装虚拟机 VirtualBox
> + 安装操作系统
> + 安装node和npm
> + 线上服务系统 + 代码部署系统
> + 线上服务系统
> + 安装express
> + 初始化项目
> + 修改并测试项目
> + 把系统部署到server端
> + 启动线上服务
> + 代码部署系统
> + 纯nodejs
> + 初始化项目
> + http createServer
> + 把系统部署到server端
> + 启动线上服务
> + 发布工具系统
> + 纯nodejs
> + 初始化项目
> + http request
> + Github OAuth
> + 注册GitHub app得到ID和Secret
> + 获取code -- 接口authorize
> + 获取token -- 接口access_token
> + 传输token
> + 获取身份认证 -- 接口user
> + 发布代码
+ 初始化server
+ 购买服务器
+ 开虚拟机
+ Oracle VM VirtualBox
+ 利用Express,编写服务器
##### 3.2 实现一个发布系统
+ 用node.js启动一个简单的Server
+ 编写简单的发送请求功能,实现文件流的传输
+ 简单了解Node.js的流式传输
+ fs.createReadStream()
+ 改造Server,实现多文件的发布
#### 4. 持续集成
> + pre-commit
> + ESlint检查代码
+ 学习发布前检查的相关知识
+ 学习Git Hooks的基本用法
+ 学习ESlint基本用法
+ 学习ESlint API及其高级用法
+ 使用无头浏览器检查DOM