规范化
前端标准(基础)
编码规范
eslint
- tslint
- stylelint
- 命名规范
- Pascal 大小写
- 组成标识符的每个单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求全部大写
- Camel 大小写
- 标识符的首字母小写,每个后面连接的单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求它们出现在标识符首部时全部小写,否则全部大写
- 匈牙利命名法
- 变量名 = 属性 + 类型 + 对象描述
- 常量的命名
- 常量的名字应该都使用大写字母,并且指出该常量完整含义
- 目录规范
- commit提交规范
- commitiizen
- cz-customizable
- commitlint
- 文档规范
- 接口规范
- 流程规范
- gitflow
基础构建优化
压缩
校验
资源合并
打包构建工具
包管理工具
模块化
JS模块规范
模块规范
AMD
CMD
CommonJS
ES6+ Module
模块加载机制原理
CSS模块化
css预处理器
Less
Sass
Stylus
css Module
css in JS
模块设计
组件化
组件化标准
组件设计
组件设计
资源管理
脚手架
搭建本地开发环境
搭建本地mock环境
自动化构建
引入单元测试
部署发布
监控
行为监控
异常监控
性能监控
运行时监控
网络请求速率
系统性能
本地工作流
云平台工作流
角色划分
自动化构建与部署
持续集成与持续交付
IDE云平台开发
Chrome
Element 标签页
Network 标签页
Source 标签页
TimeLine 标签页
Profiles 标签页
Resource 标签页
Audits 标签页
Console 标签页
firefox插件Firebug
IE的开发者工具
IETest
IE浏览器版本切换工具
Emmet
JSON 格式化和校验工具
Postman
移动端抓包调试
web服务
express
koa
hapi
sails
tsw
Meteor
Feathers
Keystone
Loopback
egg
Daruk
uma
模板引擎
前端打包
任务管理
单元测试
包管理
守护进程
单线程
Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的
非阻塞I/O
由于Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。所以,这是一种特别有哲理的解决方案:与其人多,但是好多人闲着;还不如一个人玩命,往死里干活儿。
事件驱动event-driven
在Node中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。
Node.js底层是C++(V8也是C++写的)。底层代码中,近半数都用于事件队列、回调函数队列的构建
底层架构
v8 engine
libuv
builtin modules
native modules
node函数调用机制
网络协议
http/https
tcp
udp
数据序列化协议
json
protocol buffer
接口协议
restful apis
Graphql
RPC
网络序/本地序
数据库
MySql
MongoDB
Oracle
MSSQL
PostreSQL
MariaSQL
缓存
消息队列
RabbitMQ
Kafka
zmq
server render
websocket
单例模式
适配器模式
装饰模式
观察者模式
简介
特点
声明式
高效
灵活
生命周期
constructor
componentWillMount
componentDidMount
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
componentDidUpdate
componentWillUnmount
React思想
组件编写顺序
1.组件划分原则
2.编写静态组件
3.分析State
哪些是State
State保存的位置
mock方式
Redux思想
使用redux是在解决什么问题
State
Action
普通Acion
异步Action
异步action的创建
拓展reducer
集成redux-thunk
Reducer
Store
redux-devtools
React-Redux思想
使用react-redux是在解决什么问题
功能
容器性组件和展示性组件
流程图总结
React-Router
服务端路由和客户端路由的区别
BrowserRouter和HashRouter区别
路由渲染组件的三种方式
全新思维
架构设计基础
React+Redux项目结构组织方式
type(按照类型)
定义
特点
优点
缺点
function(按照功能模块)
定义
特点
优点
缺点
Ducks(鸭子类型)
定义
特点
三种设计Redux-State的依据
API为依据
定义
缺点
UI为依据
定义
缺点
数据库基本原则为依据
架构设计进阶
selector函数
使用selector是在解决什么问题
selector带来的好处
redux中间件(Middleware)
redux增强器(Enhancer)
Enhancer的写法
Enhancer和Middleware的关系
架构设计高级
reducer如何返回新的state对象
Object.assign
ES6扩展语法
Immutable
Immutable的常规使用
Immutable的优化
Immutable的选择考虑
Reselect
使用Reselect是解决什么问题
Reselect的常规使用
Reselect的选择考虑
React Hooks
特性
Hooks API
useState
useEffect
useLayoutEffect
useReducer
useCallback
useMemo
useContext
useRef
未完待续…
JS变量
变量声明
声明
陋习
提倡
作用域
全局变量
包含
调用
局部变量
包含
调用
优先级
特性
忽略块级作用域
全局变量是全局对象的属性
局部变量是调用对象的属性
作用域链
生命周期
全局变量
局部变量
回收机制
JS数据类型
undefined
null
boolean
true为真false为假
true不一定=1 false不一定=0
使用Boolean()进行转换
转换为true
转换为false
string
特性
0个或多个16位Unicode字符组成
单引号与双引号不能交叉使用
使用.length属性访问字符串长度
字符串一旦被创建,其值将不能改变,若要改变必须销毁原有字符串
转义序列
类型转换
toString()
使用类型
参数
String()
evel()
number
进制
浮点数
小数点后至少一位数字
科学计数法
最高精度
缺陷
数值范围
最小值
Number.MIN_VALUE
最大值
Number.MAX_VALUE
超出范围
正无穷
负无穷
缺陷
检测方法
isFinite()
NaN
含义
特性
检测
isNaN()
数值转换
Number()
Boolean
true
false
null
undefined
String
只包含数字
包含有浮点格式
包含有效十六进制数
空字符串
其他字符串
object
object
定义
声明
属性与方法
constructor
hasOwnProperty
isPrototypeOf
propertyIsEnumerable
toLocaleString
toString
valueOf
未完待续…
基础类型
string
同JavaScript用"或者’标识字符串
number
数组
number[]
Array<元素类型>
数字
boolean
Tuple
enum
Any
Void
Null 和 Undefined
Never
Object
接口
特殊符号
可选
只读
签名
字符串型签名
数组型签名
如果同时使用那么数组型签名的返回值必须是字符串型签名的子类的返回值
对象型接口
普通模式
配合签名使用的option模式
函数型接口
参数
返回值
类类型接口
特点
构造函数的控制方式
接口继承
类class
定义了一件事物的抽象特点,包含它的属性和方法
ES6类的使用
属性和方法
类的继承
静态方法
TypeScript类的使用
三种访问修饰符
public
private
protected
抽象类
类的类型
类实现接口
函数
有可选参数的函数
有默认参数的函数
有剩余参数的函数
声明文件
场景
什么是声明语句
假如我们想使用第三方库 jQuery,一种常见的方式是在 html 中通过
简介
特点
易用
灵活
高效
Vue思想
Vue API
应用API
component
config
directive
mixin
mount
provide
unmount
use
全局API
createApp
h
defineComponent
defineAsyncComponent
resolveComponent
resolveDynamicComponent
withDirectives
createRenderer
nextTick
options
Data
data
props
computed
methods
watch
emits
DOM
template
render
生命周期
beforeCreate->setup()
created->setup()
beforeMount->onBeforeMount
mounted->onMounted
beforeUpdate->onBeforeUpdate
updated->onUpdated
activated
deactivated
beforeUnmount(3.0)->onBeforeUnmount
unmounted(3.0)->onUnmounted
errorCaptured->onErrorCaptured
renderTracked(3.0)->onRenderTracked
renderTriggered(3.0)->onRenderTriggered
选项/资源
directives
components
实例property
$data
$props
$el
$options
$parent
$root
$slots
$refs
$attrs
实例方法
$watch
$emit
$forceUpdate
$nextTick
指令
v-text
v-html
v-show
v-if
v-else
v-else-if
v-for
v-on
v-bind
v-model
v-slot
v-pre
v-cloak
v-once
v-is
特殊指令
key
ref
is
内置组件
component
transition
transition-group
keep-alive
slot
teleport
响应式API
响应式基础API
reactive
readonly
isProxy
isReactive
isReadonly
toRaw
markRaw
shallowReactive
shallowReadonly
Refs
ref
unref
toRef
toRefs
isRef
customRef
shallowRef
triggerRef
Computed和watch
computed
watchEffect
watch
组合式API
setup
一个组件选项,在创建组件之前执行,一旦 props 被解析,并作为组合式 API 的入口点
props
context
生命周期钩子
Vuex
Vue-router
Vue-SSR
Vue-Loader
Vue-Cli
通过 @vue/cli 实现的交互式的项目脚手架。
通过 @vue/cli + @vue/cli-service-global 实现的零配置原型开发。
一个运行时依赖 (@vue/cli-service)
Cli
Cli服务
CLI 服务 (@vue/cli-service) 是一个开发环境依赖。它是一个 npm 包,局部安装在每个 @vue/cli 创建的项目中。
CLI 服务是构建于 webpack 和 webpack-dev-server 之上的
Cli插件
Vue-Devtools
vue-class-component
第一阶段是混合开发的web容器时代
第二阶段是以RN和Weex为代表的泛web容器时代
第三阶段是以Flutter为代表的自绘引擎时代
为什么要引入hybrid开发
优劣势
原生APP
优点
缺点
Web APP
优点
缺点
Hybrid APP
优点
缺点
整体架构
viewLayer(视图层)
H5
Native
coreLayer(通信层)
自定义webview资源拦截管理器
定义页面跳转管理器
定义混合通信交互模块
交互设计
交互原理
两种交互
交互过程(OC)
搭建JS调用OC的桥梁,注册供JS调用的方法name
JS在调用Native注册方法
Native接收JS调用,解析处理,返回回调
通信方式
假跳转的请求拦截(不建议)
假跳转的请求拦截 就是由网页发出一条新的跳转请求,跳转的目的地是一个非法的压根就不存在的地址
比如:wbcst://testhost/action?params=xxx
模拟http协议网络请求 scheme://host/action?params
客户端会无差别拦截所有请求,真正的url地址应该照常放过,只有协议域名匹配的url地址才应该被客户端拦截
JS调用方式
不建议使用,android系统对url参数做了字节限制,无法进行大数据的通信
弹窗拦截(不建议)
alert
confirm
prompt
不建议使用,会无差别的拦截所有前端的window弹窗
JS上下文注入(推荐)
iOS
android
特点
简介
特性
设计理念
优势
劣势
风险
环境搭建
架构设计
Native
Bridge
JavaScript
组件及布局
核心组件
原生组件
style
RN编写的应用的样式不是靠css来实现的
而是依赖javascript来为你的应用来添加样式
样式声明
依赖导入
调用React-Native的一个构造方法
传入一个对象生成style
和React的React.createCladd()语法是一样的,传入对象的key就相当于类名,每个类也是一个对象,可以配置各种样式参数
注意
示例
样式使用
外部引入
设置多个属性类
行内样式
flexBox布局
什么是FlexBox布局
弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”
旨在通过弹性的方式来对齐和分布容器中内容的空间,使其能适应不同屏幕,为盒装模型提供最大的灵活性
布局思想
Flex布局基于flex-flow流
水平的主轴(main axis)
垂直的交叉轴(cross axis)
项目默认沿主轴排列,单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size
属性
4个容器属性
flexDirection
flexWrap
justifyContent
alignItems
2个项目属性
flex
alignSelf
UI渲染
模块注入
RN模块注入
RN模块运行入口
AppRegistry
AppRegistry常用方法
registerConfig
registerComponent
registerRunnable
runApplication
入口组件注册
加载jsbundle文件运行应用
页面启动UI渲染
UI控件渲染流程
RCTRootView runApplication:bridge
RCTBatchedBridge _processResponse:json error:error
RCTBatchedBridge batchDidComplete
RCTUIManager createView:viewName:rootTag:props
[RCTUIManager _layoutAndMount]
[RCTUIManager setChildren:reactTags:]
[RCTRootShadowView insertReactSubview:view atIndex:index++]
[RCTShadowView processUpdatedProperties:parentProperties:]
[RCTView didUpdateReactSubviews]
完成UI渲染
通信机制
OC生成一张模块配置表,包含所有模块和模块里的方法,根据特定的标识宏(RCT_EXPORT_MODULE()),将可以暴露的方法暴露给JS
通信流程
导航路由
StackNavigator
用来跳转页面和传递参数
参数
navigation
navigate
跳转到其他页面
routeName
params
action
示例
state
当前页面导航器的状态
params
key
routeName
setParams
this.props.navigation.setParams({param:'i am the new param'})
goBack
返回
goBack()
goBack(null)
goBack(‘pathName’)
dispatch
TabNavigator
DrawerNavigator
拆包
目的
jsbundle组成
头部(Polyfills)
中部(Module定义)
尾部(Require调用)
拆包方案
diff and patch
修改RN的bundle命令打包流程,使得直接生成common+business包
修改RN的unbundle命令,生成common+business包
使用metro拆包
基础包和业务包打包
抽离公共组件到base.js
base.js入口打包
index.js入口打包
差异包打包
business.jsbundle基于common.jsbundle打差异包
实现思路
热更新
Flutter发展历程
简介
框架
Framework
Engine
纯 C++实现的 SDK
包括
它是 Dart的一个运行时,它可以以 JIT 或者 AOT的模式运行 Dart代码
这个运行时还控制着 VSync信号的传递、GPU数据的填充等,并且还负责把客户端的事件传递到运行时中的代码
Embedder
Embedder是操作系统适配层
实现了
组件渲染
图像显示的基本原理
显示器的CRT电子枪从上到下一行行扫描,扫描一行完成之后,显示器上就显示一帧画面,随后电子枪回到初始位置继续下一次扫描
水平扫描时,显示器会发出一个水平同步信号(HSync)
而当一帧画面绘制完成之后,电子枪恢复原位,准备下一次扫描之前,显示器会发出一个垂直同步信号(Vsync)
显示器以固定的频率刷新,这个刷新率就是Vsync信号产生的频率
图像的显示需要CPU、GPU和显示器一起配合完成
CPU把计算好的需要显示的内容交给GPU
由GPU完成渲染后放入帧缓冲区
随后视频控制器根据垂直同步信号(Vsync)以每秒60次的速度
从帧缓冲区读取帧数据交由显示器完成图像显示
Flutter绘制原理
渲染流程
渲染流程1
UI界面绘图流程
user Input
Animation
Build
Layout
Paint
Composite
Restorize
Dart语言(基础)
简介
应用方向
移动端开发
浏览器端
服务器端
环境配置
手动安装
配置环境变量
在vscode中安装Code Runner插件,来调试我们的dart代码
安装stagehand
创建dart项目
获取依赖包
常用内置类型
String
Numbers
Booleans
Lists
Maps
变量声明
var
dynamic
Object
final
const
函数
类class
使用类成员
使用构造函数
构造函数
抽象类
包管理
Dart的软件包管理器是pub。
托管软件包的存储库可以在https://pub.dartlang.org/ 找到
每个Dart应用程序都有一个pubspec.yaml文件,包含了项目依赖包配置 类似package.json
操作命令
库
自定义库
系统内置库
pub包管理系统中的库
Widget与Element
什么是Widget
Element
基础Widget
StatelessWidget
StatefulWidget
State
一个StatefulWidget类会对应一个State类,State表示与其对应的StatefulWidget要维护的状态
State中的保存的状态信息可以
常用属性
widget
context
生命周期
StatefulWidget launched
initState
didChangeDependencies
build
它主要是用于构建Widget子树的
会在如下场景被调用
reassemble
didUpdateWidget
deactivate
dispose
StatefulWidget destoryed
基础组件
Text
Image
Container
布局类组件
线性布局
弹性布局
流式布局
层叠布局
对齐与相对定位
简介
特点
框架结构
CSS框架
JavaScript框架
命令行/CLI
基本布局
交互通信
简介
架构
Web APP端
config.xml
CLI初始化项目在主目录下生成
包含了整个app的一些基本信息
Resources
HTML、JS、CSS
cordova.js核心代码
exec
pokeNative
nativeCallback
callbackFromNative
Native端
cordova webview 引擎具体实现
CDVViewController
CDVUIWebViewEngine
容器初始化以及plugin初始化
JS&Native通信
通信原理
通信方式
插件导入流程
Native
JS
内容层面
DNS解析优化
避免重定向
切分到多个域名
杜绝404
网络传输阶段
减少传输过程中的实体大小
减少请求的次数
异步加载
预加载、延后加载、按需加载
渲染阶段
脚本执行阶段
大前端时代前端监控的新变化
大前端时代有哪些变化
前端变化给监控带来了什么样的改变
SPA模式下的PV统计问题
技术升级、体验升级、PV下降?
原因
解决办法
首屏统计
第一阶段:自定义打点时期
第二阶段:W3C标准时期
W3C性能小组引入了 Navigation Timing API 帮我们自动,精准的实现了性能测试的打点问题
Navigation Timing API
第三阶段:SPA盛行导致W3C标准失去原来的意义
现阶段:用户感官指标FMP
前端监控的最佳实践
主动监控
慢会话追踪
搜索报错明细
出错行为还原
58北斗监控实现
XMind - Trial Version