❶ 前端规范一(命名规范)
前端规范一(命名规范)
1、小驼峰命名法(lowerCamelCase) :第一个单词以小写字母开始,第二个单词的首字母大写,例如:firstName、lastName。
2、大驼峰命名法(CamelCase) :每一个单词的首字母都采用大写字母,例如:FirstName、LastName。
3、下划线命名法(snake_case):下划线命名法也叫蛇形法,全由小写字母和下划线组成,在两个单词之间用下滑线连接。例如:first_name。
4、中划线命名法(kebab-case):中划线命名法也叫串式命名法,各个单词之间通过下划线“-”连接。例如:first-name。
强制使用:中划线命名法
命名规则:1、文件名不得含有空格
2、文件名建议只使用小写字母,不使用大写字母
3、文件名包含多个单词时,单词之间建议连词线 ( - ) 分隔
4、有复数结构式,要使用复数
示例:login 、 error-page、 icons
强制使用:全部大写字母
为了醒目,某些说明文件的文件名,可以使用大写字母
示例:README
补充说明: README 标准
◎ 项目简介。
◎ 注意事项。
◎ 线上的示例地址(测试、正式)。
◎ 支持运行的环境。
◎ 必要的依赖准备,以及如何搭建。
◎ 项目的安装指南。
◎ 相关的文档链接。
◎ 相关人员的联系方式。
README.md 示例:
强制使用:小驼峰命名法
命名规则:前缀为动词,见名知意
1、onXxx 监听事件的回调
2、handleXxx 处理事件
3、getXxx 获取某个值
4、setXxx 设置某个值
常见场景:
a、事件处理:
(1).事件主动监听采用 onXxx ,被动处理使用handleXxx
示例:onXxxSubmit: '提交表单'
handleXxxSizeChange: '处理分页页数改变'
handleXxxPageChange: '处理分页每页大小改变'
onXxxKeydown: '按下键'
(2). 其他命名:元素+click、 元素+change、select+范围
示例:selectAllXxx: '选择所有'
xxxCellClick: '当某个单元格被点击时会触发该事件'
xxxSortChange: '当表格的排序条件发生变化的时候会触发该事件'
b、增删改查处理:
增: addXxx 添加子项
createXxx 创建大项
删: deleteXxx 真删除
removeXxx 伪删除
改:updateXxx
查: getXxx 获取原始数据需要修改
fetchXxx 原始数据
示例:getUserList: '获取用户列表', fetchToken: '取得Token', deleteUser: '删除用户', removeTag: '移除标签', updateUserInfo: '更新用户信息', addUser: '添加用户', createAccount: '创建账户'
c、API接口函数:
get: getXxxApi
post: postXxxApi
patch: patchXxxApi
delect: delectXxxApi
域名:xxxUrl
一般属性变量 强制使用:小驼峰命名法
1、布尔值
命名规则:前缀为判断性动词
hasXxx 判断是否含有某个值。true:含有此值; false:不含有此值
isXxx 判断是否为某个值。true:为某个值; false:不为某个值
示例:isShow: '是否显示', isLoading: '是否处于加载中', hasToken: '是否包含Token',
2、数组命名
命名规则:使用名词+List组合
示例: userList: '用户列表'
3、私有属性变量
命名规则:前缀为下划线(_)后面和变量命名一样。
4、枚举变量 \textcolor{red}{强制使用:大驼峰命名法}
枚举的属性使用全大写字母,单词间用下划线隔开。
示例:let TargetState = { READING: 1, READED: 2, APPLIED: 3, READY: 4 };
5、常量: 强制使用:使用全大写字母,单词间用下划线隔开
强制使用:大驼峰命名法
命名规则: 可参考vue官网风格指南
例如: 1、按照功能来命名
2、应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V。
3、组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。
示例:components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
强制使用: 中划线命名法
命名规则:
1.class、id 、标签、属性的命名应该尽量精短、明确,必须以字母开头命名,且全部字母为小写,单词之间统一使用中划线 “-” 连接
2.class必须代表相应模块或部件的内容或功能,不得以样式信息进行命名。
3.元素 id 必须保证页面唯一。
4.禁止创建无样式信息的 class
示例:
1、尽量不要缩写、简写的单词。除了 template => tmp、message => msg、image => img、property => prop 这些单词已经被公认的缩写
2、可读性强的命名优先于简短的命名
3、命名长度最好在 20 个字符以内,避免多长带来的阅读不便
4、命名要有具体的含义,避免使用一些泛指和无具体含义的词
5、不要使用拼音,更不要使用中文
6、正则表达式用 Exp 结尾
7、ref:使用Ref结尾
❷ Web前端中关于url、href、src的知识汇总
今天小编要跟大家分享的文章是Web前端中关于url、href、src的知识汇总。熟悉web前端的小伙伴们一定不会对这三个内容陌生。但是对于刚刚接触web的小伙伴肯定不是很了解,今天小编就败漏租为大家准备了这篇文章让我们一起来看一看关于url、href、src的知识汇总。
一、URL的概念
统一资源定位符(或称统一资源定位器/定位地址、URL地址等,英语:UniformResource
Locator,常缩写为URL),有时也被俗称为网页地址(网址)。如同在网络上的门牌,是因特网上标准的资源的地址(Address)。
二、URL的格式
2.1标准格式
协议类型:[//服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询
2.2完整格式
协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询
其中【访问凭证信息@;:端口号;?查询;#片段ID】都属于选填项。
三、URL的语法规则
比如网址#/html/index.asp,必须遵守以下的语法规则:
scheme://host.domain:port/path/filename
3.1说明
(1)scheme-定义因特网服务的类型。最常见的类型是http(2)host-定义域主机(http的默认主机是www)
(3)domain-定义因特网域名,比如w3school.com.cn(4):port-定义主机上的端口号(http的默认端口号是80)
(5)path-定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。(6)filename-定义文档/资源的名称
3.2URLSchemes
以下是其中一些最流行的scheme:
Scheme访问用于...
http超文本传输协议以http://开头的普通网页。不加密。
https安全超文本传输协议安全网页。加密所有信息交换。
ftp文件传输协议用于将文件下载或上传至网站。
file您计算机上的文件。
四、URL的类型
4.1绝对URL
绝对URL(absoluteURL)显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。
4.2相对URL
相对URL(relativeURL)以包含URL本身的文件夹的位置为参考点,描述目标文件夹的位置。
一般来说,对于同一服务器上的文件,应该总是使用相对URL,它们更容易输入,而且在将页面从本地系统转移到服务器上时更方便,只要每个文件的相对位置保持不变,链接就仍然是有效地。
以下为建立路径所使用的几个特殊符号,及其所代表的意义。
(1).:代表目前所在的目录,相对路径。如:文本或
(2)..:代表上一层目录,相对路径。如:文本或
(3)../../:代表的是上一层目录的上一层目录,相对路径。如:
(4)/:代表根目录,绝对路径。如:[文本](/abc)或
五、href的概念
5.1规范解释
href(Hypertext
Reference)指定网络资源的位置,从而在当前元素或者当前文档和由当前属性定义的需要的锚点或资源之间定义一个链接或者关系。
5.2通俗理解
href目的不是为了引用资源,而是为了建立联系,让当前标签能够链接到目标地址。
六、src的概念
source(缩写),指向外部资源的位置,指向的内容将会应用到文档中当前标签所在位置。
七、href和src的区别
7.1请求资源类型不同
(1)href指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的联系。
(2)在请求src资源时会将其指向的资源下载并应用到文档中,比如JavaScript脚本,img图片;
7.2作用结果不同
(1)href用于在当前文档和引用察兆资源之间确立联系;
(2)src用于替换当前内容;
7.3浏览器解析方式不同
(1)若在文档中添加,浏览器会识别该文档为CSS文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式加载
CSS,而不是使用@import方式。
(2)当浏览器解析到
,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等也如此,类似于将所指向资源应用到当前内容。这也是为什么建议把js
脚本放在底部而不是头部的原因。
八、link和@import的区别
两者都是外部引用CSS的方式,但是存在一定的搜州区别:
(1)link是XHTML标签,除了能够加载CSS,还可以定义RSS等其他事务;而@import属于CSS范畴,只可以加载CSS。
(2)link引用CSS时,在页面载入时同时加载;@import需要页面完全载入以后再加载。
(3)link是XHTML标签,无兼容问题;@import则是在CSS2.1提出的,低版本的浏览器不支持。
(4)link支持使用Javascript控制DOM改变样式;而@import不支持。
以上就是小编今天为大家分享的关于Web前端中关于url、href、src的知识汇总的文章,希望本篇文章能够对正在从事web学习和工作的小伙伴们有所帮助,想要了解更多web相关知识记得关注北大青鸟web培训官网哦~
作者:WEBING
#/a/1190000013845173
*声明:内容与图片均来源于网络(部分内容有修改),版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
❸ Web前端开发知识点之JavaScript的介绍与语法
今天小编要跟大家分享的文章是关于Web前端开发知识点之JavaScript的介绍与语法。正在学习web前端相关知识的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助。
一、JavaScript介绍
JavaScript是一门客户端脚本语言,是适应动态网页制作的需要而诞生的一种编程语言。这门语言可用于HTML和web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。
在HTML基础上,使用Javascript可以开发交互式Web网页,可以增强用户和HTML页面的交互过程,可以控制HTML元素让页面有一些动态的效果,增强用户的体验。
JavaScript使有规律地重复的HTML文段简化,减少下载时间。
二、JavaScript语法
①与HTML的结合方式
JavaScript与HTML的结合方式有两种,一种是内部JavaScript,一种是外部JavaScript,定义的方式与CSS类似。
内部JavaScript需要定义一对
外部JavaScript也需要定义一对
注意:JavaScript可以定义在HTML页面的任何地方,但是定义的位置会影响执行的顺序。而且可以在HTML文档中放入不限数量的脚本。通常的做法是把函数放入
②注释
JavaScript的注释与java相同,一种是“//”单行注释,一种是“/**/”多行注释。例如
//这是单行注释
/*
这是多行注释
这是多行注释*/
③数据类型
JavaScript的数据类型包括两大类:原始数据类型和引用数据类型。
原始数据类型包括:
·number数字:包括整数、小数和NaN(notanumber不是数字的数字类型)
·string字符串
·boolean布尔型:包括true和false
·null:一个对象为空的占位符
·undefined:未定义
引用数据类型就是指对象类型。
④变量
所谓变量就是一小块存储数据的内存空间。java语言是强类型语言,在开辟变量存储空间时就定义了存储数据的类型,而且只能存储固定类型的数据;JavaScript是弱类型语言,在开辟变量存储空间时不定义存储数据的类型,可以存储任意类型的数据。
声明变量用var关键字,例如:
vara=3;
我们可以使用typeof运算符获取变量的类型。
⑤运算符
JavaScript中的运算符与java中的基本一致,大家可以参考这个链接复习一下,接下来我再说说JavaScript里比较特殊的运算符。
在说运算符之前先说一个注意事项:在JavaScript中如果运算数不是运算符所要求的的类型,那么JavaScript引擎会自动将运算数进行类型转换。
因此在JavaScript中1=="1"的结果是true,那么我想让他的结果是false该怎么办呢?所以JavaScript引入了新的运算符全等于(===),此时1==="1"的结果就是false了。
⑥流程控制语句
JavaScript中流程控制语句包括if...else...、switch、while、do...while...、for等,语法规则与java中完全一致,点击上方关键词可查看java语法规则。
⑦特殊语法(不建议)
JavaScript语句以;结尾,如果一行只有一条语句则;可以省略。
变量定义是使用var关键字,也可以不使用。
以上就是小编今天为大家分享的关于Web前端开发知识点之JavaScript的介绍与语法的文章,希望本篇文章能够对正在从事web前端工作和学习的小伙伴们有所帮助,想要了解更多web前端知识记得关注北大青鸟web培训官网,最后祝愿小伙伴们工作顺利,成为一名优秀的web前端工程师。
文章来源:原创凯哥的故事凯哥的故事
❹ 整理涵盖很全很广的前端知识点
HTML、CSS相关
html5新特性、语义化
浏览器渲染机制、重绘、重排
网页生成过程:
重排(也称回流): 当 DOM 的变化影响了元素的几何信息( DOM 对象的位置和尺寸大小),浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。 触发:
重绘: 当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。 触发:
重排优化建议:
transform 不重绘,不回流 是因为 transform 属于合成属性,对合成属性进行 transition/animate 动画时,将会创建一个合成层。这使得动画元素在一个独立的层中进行渲染。当元素的内容没有发生改变,就没有必要进行重绘。浏览器会通过重新复合来创建动画帧。
css盒子模型
所有 HTML 元素可以看作盒子,在CSS中, "box model" 这一术语是用来设计和布局时使用。 CSS 盒模型本质上是一个盒子,封装周围的 HTML 元素,它包括:边距,边框,填充,和实际内容。 盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。
css样式优先级
!important>style>id>class
什么是BFC?BFC的布局规则是什么?如何创建BFC?BFC应用?
BFC 是 Block Formatting Context 的缩写,即块格式化上下文。 BFC 是CSS布局的一个概念,是一个环境,里面的元素不会影响外面的元素。 布局规则:Box是CSS布局的对象和基本单位,页面是由若干个Box组成的。元素的类型和display属性,决定了这个Box的类型。不同类型的Box会参与不同的 Formatting Context 。 创建:浮动元素 display:inline-block position:absolute 应用: 1.分属于不同的 BFC 时,可以防止 margin 重叠 2.清除内部浮动 3.自适应多栏布局
DOM、BOM对象
BOM(Browser Object Model) 是指浏览器对象模型,可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。 使 JavaScript 有能力与浏览器"对话"。 DOM (Document Object Model) 是指文档对象模型,通过它,可以访问 HTML 文档的所有元素。 DOM 是 W3C (万维网联盟)的标准。 DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。" W3C DOM 标准被分为 3 个不同的部分:
什么是 XML DOM ? XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。 什么是 HTML DOM? HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
JS相关
js数据类型、typeof、instanceof、类型转换
闭包(高频)
闭包是指有权访问另一个函数作用域中的变量的函数 ——《JavaScript高级程序设计》
当函数可以记住并访问所在的词法作用域时,就产生了闭包,
即使函数是在当前词法作用域之外执行 ——《你不知道的JavaScript》
原型、原型链(高频)
原型: 对象中固有的 __proto__ 属性,该属性指向对象的 prototype 原型属性。
原型链: 当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就是我们新建的对象为什么能够使用 toString() 等方法的原因。
特点: JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。
this指向、new关键字
this 对象是是执行上下文中的一个属性,它指向最后一次调用这个方法的对象,在全局函数中, this 等于 window ,而当函数被作为某个对象调用时,this等于那个对象。 在实际开发中, this 的指向可以通过四种调用模式来判断。
new
作用域、作用域链、变量提升
继承(含es6)、多种继承方式
(1)第一种是以 原型链的方式来实现继承 ,但是这种实现方式存在的缺点是,在包含有引用类型的数据时,会被所有的实例对象所共享,容易造成修改的混乱。还有就是在创建子类型的时候不能向超类型传递参数。
(2)第二种方式是使用 借用构造函数 的方式,这种方式是通过在子类型的函数中调用超类型的构造函数来实现的,这一种方法解决了不能向超类型传递参数的缺点,但是它存在的一个问题就是无法实现函数方法的复用,并且超类型原型定义的方法子类型也没有办法访问到。
(3)第三种方式是 组合继承 ,组合继承是将原型链和借用构造函数组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继承。这种方式解决了上面的两种模式单独使用时的问题,但是由于我们是以超类型的实例来作为子类型的原型,所以调用了两次超类的构造函数,造成了子类型的原型中多了很多不必要的属性。
(4)第四种方式是 原型式继承 ,原型式继承的主要思路就是基于已有的对象来创建新的对象,实现的原理是,向函数中传入一个对象,然后返回一个以这个对象为原型的对象。这种继承的思路主要不是为了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5 中定义的 Object.create() 方法就是原型式继承的实现。缺点与原型链方式相同。
(5)第五种方式是 寄生式继承 ,寄生式继承的思路是创建一个用于封装继承过程的函数,通过传入一个对象,然后复制一个对象的副本,然后对象进行扩展,最后返回这个对象。这个扩展的过程就可以理解是一种继承。这种继承的优点就是对一个简单对象实现继承,如果这个对象不是我们的自定义类型时。缺点是没有办法实现函数的复用。
(6)第六种方式是 寄生式组合继承 ,组合继承的缺点就是使用超类型的实例做为子类型的原型,导致添加了不必要的原型属性。寄生式组合继承的方式是使用超类型的原型的副本来作为子类型的原型,这样就避免了创建不必要的属性。
EventLoop
JS 是单线程的,为了防止一个函数执行时间过长阻塞后面的代码,所以会先将同步代码压入执行栈中,依次执行,将异步代码推入异步队列,异步队列又分为宏任务队列和微任务队列,因为宏任务队列的执行时间较长,所以微任务队列要优先于宏任务队列。微任务队列的代表就是, Promise.then , MutationObserver ,宏任务的话就是 setImmediate setTimeout setInterval
原生ajax
ajax 是一种异步通信的方法,从服务端获取数据,达到局部刷新页面的效果。 过程:
事件冒泡、捕获(委托)
event.stopPropagation() 或者 ie下的方法 event.cancelBubble = true; //阻止事件冒泡
ES6
Vue
简述MVVM
MVVM 是 Model-View-ViewModel 缩写,也就是把 MVC 中的 Controller 演变成 ViewModel。Model 层代表数据模型, View 代表UI组件, ViewModel 是 View 和 Model 层的桥梁,数据会绑定到 viewModel 层并自动将数据渲染到页面中,视图变化的时候会通知 viewModel 层更新数据。
谈谈对vue生命周期的理解?
每个 Vue 实例在创建时都会经过一系列的初始化过程, vue 的生命周期钩子,就是说在达到某一阶段或条件时去触发的函数,目的就是为了完成一些动作或者事件
computed与watch
watch 属性监听 是一个对象,键是需要观察的属性,值是对应回调函数,主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作,监听属性的变化,需要在数据变化时执行异步或开销较大的操作时使用
computed 计算属性 属性的结果会被缓存,当 computed 中的函数所依赖的属性没有发生改变的时候,那么调用当前函数的时候结果会从缓存中读取。除非依赖的响应式属性变化时才会重新计算,主要当做属性来使用 computed 中的函数必须用 return 返回最终的结果 computed 更高效,优先使用
使用场景 computed :当一个属性受多个属性影响的时候使用,例:购物车商品结算功能 watch :当一条数据影响多条数据的时候使用,例:搜索数据
v-for中key的作用
vue组件的通信方式
父子组件通信
父->子 props ,子->父 $on、$emit` 获取父子组件实例 parent、 parent 、children Ref 获取实例的方式调用组件的属性或者方法 Provide、inject` 官方不推荐使用,但是写组件库时很常用
兄弟组件通信
Event Bus 实现跨组件通信 Vue.prototype.$bus = new Vue() Vuex
跨级组件通信
$attrs、$listeners Provide、inject
常用指令
双向绑定实现原理
当一个 Vue 实例创建时,Vue会遍历data选项的属性,用 Object.defineProperty 将它们转为 getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher重新计算,从而致使它关联的组件得以更新。
v-model的实现以及它的实现原理吗?
nextTick的实现
vnode的理解,compiler和patch的过程
new Vue后整个的流程
思考:为什么先注入再提供呢??
答:1、首先来自祖辈的数据要和当前实例的data,等判重,相结合,所以注入数据的initInjections一定要在 InitState 的上面。2. 从上面注入进来的东西在当前组件中转了一下又提供给后代了,所以注入数据也一定要在上面。
vm.[Math Processing Error]mount(vm.mount(vm.options.el) :挂载实例。
keep-alive的实现
作用:实现组件缓存
钩子函数:
原理: Vue.js 内部将 DOM 节点抽象成了一个个的 VNode 节点, keep-alive 组件的缓存也是基于 VNode 节点的而不是直接存储 DOM 结构。它将满足条件 (pruneCache与pruneCache) 的组件在 cache 对象中缓存起来,在需要重新渲染的时候再将 vnode 节点从 cache 对象中取出并渲染。
配置属性:
include 字符串或正则表达式。只有名称匹配的组件会被缓存
exclude 字符串或正则表达式。任何名称匹配的组件都不会被缓存
max 数字、最多可以缓存多少组件实例
vuex、vue-router实现原理
vuex 是一个专门为vue.js应用程序开发的状态管理库。 核心概念:
你怎么理解Vue中的diff算法?
在js中,渲染真实 DOM 的开销是非常大的, 比如我们修改了某个数据,如果直接渲染到真实 DOM , 会引起整个 dom 树的重绘和重排。那么有没有可能实现只更新我们修改的那一小块dom而不要更新整个 dom 呢?此时我们就需要先根据真实 dom 生成虚拟 dom , 当虚拟 dom 某个节点的数据改变后会生成有一个新的 Vnode , 然后新的 Vnode 和旧的 Vnode 作比较,发现有不一样的地方就直接修改在真实DOM上,然后使旧的 Vnode 的值为新的 Vnode 。
diff 的过程就是调用 patch 函数,比较新旧节点,一边比较一边给真实的 DOM 打补丁。在采取 diff 算法比较新旧节点的时候,比较只会在同层级进行。 在 patch 方法中,首先进行树级别的比较 new Vnode 不存在就删除 old Vnode old Vnode 不存在就增加新的 Vnode 都存在就执行diff更新 当确定需要执行diff算法时,比较两个 Vnode ,包括三种类型操作:属性更新,文本更新,子节点更新 新老节点均有子节点,则对子节点进行 diff 操作,调用 updatechidren 如果老节点没有子节点而新节点有子节点,先清空老节点的文本内容,然后为其新增子节点 如果新节点没有子节点,而老节点有子节点的时候,则移除该节点的所有子节点 老新老节点都没有子节点的时候,进行文本的替换
updateChildren 将 Vnode 的子节点Vch和oldVnode的子节点oldCh提取出来。 oldCh和vCh 各有两个头尾的变量 StartIdx和EndIdx ,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了 key ,就会用 key 进行比较,在比较的过程中,变量会往中间靠,一旦 StartIdx>EndIdx 表明 oldCh和vCh 至少有一个已经遍历完了,就会结束比较。
你都做过哪些Vue的性能优化?
你知道Vue3有哪些新特性吗?它们会带来什么影响?
更小巧、更快速 支持自定义渲染器 支持摇树优化:一种在打包时去除无用代码的优化手段 支持Fragments和跨组件渲染
模板语法99%保持不变 原生支持基于class的组件,并且无需借助任何编译及各种stage阶段的特性 在设计时也考虑TypeScript的类型推断特性 重写虚拟DOM 可以期待更多的编译时提示来减少运行时的开销 优化插槽生成 可以单独渲染父组件和子组件 静态树提升 降低渲染成本 基于Proxy的观察者机制 节省内存开销
检测机制 更加全面、精准、高效,更具可调试式的响应跟踪
实现双向绑定 Proxy 与 Object.defineProperty 相比优劣如何?
React
1、react中key的作用,有key没key有什么区别,比较同一层级节点什么意思?
2、你对虚拟dom和diff算法的理解,实现render函数
虚拟DOM 本质上是 JavaScript 对象,是对 真实DOM 的抽象表现。 状态变更时,记录新树和旧树的差异 最后把差异更新到真正的 dom 中 render函数:
3、React组件之间通信方式?
Context 提供了一个无需为每层组件手动添加 props ,就能在组件树间进行数据传递的方法.如果你只是想避免层层传递一些属性,组件组合( component composition )有时候是一个比 context 更好的解决方案。 5. 组件组合缺点:会使高层组件变得复杂
4、如何解析jsx
5、生命周期都有哪几种,分别是在什么阶段做哪些事情?为什么要废弃一些生命周期?
componentWillMount、componentWillReceiveProps、componentWillUpdate在16版本被废弃,在17版本将被删除,需要使用UNSAVE_前缀使用,目的是向下兼容。
6、关于react的优化方法
使用return null而不是CSS的display:none来控制节点的显示隐藏。保证同一时间页面的DOM节点尽可能的少。
不要使用数组下标作为key 利用 shouldComponentUpdate 和 PureComponent 避免过多 render function ; render 里面尽量减少新建变量和bind函数,传递参数是尽量减少传递参数的数量。 尽量将 props 和 state 扁平化,只传递 component 需要的 props (传得太多,或者层次传得太深,都会加重 shouldComponentUpdate 里面的数据比较负担),慎将 component 当作 props 传入
使用 babel-plugin-import 优化业务组件的引入,实现按需加载 使用 SplitChunksPlugin 拆分公共代码 使用动态 import ,懒加载 React 组件
7、绑定this的几种方式
8、对fiber的理解
9、setState是同步还是异步的
10、Rex、React-Rex
Rex的实现流程
用户页面行为触发一个 Action ,然后 Store 调用 Recer ,并且传入两个参数:当前 State 和收到的 Action 。 Recer 会返回新的 State 。每当 state 更新之后, view 会根据 state 触发重新渲染。
React-Rex:
Provider :从最外部封装了整个应用,并向 connect 模块传递 store 。 Connect :
11、对高阶组件的理解
高阶组件是参数为组件,返回值为新组件的函数。 HOC 是纯函数,没有副作用。 HOC 在 React 的第三方库中很常见,例如 Rex 的 connect 组件。
高阶组件的作用:
12、可以用哪些方式创建 React 组件?
React.createClass()、ES6 class 和无状态函数
13、 React 元素与组件的区别?
组件是由元素构成的。元素数据结构是普通对象,而组件数据结构是类或纯函数。
Vue与React对比?
数据流:
react 主张函数式编程,所以推崇纯组件,数据不可变,单向数据流,
vue 的思想是响应式的,也就是基于是数据可变的,通过对每一个属性建立Watcher来监听,当属性变化的时候,响应式的更新对应的虚拟dom。
监听数据变化实现原理 :
组件通信的区别:jsx和.vue模板。
性能优化
vuex 和 rex 之间的区别?
从实现原理上来说,最大的区别是两点:
Rex 使用的是不可变数据,而 Vuex 的数据是可变的。 Rex 每次都是用新的 state 替换旧的 state ,而 Vuex 是直接修改
Rex 在检测数据变化的时候,是通过 diff 的方式比较差异的,而 Vuex 其实和Vue的原理一样,是通过 getter/setter 来比较的(如果看 Vuex 源码会知道,其实他内部直接创建一个 Vue 实例用来跟踪数据变化)
浏览器从输入url到渲染页面,发生了什么?
网络安全、HTTP协议
TCP UDP 区别
Http和Https区别(高频)
GET和POST区别(高频)
理解xss,csrf,ddos攻击原理以及避免方式
XSS ( Cross-Site Scripting , 跨站脚本攻击 )是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens ,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
CSRF ( Cross-site request forgery ) 跨站请求伪造 :攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
XSS避免方式:
CSRF 避免方式:
DDoS 又叫分布式拒绝服务,全称 Distributed Denial of Service ,其原理就是利用大量的请求造成资源过载,导致服务不可用。
❺ web前端需要掌握的哪些知识
一个合格的web前端需要掌握哪些技术?
最基础的自然是JavaScript,HTML和css这三种语言。
首先了解下它们到底是什么。
HTML是用户看到的网页的骨架,比如你会发现当前页面分为左中右三个部分,其中还填充了不同的文字和图片;每个子部分还会继续细分,比如当前页面的中间部分下方有输入框等等。
CSS是网页展示的细节控制,比如你会发现有的文字是红底白色,有的子部分占了页面的二分之一宽,有的只占六分之一,有些部分需要用户进行某些操作(如点击,滑动)才会出现等等,这些就是有CSS来控制。
JavaScript是负责捕捉用户在浏览器上的操作,并与后端服务器进行数据交换的脚本语言。当用户在前端进行点击,输入等操作的时候,会触动绑定了该动作的JavaScript脚本,然后JavaScript收集数据,调用后端的api接口,再将后端返回的数据交给HTML和CSS渲染出来。
一个网页的HTML代码和CSS代码是可以直接在浏览器中查看的,你可以直接按F12,就能看到下图右侧的模块,左右侧红框就是代码与实际页面的对应关系。因此如果你看到某个网站的布局很不错,不妨点击F12,进行学习。
前端框架
然而,实际应用中,已经很少有正规的项目组直接用上述三种语言进行web 前端开发了,而是使用很多封装了这三种语言的框架,比如
Vue.js
,angular,react native等等。它们是来自谷歌和Facebook的大神项目组,基于自己的经验,封装了原生前端语言,实现了更多更复杂更酷炫的功能。因此,可以说,学会使用这些框架,能达到事半功倍的效果。
比如用了vue,它是自底向上增量开发的设计,其核心只关心图层,而且还可以与其他库或已存项目融合,学习门槛极其友好;另一方面,vue可以驱动单文件组件和vue生态系统支持的库开发的复杂单页应用。有了这个生态系统,可以说,vue是处在一个不断壮大,不断完善的欣欣向荣的状态。
网络通信协议
由于前后端分离的趋势,前端还需要了解很多网络通信协议的知识,这里不局限于http协议,因为据我的经验,有时候我们还会用到websocket等协议。因此,前端需要简单了解不同协议的特点以及使用方式,但是好消息是不用像学习计算机网络课程一样对每种协议的原理都了解的特别透彻,只要学会如何用前端语言发送这种协议的请求就够了。