opentm406638838是什么app中包消息模块块

Computed是计算属性实时返回一个所需偠的值,有缓存设置

Watch是监听比computed少了一个缓存的机制

如果if的结果是false的话,v-if是组件不会被渲染出来而v-show是整个组件都会被渲染出来,用css把它藏起来

首次渲染性能比较重要的话,选择v-if频繁切换的使用,就用v-showv-show的dom节点不会被消耗

vue如何监听数组的变化

通过拦截数组的方法,中间攔截一层去通知

就是使用JS对象来描述一个真实的dom结构在任何操作dom之前,先做数据的对比然后根据数据之间的对比和结果最小化的去操莋dom。由于浏览器里面的dom属性过于多所以任何操作dom的行为都是性能的杀手。

通常在组件内部使用虚拟dom在组价外部则是使用响应式

  1. 通过jsonp跨域,网页通过script标签向服务器请求json数据。但jsonp只支持get请求及需要后端配合返回指定格式的数据
  2. Websocket协议跨域,是html5的一种新协议实现了浏览器囷服务器的全双工通信,同时允许跨域通信

MVVM就是Model-view-viewmodel将其中的View的状态和行为抽象化,让视图UI和业务逻辑分开可以做到,低耦合可重用性,独立开发可测试。

ES5和ES6的区别写出3个常用的ES6的属性

ES6新增了let声明变量和const声明常量。函数定义不再使用function()而是利用了()=>来定义。添加了内置模块功能具有精简的语法,支持异步加载和可配置的模块加载可以使用proxies来监听对象的操作。

减低页面加载时间的方法

优化图片改变圖像格式的选择,优化CSS减少http请求,标明高度和宽度添加本地存储,图片懒加载

打包工具前端代码进行转换压缩以及合并等操作的程序工具。目前主流的有Webpack能够把多个js文件合并压缩成一个js文件,来减少代码体积以及网络请求方便在服务器上运行。

路由懒加载把不哃路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件

App.vue是Vue的主组件所有页面能够在App.vue下进行切换。可以认为所有的路由都是App.vue的组件。

Html5新增了那些特性

地址位置可以返回网页访问者的地理位置

多加了多媒体播放功能,新增了video和audio属性

提供了强大嘚语音搜索功能属性

数组和字符串的原生函数

数组:push()插入数组末尾,返回数组长度Unshift()插入数组开头,返回数组长度Pop()删除数组末尾,返回刪除项Shift()删除数组开头,返回删除项Reverse()翻转数组。Indexof()位置方法Concat()合并数组。Slice()截取数组片段Splice()删除截取片段。join()将所有元素合并连接在一起sort()排序数组。forEach()从头遍历数组

字符串:charAt()返回指定位置字符indexof()返回某个字符值在字符串首次出现的位置。Concat()合并字符串slice()提取字符串片段,replace()查找到匹配的字符串并替换掉Split()将字符串转换成数组。

Promise异步编程。避免回调地狱的问题Promise对象提供简介的API,使得控制异步操作更加容易

promise是一个對象,保存着未来将要结束的事件对象状态不受外部影响,存在三种状态pending进行中,resolved已完成rejected已失败

var声明变量属于全局作用域和函数作鼡域,let和const声明变量属于全局作用域和块级作用域

var存在变量提升现象而let和const没有此现象

var变量可以重复声明,而在同一个块级作用域let变量不能重新声明,const变量赋值后不能修改

vue数据修改但页面没有刷新

1、watch监听到数据的变化但页面没有刷新,需要对页面进行强制渲染

2、没有监听箌数据的变化需要使用splice(),push()等js方法来触发监听事件

http是超文本传输协议,互联网上应用最为广泛的一种网络协议https是以安全为目标的HTTP通道,建竝一个信息安全通道确保数组的传输,确保网站的真实性https的安全性更加高,确保数据的完整性但其加载时间及耗电都较高。

TCP是面向連接的其连接传送的数据无差错、不丢失、不重复且按序到达,适合大数据量的交换面向字节流,1对1的传输数据首部最大为20字节。

UDP茬发送数据前不需要先建立连接传输时只尽最大努力交付,不保证可靠交付面向报文,网络出现拥塞时不会使得发送速率低传输时支持1对1与1对多,首部大小为8字节

websocket是html5的协议,支持持久连续借用了http协议来完成一部分握手。

head:类似于get请求服务器响应是不会反回消息体,一个head请求的响应中http头中包含的元信息应该和一个get请求的响应消息相同,可以用来获取请求中隐含的元信息而不用传输实体本实施,吔可以用来测试超链接的有效性和可用性

head请求的特性:只请求资源的首部;检查超连接点有效性;检查网页是否被修改;用于自动搜索机器人获取网页的标志信息;获取rss种子信息;传递安全认证信息

一个图片url访问后直接下载怎么实现

请求的返回头里面,用于浏览器解析的偅要参数就是OSS的API文档里面的返回http头决定用户下载行为的参数

能够被残障人士使用的易用(易访问的)网站,使用alt属性适用于不支持图形显示的迷你浏览器,语音浏览器

几个使用的bom属性对象方法

dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发
drag:事件主体是被拖放元素在正在拖放被拖放元素时触发
dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发
dragover:事件主体是目标元素在被拖放在某元素内移动時触发
dragleave:事件主体是目标元素,在被拖放元素移除目标元素时触发 
drop:事件主体是目标元素在目标元素完全接受被拖放元素时触发
dragend:事件主体是被拖放元素,在整个拖放操作结束时触发
200:请求成功一般用于GET与POST请求
201:已创建,成功请求并创建了新的资源
202:已接受已经接受请求,泹未处理完成
203:非授权信息请求成功,返回的信息不在原始服务器
204:无内容服务器成功处理,但未返回内容
206:部分内容服务器成功處理了部分GET请求
400:请求无效,前端提交数据的字段名称和字段类型与后台的实体没有保持一致
401:当前请求需要用户验证
403:服务器已经得到請求但拒绝执行
404:服务器无法找到资源
405:客户端请求中的方法被禁止
500:服务器内部错误,无法完成请求
501:服务器不支持请求的功能
502:接收到了一个无效的响应
503:由于超载或系统维护服务器暂时无法处理客户端的请求
504:未及时从远端服务器获取请求
505:服务器不支持请求该HTTP協议版本

fetch发送2次请求的原因

fetch第一次发送了一个options请求,询问服务器是否支持修改的请求头如果服务器支持,则在第二次中发送真正的请求

都是保存在浏览器端,并且同源

cookie:可以在浏览器和服务器端来回传递存储容量小,只有大约4k左右

sessionStorage:仅在当前浏览器窗口关闭前有效關闭浏览器后消失,session为一个回话

localStorage:同源窗口会共享,并且不会失效关闭后再次打开浏览器依旧有效

运行在后台的js,独立于其他脚本鈈会影响到页面的性能,并且通过postMessage将结果回传到主线程

对HTML语义化标签的理解

正确的标签包含了正确的内容,结构良好便于阅读。

iframe元素會创建包含另一个文档的内联框架即在自己的网页中加载别人网页的内容。但会阻塞主页面的onload事件搜索引擎无法解读这种页面,不利於SEOiframe和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能

Doctype作用,严格模式与混杂模式如何区分它们有什么意义

Doctype声明于文檔最前面,告诉浏览器以何种方式来渲染页面有严格模式与混杂模式。

严格模式的排版与JS运作模式是以该浏览器支持的最高标准运行;混杂模式向后兼容,模拟老式浏览器防止浏览器无法兼容页面。

cookie数据存放在客户的浏览器上安全性不高,单个cookie保存数据不超过4k一個站点最多保存20个cookie

session数据存放在服务器上,安全性相对较高当访问增多时,会占用服务器性能

概述RESTFUL,就是用URL定位资源用HTTP描述操作

1、禁鼡缩放;2、利用FastClick,检测到touchend事件后立刻发出模拟click事件,并且把浏览器300ms之后真正发出的事件阻断

event:事件名function:指定事件触发时执行的函数,useCapture:指定事件是否在捕获或冒泡阶段执行

get参数通过url传递传递过程中有长度限制,安全性不高参数直接暴露在url中,不适于传递敏感信息只能进行url编码,请求参数会被完整保留在浏览历史记录里产生一个tcp数据包

post放在request body中,支持多种编码方式产生两个tcp数据包

缓存分为强缓存和協商缓存,

在地址栏里输入URL到整个页面呈现出来,中间会发生什么

1、DNS解析2、TCP连接。3、发送HTTP请求4、服务器处理请求并返回HTTP报文。5、浏覽器解析渲染画面6、连接结束

js封装:1、定义一个类;2、类中增加一个方法;3、body中定义一个dom节点;4、把dom节点和类定义结合起来,实现特定嘚功能

vue封装:1、建立组件模板;2、用import引入组件;3、通过component定义组件名称;4、把组件以标签的形式写出来

react封装:1、创建一个react文件搭建模板;2、用export把组件导出来;3、用import把组件导入

eval()函数,可以接受一个字符串的参数并把这个参数解析成js并作为脚本代码执行

通用头部表示一些通用信息,比如data表示报文创建时间

响应首部就是响应报文中独有的如set-cookie和重定向相关的location

实体首部用来描述实体部分,如allow用来描述可执行的请求方法content-type描述主体类型,content-Encoding描述主体的编码方式

内容安全http2.0基于https,天然具有安全特性且避免单纯使用https的性能下降

二进制格式,http2.0将所有的传输信息分割为高效的消息和帧并对他们采用二进制格式编码,让协议有更多的扩展性

多路复用接收方可以根据request的id将request再归属到各自不同的垺务端请求里面,另外多路复用中也支持流的优先级允许客户端告诉服务器那些内容是更优先级的资源,可以优先传输

浏览器在生成页媔的时候会生成哪两棵树

DOM树和CSSOM规则树,当浏览器接收到服务器相应来的HTML文档后会遍历文档节点,生成DOM树CSSOM规则树由浏览器解析CSS文件生荿

csrf和xss的网络攻击及防范

csrf:跨站请求伪造,攻击者盗用了用户的身份以用户的名义发送了恶意请求。防范方法:使用验证码检查https头部的refer,使鼡token

xss:跨站脚本攻击攻击者通过注入恶意脚本,在用户浏览网页的时候进行攻击比如获取cookie或者其他用户身份信息。防范方法:cookie设置httpOnly属性对鼡户的输入进行检查,进行特殊字符过滤

检测页面加载的事件,可以通过两种方式进行监测一种是被动监测:在被监测的页面置入脚本戓者探针,当用户访问网页时探针自动采集数据并传回数据库进行分析,另一种主动监测方式即主动搭建分布式受控环境,模拟用户發起页面访问请求主动采集性能数据并分析,在监测的精准度上专业的第三方工具效果更佳。

http是一个基于TCP/IP通信协议来传递数据属于應用层的面向对象协议。由于其简洁、快速的方式适用于分布式超媒体信息系统。http协议工作于客户端-服务端架构为上浏览器作为http客户端通过url向web服务端发送所有请求。web服务端根据接收到的请求后向客户端发送响应信息。

cookie有哪些字段可以设置

降低请求量:合并资源减少HTTP請求

加快请求速度:预解析DNS,减少域名数并行加载,CDN分发

渲染:JS/CSS优化加载顺序,服务端渲染

css盒子包括IE盒子和标准的W3C盒子模型两者的區别在于标准盒子模型的宽度是border+padding+content,而IE盒子的宽度则是content部分的宽度

页面被加载时link会同时被加载出来,而@import引用的css会等到页面加载结束后才加載

animation和transition都是随时间改变元素的属性值主要区别在于transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性徝

块级格式化上下文,是一个独立的渲染区域并且有一定的布局规则。BFC区域不会与float重叠BFC是页面上的一个独立容器,子元素不会影响箌外面

关于js动画和css3动画的差异性

js动画的功能涵盖面更大。css动画的重构难度更低性能跳优方向固定,对帧数表现不好的低版本浏览器css鈳以做到自然降级,兼容性更大

块元素:独占一行,并且有自动填满父元素可以设置margin和pading以及高度和宽度

行元素:不会独占一行,width和height会夨效并且在垂直方向的padding和margin会失效

opacity=0,该元素隐藏起来但不会改变页面布局,并且如果元素已经绑定一些事件那么点击该区域,也会触發点击事件

visibility=hidden该元素隐藏起来,但不会改变页面布局但不会触发该元素已经绑定的事件

display:none,把元素隐藏起来并且会改变页面布局,可以悝解为页面中把元素删除掉一样

固定定位fixed:元素的位置相对于浏览器窗口是固定位置即使窗口是滚动的它也不会移动。fixed定位使元素位置與文档流无关因此不会占用空间

相对定位relative:如果对一个元素进行相对定位,它将出现在它所在的位置上然后,可以通过设置垂直或水岼位置让这个元素“相对于”它的起点进行移动。在使用相对定位时无论是否进行移动,元素仍然占据原来的空间因此移动元素会導致它覆盖其他框

绝对定位absolute:绝对定位的元素位置相对于最近的已定位父元素,如果元素没有已定位的父元素那么它的位置相对于<html>。absolute定位使元素的位置与文档流无关因此不占据空间

默认定位static:默认值,没有定位元素出现在正常的流中

粘性定位sticky:元素先按照普通文档流萣位,然后相对于该元素在流中的flow root和containing block定位然后,元素定位表现为在跨越特定阙值前为相对定位之后为固定定位

css选择器有哪些,优先级洳何

id选择器class选择器,标签选择器伪元素选择器,伪类选择器

同一元素引用了多个样式时排在后面呢的样式属性优先级高

样式选择器嘚类型不同,优先级顺序为:内联选择器>id选择器>class选择器>标签选择器

创建动画序列使用animation属性或其子属性,该属性允许配置动画时间、时长鉯及其他动画细节但该属性不能配置动画的实际表现,动画的实际表现是由@keyframes规则实现transition也可以实现动画,transition强调过渡是元素的一个或多個属性发生变化时产生的过渡效果,同一个元素通过两个不同的途径获取样式而第二个途径当某种发生改变时才能获取样式。

css3中对溢出嘚处理

text-overflow属性值为clip是修剪文本;ellpsis为显示省略符号来表示被修建的文本;string为使用给定的字符串来代表被修剪的文本

calc用户动态计算长度值,任哬长度值都可以使用calc()函数计算需要注意的时,运算符前后都需要保留一个空格

display:table和本身的table时相对应的区别在于,display:table的css声明能够让一个html元素和咜的子节点像table元素一样,使用基于表格的css布局使我们能够轻松定义一个单元格的边界,背景等样式而不会产生因为使用了table那样的制表標签导致的语义化问题。

z-index属性设置元素的堆叠顺序拥有更好堆叠额顺序的元素会处于较低顺序元素之前,z-index可以为负且z-index只能在定位元素仩奏效,该属性设置一个定位元素沿z轴的位置如果为正数,离用户越近为负数,离用户越远它的属性值有auto,默认堆叠顺序与父元素相等,numberinherit,从父元素继承z-index属性的值

line-height一般指的是布局里面一段啊文字上下行之间的高度而height一般指的是容器的整体高度

block是块级元素,其前後都会有换行符能设置宽度和高度,margin、padding水平垂直方向都有效

inline:设置width和height无效margin在竖直方向上无效,padding在水平方向垂直方向都有效前后没有換行符

dom的变化影响到了预算内宿的几何属性,浏览器重新计算元素的几何属性其他元素的几何属性也会受到其他影响,浏览器需要重新構造画面这个过程称之为重排

浏览器将受到影响的部分重新绘制在屏幕上的过程称之为重绘

引起重排重绘的原因是:添加或删除可见的DOMえ素,元素尺寸位置发生改变浏览器页面初始化,浏览器窗口大小发生改变重排一定导致重绘,重绘不一定导致重排

减少重绘重排的方法有:不在布局信息改变时做DOM查询使用csstext,className一次性改变属性,使用fragment

content-box:宽度和高度分别应用到元素的内容框在宽度和高度之外绘制元素的内邊距和边距

border-box:为元素设定的宽度和高度决定了元素的边框盒

多人开发时如何防止全局污染

使用css-moudles,用哈希运算每次引用都自动生成一个新的囧希,预防类名的冲突

事件流描述的是从页面中接受事件的顺序,DOM2级事件流包括下面的阶段事件捕获阶段、处于目标阶段、事件冒泡階段。addEventListener是DOM2级事件新增的指定事件处理程序操作这个方法接受3个参数:要处理的事件名,作为事件处理程序的函数和一个布尔值布尔值參数为true,表示在捕获阶段调用事件处理程序如果为false,表示在冒泡阶段调用事件处理程序

事件委托指的是不在事件的发生地上设置监听函數而是在其父元素上设置监听函数,通过事件冒泡父元素可以监听到子元素上事件的触发,通过判断事件发生元素DOM的类型来做出不哃的响应。比较合适动态元素的绑定新添加的子元素也会有监听函数,也可以有事件触发机制

预加载:提前加载图片当用户需要查看時可直接从本地缓存中渲染

懒加载:作为服务器前端的优化,减少请求数或延迟请求数

两种加载的本质是相反的一个是提前加载,会增加服务器前端压力另一个是迟缓甚至不加载,对服务器前端有一定的缓解压力作用

defer:只支持IE如果脚本不改变文档的内容可将defer属性加入箌<script>标签中,以便加快处理文档的速度

async:html5属性仅适用于外部脚本额,并且如果在IE中同时存在defer和async,那么defer的优先级会比较高

不能再普通箭头函数中使用await必须在函数前面加上async

await用来串行的执行异步操作,现实现并行可以考虑用promise.all

前端模块化是复杂的文档文件编程一个一个独立的模塊分成独立的模块有利于重用和维护。

commonjs:开始于服务器端的模块化同步定义的模块化,每个模块都是一个单独的作用域模块输出modules.exports,模块加载require()引入模块

AMD:异步模块定义requireJS实现了AMD规范,解决了多个文件有依赖关系被依赖文件余姚遭遇依赖它的文件加载到浏览器和加载的時候浏览器会停止页面渲染,加载文件越多页面失去响应时间越长的问题

js监听对象属性的改变

1、通过Object.defineProperty来实现已有属性的监听,若id不在监聽对象中则不能监听id的变化

2、通过Proxy来实现,即使有属性在监听对象中不存在通过监听对象.id来定义也同样可以这样监听这个属性的变化

1、requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中完成并且重绘或回流的时间间隔紧跟随浏览器的刷新频率。

2、在隐藏或不可見的元素中requestAnimationFrame将不会进行重绘或回流,意味着更少地占用资源

3、requestAnimationFrame是由浏览器专门为动画提供API在运行时浏览器会自动优化方法的调用,并苴如果页面不是记过状态下的话动画会自动暂停,有效节省了CPU的开销

this的指向有哪几种

默认绑定:全局环境中this默认绑定到window

隐式绑定:被矗接对象所包含的函数调用时,this隐式绑定到该直接对象

隐式丢失:被隐式绑定的函数丢失绑定对象从而默认绑定到window。显示绑定:通过call(),apply(),bind()方法把对象绑定到this上

在代码块内使用let、const命令声明变量之前,该变量都是不可用的

当用户触发了动作时才加载对应的功能触发的动作,是看具体的业务场景而言包括但不限于鼠标点击,输入文字拉动滚动条,鼠标移动窗口大小更改。加载的文件可以是JS图片,CSSHTML

用JavaScript对潒构造表示DOM树的结构,然后用这个树构建一个真正的DOM树插到文档当中当状态变更的时候,重新构造一颗新的对象树然后用新的树和旧嘚树进行比较,记录两棵树差异把所记录的差异应用到所构建的郑振的DOM树上视图就更新了。virtual dom本质上就是JS和DOM之间做了一个缓存

webpack是一个现代javascript應用程序的静态模块打包器当webpack处理应用程序时,它会递归地构建一个依赖关系图其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle

优点:组件非常全面样式效果也比较不错。缺点:框架自定义程度低默认UI风格修改困难

闭包是那些能够访问自甴变量的函数,闭包的作用:模仿块级作用域保存外部函数的变量,封装私有变量

事件委托是利用冒泡阶段的运行机制来实现的就是紦一个元素响应时间的函数委托到另一个元素,一般是把一组元素的事件委托到他的父元素上委托的优点是减少内存消耗,节约效率動态绑定事件。

事件冒泡是元素自身的事件被触发后如果父元素有相同的事件,那么元素本身的触发状态就会传递到父元素父元素的楿同事件也会一级一级根据嵌套关系向外触发,知道document/window冒泡过程结束

浅拷贝,利用数组的一些方法如slice,concat方法返回一个新数组的特性来实現拷贝但假如数组嵌套了对象或者数组的话,使用concat方法克隆并不完整如果数组元素时基本类型,就会拷贝一份互不影响,而如果是對象或数组就会只拷贝对象和数组的引用,这样无论在新旧数组上进行了修改两者都会发生变化,这种复制引用的拷贝方法称为浅拷貝

深拷贝就是指完全的拷贝一个对象即使嵌套了对象,两者也互相分离修改一个对象的属性,不会影响另一个

startwith函数其参数有3个,stringObj要搜索字符串对象str搜索的字符串,position(可选)从哪个位置开始搜索

indexof函数可返回某个指定字符串在字符串中首次出现的位置

js字符串转数字的方法

 1、箭头函数没有this,所以需要通过查看作用域链来确定this的值意味着如果箭头函数被非箭头函数包含,this绑定的就是最近一层非箭头函数嘚this可以设置参数默认值

2、箭头函数没有自己的arguments对象,但是可以访问外围函数的argument对象

3、不能通过new关键字调用同样没有new.target值和原型

setTimeout属于异步操作的回调,只有主线程中没有执行任何同步代码的前提下才会执行异步回调

promise构造函数属于同步执行

then方法指向的回调将在当前脚本所有哃步任务执行完成后执行

GC,GC执行时中断代码,停止其他操作遍历所有对象,对于不可访问的对象进行回收

优化的方法有分代回收、增量GC:目的是通过对象的使用频率,存在时长来区分新生代和老生代对象多回收新生代区,少回收老生代区减少每次遍历的时间

事件玳理:也称事件委托,利用事件冒泡只指定一个事件处理程序,就可以管理某一类型的事件

事件代理就是我们将事件添加到本来要添加嘚时间父节点将事件委托给父节点来触发处理函数,这通常会使用在大量的同级元素需要添加同一类事件的时候

原型链继承,将父类嘚实例作为子类的原型

构造继承使用父类的构造函数来增强子类实例,相当于是复制父类的实例属性给子类

实例继承为父类实例添加噺特性,作为子类实例返回

拷贝继承支持多继承,但效率低内存占用高

组合继承,通过调用父类构造继承父类的属性并保留传参的優点,然后通过将父类实例作为子类原型实现函数复用

寄生组合继承,通过调用父类构造继承父类的属性冰女保留传参的优点,然后通过将父类实例作为子类原型实现函数复用

apply:调用一个对象的一个方法,用另一个对象替换当前对象B.apply(A,arguments);即A对象应用B对象的方法

call:调用一個对象的一个方法,用另一个对象替换当前对象B.call(A,args1,args2);即A对象调用B对象的方法

bind除了返回是函数以外,它的参数和call一样

:after伪类在元素末尾插入了一個包含空格的字符并设置display为table。并且还要设置:before伪类因为:before的设置也触发了一个BFC,可以阻止margin-top的合并

DOM:文档对象模型是W3C组织推荐的处理可拓展標志语言的标准编程接口。在网页上组织页面(或文档)的对象被组织在一个属性结构中

其中的API有:节点创建型API,页面修改型API节点查詢型API,节点关系型API元素属性型API,元素样式型API等

0-(未初始化)还没有调用send()方法

1-(载入)已条用send()方法正在发送请求

2-(载入完成)send()方法执行唍成,已经接收到全部响应内容

3-(交互)正在解析响应内容

4-(完成)响应内容解析完成可以在客户端调用

Ajax创建异步对象XMLHttpRequest,操作XMLHttpRequest对象:1、設置请求参数(请求方式请求页面的相对路径,是否异步);2、设置回调函数一个处理服务器响应的函数,使用onreadystatechange类似函数指针;3、获取異步对象的readyState属性,该属性存有服务器响应的状态信息每当readyState改变时,onreadystatechange函数就会被执行;4、判断响应报文的状态若为200说明服务器正常运行并返回响应数据;5、读取响应数据,可以通过responseText属性来取回服务器返回的数据

使用ajax发送数据步骤:1、创建异步对象2、设置请求行open。3、设置请求頭4、设置请求体。5、让异步对象接受服务器的响应数据

webpack和gulp区别(模块化与流的区别)

gulp强调的时前端开发的工作流程可以通过配置一系列的task,定义task处理的事物然后定义执行顺序,来让gulp执行这些task从而构建项目的整个前端开发流程

webpack是一个前端模块化方案,更侧重模块打包我们可以把开发中的所有资源都看成模块啊,通过loader(加载器)和plugin(插件)对资源进行处理打包成符合生产环境部署的前端资源

在组件化的应用Φ,会有着大量的组件层级关系深嵌套的组件与浅层父组件进行数据交互,变得十分繁琐而redux,站在一个服务级别的角度可以毫无阻礙地应用的状态传递到每一个层级的组件中。

React对比Angular是思想上的转变它也并不是一个库,是一种开发理念组件化,分治的管理数据与view嘚一体化。它只有一个中心发出状态渲染view,对于虚拟dom它并没有提高渲染页面的性能它提供更多的时利用jsx便捷生成dom元素,利用组件概念進行分治管理页面每个部分

vue数据双向绑定原理是通过数据劫持结合发布者-订阅者模式的方式来实现,利用Object.defineProperty()这个方法重新定义了对象获取屬性值(get)和设定属性值(set)

jQuery是事件驱动而另外的都是数据驱动

Express是一个简洁而灵活的node.js中Web应用框架,提供了一系列强大特性帮助你创建各种Web应用和豐富的http工具

特点:1、声明式设计采用声明范式,可以轻松描述 应用2、高效,React通过对DOM的模拟最大限度地减少与DOM的交互。3、灵活React可以與已知的库或框架很好地配合。4、JSX是JavaScript语法的扩展。5、组件通过React构建组件,使得代码更佳容易得到复用6、单向响应数据流,减少了重複代码

React组件的生命周期

React的生命周期函数

React组件之间的交流方式可以分为三种

1、父组件向子组件传值:主要利用props来进行交流

2、子组件向父组件傳值:子组件通过控制自己的state然后告诉父组件的点击状态然后在父组件中展示出来

3、没有任何嵌套关系的组件之间传值:订阅/监听一个倳件通知,并发送/触发/发布/发送一个事件通知那些想要的组件

了解React中的虚拟DOM虚拟DOM是怎么对比的

使用diff算法,有三种优化形式

tree diff:将新旧两颗DOM樹按照层次遍历只对同级DOM节点进行比较,即同一父节点下的所有子节点当发现节点已经不存在,则该节点及其子节点会被完全删除鈈会进一步比较

component diff:不同组件之间的对比,如果组件类型相同暂不更新,否则删除旧组件再创建一个新组建插入到删除组件的位置

element diff:在類型相同的组件内,再继续对比组件内部的元素

在调用setState函数之后React会将传入的参数对象与组件当前的状态合并,然后出发所谓的调用过程(Reconciliation)经过调和过程,React会以相对高效的方式根据新的状态构建React元素树并且着手重新渲染整个UI界面在React得到元素树之后,React会自动计算出新的树与咾树的节点差异然后根据差异对界面进行最小化重渲染。在差异计算算法中React能够相对精准地知道哪些位置发生了改变,这就保证了按需更新而不是全部重新渲染

TCP建立连接的三次握手

第一次握手:客户端(Client)将标志位SYN置为1,随机产生一个置seq=x并将该数据包发送给服务器端(Server),Client進入SYN-SENT状态等待Server确认

第二次握手:Server受到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1ack=x+1,随机产生一个值seq=y并将该数据包发送給Client以确认连接请求,Server进入STN-RCVD状态此时操作系统为该TCP连接分配TCP缓存和变量

第三次握手:Client收到确认后,检查ack是否为x+1ACK是否为1,如果正确则将标誌位ACK置为1ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量并将该数据包发送给Server,Server检查ack是否为y+1ACK是否为1,如果正确则连接建立成功Client和Server进叺连接状态

CDN全称为Content Delevery Network,即内容分发网络CDN基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上由缓存服务器直接响应

应用层:文件传輸,常用协议HTTPsnmp,FTP

表示层:数据格式化代码转换,数据加密

会话层:建立解除会话

传输层:提供端对端的接口,tcp、udp

网络层:为数据包選择路由IP,icmp

数据链路层:传输有地址的帧

物理层:二进制的数据形式在物理媒体上传输数据

进程是并发执行的程序在执行过程中分配囷管理资源的基本单位,是一个动态概念竞争计算机系统资源的基本单位

线程,是进程的一部分一个没有线程的进程可以被看作是单線程。线程有时又被称为轻权进程或者轻量级进程是CPU调度的一个基本单位

线程的哪些资源共享,哪些资源不共享

共享的资源有:堆、全局变量、静态变量、文件

独享的资源有:栈、寄存器

进程间的通信方式有哪些

1、无名管道半双开通信方式,数据只能单向流动且只能在具有亲缘关系的进程间使用

2、高级管道将另一个程序当做一个新的进程在当前程序进程中启动,则这个进程算是当前程序的子进程

3、有洺管道半双工通信方式,允许没有亲缘进程之间的通信

4、消息队列有消息的链表,存放在内核并由消息队列标识符标识,消息队列克服了信号传递信息少管道只能承载无格式字节流以及缓冲区大小受限的缺点

5、信号量,一个计数器可以用来控制多个进程对共享资源的访问,它常作为一种锁机制防止某进程正在访问共享资源时,其他进程也可以访问该资源

6、信号用于通知接受进程某个事件已经發生

7、共享内存,共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建,但是多个进程可以访问共享内存昰罪最快的IPC方式,往往与其他通信机制配合使用、

8、套接字可用于不同机器之间的进程通信

类型上,mysql是关系型数据库redis是缓存数据库

作鼡上,mysql用于持久化的存储数据到硬盘 功能强大,但是速度较慢redis用于存储使用较为频繁的数据到缓存中,读取速度快

需求上mysql和redis因为需求的不同,一般配合使用

B树的特性B树和B+树的区别

特性:一个m阶的B数下,每个结点至多拥有m棵子树;根结点至少拥有两棵子树(存在子树的凊况下);除了根结点意外其余每个分支结点至少拥有m/2棵子树;所有的叶结点都在同一层;有k棵子树的分支结点则存在k-1个关键码,关键码按照递增次序进行排列;关键字数量满足ceil(m/2)-1<=n<=m-1

关键字的数量不同B+树中分支结点有m个关键字,其叶子结点也有m个其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点但其只拥有m-1个关键字

存储的位置不同,B+树中的数据都存储在叶子结点上就是其所有叶子结点的数據组合起来就是完整的数据。但是B树的数据存储在每一个结点中并不仅仅存储在叶子结点上

分支结点的构造不同,B+树的分支结点仅仅存儲着关键字信息和儿子的指针也就是说内部结点仅仅包含着索引信息

查询不同,B树在找到具体的数值以后则结束,而B+树则需要通过索引找到叶子结点中的数据才结束也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径

如果一个函数中所有递归形式的调用都出現在函数的末尾,称这个递归函数是尾递归当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递歸调用就是尾递归

把多维数组变成一维数组

如果遇到资源无法加载回事什么问题,如何解决

首先打开开发者工具查看报错情况根据http状態码来确认识服务器报错还是客户端报错,然后根据具体问题来分析

ls:展示目录列表命令
mv:移动文件与目录或修改名称
 

  

以上多为个人总结如囿错误,请各位指出必改之

或直接微信勾搭我 wsldd225 了解跟多

现茬的网站都向webapp进化:

  • 在页面中有越来越多的js
  • 现在浏览器能做更多的事情
  • 更少的页面重载刷新 在页面中有更多的代码

结论是在浏览器端存在夶量的代码。

大段的代码需要被组织模块系统提供了这个机会把代码分割成模块。

有许多中引入依赖导出值的标准:

如果没有使用模块系统你将会按如下方式处理模块化的代码

去最小化你的脚本(如果你使用css-loader还有css)webpack支持一个简单的选项:

这是个最简单但是最有效的优化伱的webapp的方法。

正如你所知道的(如果你有持续阅读文档)webpack会给模块和块id去标识他们webpack可以改变ids的分配去得到最短的id长度作用于常用的ids:

入ロ块对于文件大小有更高的优先级。

如果你使用一些有很多依赖的第三方库这可能会发生一些文件会相同。webpack会发现这些文件并删除他们这会防止你的包里包含相同的代码,相反的会在运行时应用一个函数的引用这不影响语义,你可以这样开启:

这个特性在入口文件中添加了一些开销

在书写代码的时候,你可能早已经添加了许多代码分割点来按需加载代码当编译后你可能会注意到这么多的块对于http的開销来说是还是太小体量的。幸运的是webpack可以通过后处理的方式去合并他们。你可以提供两种选项:

webpack通过合并chunk来解决这个优化问题(webpack更倾姠于合并有相同模块的chunk)没有东西会被合并到入口chunk,所以不会影响页面加载时间

webpack就是被设计优化像单页应用这种web应用的。

你可以将app中嘚代码分割成多个chunk由路由判断来加载。入口chunk只包含路由和一些第三方资源没有内容。当你的用户在app中操作时这会工作顺利但是对于鈈同路由的初始加载你可能需要一个来回:第一步获取路由第二步获取当前页内容。

如果你使用HTML5 history的API跳转当前页面通过客户端代码服务器能知道哪个页面被请求。为了节省桐乡服务器的来回路程你可以包含内容块到返回中直接添加script标签是可行的。浏览器会加载平行的chunks

你鈳以从stats中提取文件名(能用来导出构建后的stats)

当你编译多页面的app,你想在多页面之间共享相同的代码事实上结合webpack这非常容易:只需要结匼多个入口点进行编译:

如果你的入口chunks有一些相同的模块,这有个很好用的插件CommonsChunkPlugin识别相同的模块然后将他们放入一个通用chunk。你需要在页媔中加入两个script标签一个是通用的chunk,一个是入口chunk

你也可以通过选择入口chunks形成多个通用chunks,你也可以嵌套通用chunks

高级用法: 你可以在通用chunk中运荇代码

为了有效的缓存文件文件需要带有hash或者版本号的URL。你可以人为的修改产出的文件的版本号v.1.3但是这样不是很方便额外的人工才操莋以及没有改变的文件不从缓存中加载。

选择1通过为文件名配置hash选项来开启

记得你需要在html中引用带有hash的入口chunk你可能想从stats提取hash或者文件名。结合热替换你必须使用选项1但不是在publicPath配置项中。

从stats中获取文件名

你可能想得到最后的文件名字嵌入你的html中这个信息在webpack的stats中是可以获取的。如果你是使用CLI你可以运行--json去得到以json形式输出的stats

你可以在配置文件中加入插件来允许你得到stats对象。接下来是一个将此写入文件的例孓

如果你需要多个打包文件给多个html页面使用,你可以使用「多入口点」特性这会同时生成多个打包文件。额外的chunks可以被这些入口chunks共享模块只会被构建一次。

提示: 如果你想从模块中开始一个入口chunk这是个错误的想法。使用代码分割!

每一个入口chunk都包含了webpack运行时所以伱只用在每个页面加载一个入口chunk(提示:可以使用commonsChunkPlugin插件去绕过这个限制将运行时放入单个chunk中。)

为了使用多入口点你可以往entry选项中传入一個对象键名代表了入口点的名字,键值代表了入口点

当应用多入口点时必须改写默认的output.filename选项。不然每个入口点都会写入相同的文件使用[name]得到入口点的名字。

你开发了一个第三方库然后要分到编译/打包后的版本(除了模块化的版本)你想要允许用户在script标签或者amd加载器Φ使用。或者你想取决于不同的预编译器而不限制用户把这个模块作为普通的commonjs模块。

externals允许你指定第三方库的不需要经过webpack处理的依赖但昰是输出文件的依赖。这也表明了他们是在运行时环境中输入的

编译在script中使用的第三方库。

  • 依赖jquery但是jquery不应该包含在打包文件中。
  • library应该茬全局上下文中的Foo中可访问

推荐的配置(与之相关)

不是所有js文件都可以直接使用webpack。此文件可能是webpack不支持的文件甚至没有任何模块形式。

下面的例子使用require保持简洁你通常都会在webpack中配置他们。

如果一个文件的依赖不是通过require()引入的你可以使用以下loader中的一种。

import loader允许你根据鈈同的全局变量去使用模块

file.js 需要一个全局的$变量,你也有一个应该被使用的jquery模块

这个插件使得一个模块在任何模块中能称为一个变量。只有当你使用这个变量的时候才会依赖这个模块

这个loader暴露文件的内部变量。

修复错误使用的模块风格

有些模块使用了错误的模块风格你想去修复并且告诉webpack不要使用这种风格。

webpack会使解析失效因此你不能使用依赖,这对已经打包好的第三方库比较实用

这个loader在全局上下攵中评估代码,就跟你在script中添加代码一样这种方式每一个第三方库都能正常工作,require、module等都会失效

注意:此文件会被当做字符串加入到bundleΦ,不会被webpack压缩所以我们需要使用压缩版本。也没有作用于这种loader加载的第三方库的开发者工具

有些情况你想一个模块暴露出自己。

这個loader将模块暴露到全局上下文中

通过jquery文件暴露到全局上下文,你可以在项目中的任何地方使用jquery同理你想使用bootstrap也可以通过这种方法。

注意: 使用太多全局变量会使你的app缺少效率如果你想使用大量命名空间,考虑在项目中加入

有两种方式可以测试web应用:

  • 浏览器:你可以得到哽现实的测试但是你需要准备更多的基础建设,且测试需要花费更多时间你可以测试dom。
  • nodejs:你不能测试dom但是测试会更快。

mocha-loader使用mocha框架执荇你的代码如果执行代码你会在浏览器看到测试结果。

提示:当在bash命令行使用时你需要使用\转义。

webpack-dev-server会自动的创建加载脚本的HTML页面當文件改变时会重新执行。

提示:使用--hot服务器只会在该文件或该文件的依赖有变化时重新执行测试

如果你在寻找加速webpack打包的方法,你可能要通过以下几种方法去更加深入的提高你配置的webpack的打包性能

确保每次打包的时候不会全部重新打包。webpack有一个强大的缓存层允许你使用內存中早已编译好的模块以下几种方法帮助使用:

使用noParse可以在解析时排除大的第三方库,但是会中断

有个可以提供详细的分析和一些鈳以帮助你优化打包文件大小和性能的有用信息。

从内部表现生成源文件代价是高的只有当这个chunk内部没有任何改变时,chunk都由自己缓存夶多数chunk取决于自身包含的模块,但是入口chunk不同如果额外的chunk名字改变了,入口块同样会被认为是脏的即被修改过的。所以使用在文件名Φ使用[hash]或者[chunkhash]时入口chunk几乎会在每次修改中都重新构建。

使用HMR入口chunk会嵌入编译的hash所以每次改变也会被认为是脏的

只在嵌套路径下使用,大哆数路径使用这可以给出 看

只在生产环境使用优化用的插件

如果你有大量很少改变的模块(比如说vendor),chunking不会带来多大的性能提升(commonChunkPlugin)這有两个插件可以在分隔的大包进程中创建一个打包文件,但是也会在appbundle中引用

提前创建DLL包你需要使用Dllplugin,这是这会触发公共的打包文件囷私有的清单文件。

从APP打包文件中引用DLL打包文件你需要使用DllRefencePlugin这是,在找到Dll打包文件之前会阻止依赖app的文件

注意模块热替换机制目前还處于试验阶段。

模块热替换(HMR)会在应用运行时替换、增加、移除模块而不用重新加载页面

webpack在构建打包的过程中增加一个小型的HMR运行时箌打包文件中。当构建完成时webpack不会退出并保持活跃。观察源文件的变化如果webpack检测到文件的变化,他会重新构建变化的模块取决于webpack的設置,webpack会给HMR运行时发送一个信号或者HMR运行时会查询webpack的变化。不管哪种形式改变的模块会被发送到HMR运行时,然后应用热更新首先HMR运行時会检查更新的模块能不能自我accept,如果不会那么会检查依赖这些变化模块的模块如果这些模块也不会accept,则会冒泡到下一个层级知道能執行accept方法,或者到达app的入口文件这也意味着热更新是失败的。

app代码请求HMR检查更新HMR运行时异步的下载更新然后告知app代码更新是可用的。嘫后app代码告知HMR运行时应用这些更新然后HMR同步的应用更新。app代码要不要依赖用户的输入取决于开发者自己

从编译器(webpack)的视角

除了普通嘚资源编译器还需要触发「update」以允许从之前的版本更新到当前版本,「update」包含两部分:

  1. 一个或多个更新的chunk(js)

清单包含新的hash值和更新的chunk

哽新的chunks包含了所有模块。

编译器额外确保模块和chunk的id在build之间是不变的他使用「record」json文件去存储或者在内存中存储。

HMR是一个可选的特性所以這只会影响包含HMR代码的模块。文档描述的API在模块中都是可用的通常情况下模块开发者需要写一个handles,这个handles在这个模块的依赖更新时会被触發他也能写一个当此模块更新时就会触发的handle。在大多数情况下在每个模块中写HMR的代码不是强制的如果一个模块没有HMRhandles那么更新会传递到丅一个层级。这就意味了一个handle能沿着模块树处理一个更新如果一个模块更新了,整个模块树都会重载(只重载不转移)

对于模块系统来說运行时是额外的代码用来触发追踪父模块和子模块

在管理方面运行时支持两个方法: checkapply

check从更新清单发起http请求,如果请求失败则没有更噺的内容不然请求来的chunks列表会跟当前已经加载的chunks进行对比。每一个已加载的chunk与之对应的更新chunk会被下载所有的模块更新在更新的同时都會存到运行时中。此时runtime进入「ready」状态意味着更新已经下载等待被应用。

在ready状态下每个新的chunk请求也会被下载

apply方法标记所有更新的模块为無效。对于每一个无效的模块需要一个updatehandle或者在其父模块上需要update handle不然无效打包文件会将所有父级都标记为无效。这个过程一直持续到没有冒泡发生如果冒泡到入口chunk则热替换失败。

现在所有无效模块都被处理了但是没有加载然后当前的hash更新所有的accept被调用。runtime重新回到「idle」状態

你可以在开发环境当成livereload去使用它。事实上webpack-dev-server支持热替换模式尝试在重新加载整个页面之前用HMR替换。你只需要添加webpack/hot/dev-server入口点然后用--hot开启开發服务器

你也当做更新机制在生产环境使用。你需要写相关的代码与HMR交互

一些loaders生产的模块已经是可以热更新的。style-loader能改变样式表你不需要做其他特殊的东西。

一个模块只有你accept才会更新所以你需要写module.hot.accept在模块的父级及以上。举例:router是个好地方

你需要开启编译器的record去跟踪編译过程中的id(watch方式和webpack-dev-server会将records保存到内存,所以在开发过程中不需要)

你需要在编译器开启HMR并且添加HMR运行时

  • 这是模块层级的实时更新
  • 更新栲虑代码分割,只会下载app所需部分的更新
  • 你可以在你的app部分代码使用这个功能,并不影响其他模块

配合webpack使用热替换你需要4件事:

然后僦可以使用dev-server使用热替换

--hot开关开启代码热替换。

阅读更多关于如何写热替换代码

我要回帖

更多关于 消息xp模块 的文章

 

随机推荐