赞
踩
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
性能评级工具(PageSpeed 或 YSlow)
css
js
createElement
创建并添加节点,最后一次性加入dom事件委托
绑定父节点实现,利用了事件冒泡的特性innerHTML
代替appendChild
Reflow
)网络
cookie
大小,尽量用localStorage
代替主要分成两部分:渲染引擎(layout engineer
或Rendering Engine
)和JS
引擎
渲染引擎:负责取得网页的内容(HTML
、XML
、图像等等)、整理讯息(例如加入CSS
等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核
JS
引擎则:解析和执行javascript
来实现网页的动态效果
最开始渲染引擎和JS
引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎
常见的浏览器内核有哪些
Trident
内核:IE,MaxThon,TT,The World,360
,搜狗浏览器等。[又称MSHTML]Gecko
内核:Netscape6
及以上版本,FF,MozillaSuite/SeaMonkey
等Presto
内核:Opera7
及以上。 [Opera
内核原为:Presto,现为:Blink
;]Webkit
内核:Safari,Chrome
等。 [ Chrome
的Blink
(WebKit
的分支)]withCredentials = true
4k
;5M
或更大,因不同浏览器大小不同;画表对比:
特性 | cookie | localStorage | sessionStorage | indexDB |
---|---|---|---|---|
数据生命周期 | 一般由服务器生成,可以设置过期时间 | 除非被清理,否则一直存在 | 页面关闭就清理 | 除非被清理,否则一直存在 |
数据存储大小 | 4K | 5M | 5M | 无限 |
与服务端通信 | 每次都会携带在 header 中,对于请求性能影响 | 不参与 | 不参与 | 不参与 |
对于 cookie
,还需要注意安全性:
属性 | 作用 |
---|---|
value | 如果用于保存用户登录态,应该将该值加密,不能使用明文的用户标识 |
http-only | 不能通过 JS 访问 Cookie ,减少 XSS 攻击 |
secure | 只能在协议为 HTTPS 的请求中携带 |
same-site | 规定浏览器不能在跨域请求中携带 Cookie ,减少 CSRF 攻击 |
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD
规范则是非同步加载模块,允许指定回调函数
AMD
推荐的风格通过返回一个对象做为模块对象,CommonJS
的风格通过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
AMD
es6模块 CommonJS、AMD、CMD
CommonJS
的规范中,每个 JavaScript
文件就是一个独立的模块上下文(module context
),在这个上下文中默认创建的属性都是私有的。也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。CommonJS
是同步加载模块,在浏览器中会出现堵塞情况,所以不适用AMD
异步,需要定义回调define
方式es6
一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export
关键字输出该变量 es6
还可以导出类、方法,自动适用严格模式模块化的演进过程
模块化规范的出现 模块化规范+模块加载器
1. AMD 异步加载
// require.js 就是使用的这种风格 define(['a.js', 'b.js'], function(A, B) { // do something }) // 实现思路:建一个node节点, script标签 var node = document.createElement('script') node.type = 'text/javascript' node.src = '1.js' // 1.js 加载完后onload的事件 node.addEventListener('load', function(evt) { // 开始加载 2.js var node2 = document.createElement('script') node2.type = 'text/javascript' node2.src = '2.js' // 插入 2.js script 节点 document.body.appendChild(node2) }) // 将script节点插入dom中 document.body.appendChild(node);
2. CMD sea.js
define(function() {
var a = require('2.js')
console.log(33333)
})
3. commonjs 服务端规范
同步
的方式加载模块 node的执行机制是在启动时去加载模块 在执行阶段不需要加载模块4. ESmodules 浏览器模块化规范
浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时,获取缓存的流程如下
http header
判断它是否命中强缓存,如果命中,则直接从本地获取缓存资源,不会发请求到服务器;request header
验证这个资源是否命中协商缓存,称为http
再验证,如果命中,服务器将请求返回,但不返回资源,而是告诉客户端直接从缓存中获取,客户端收到返回后就会从缓存中获取资源;ctrl+f5
强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;f5
刷新网页时,跳过强缓存,但是会检查协商缓存;强缓存
Expires
(该字段是 http1.0
时的规范,值为一个绝对时间的 GMT
格式的时间字符串,代表缓存资源的过期时间)Cache-Control:max-age
(该字段是 http1.1
的规范,强缓存利用其 max-age
值来判断缓存资源的最大生命周期,它的值单位为秒)协商缓存
Last-Modified
(值为资源最后更新时间,随服务器response返回,即使文件改回去,日期也会变化)If-Modified-Since
(通过比较两个时间来判断资源在两次请求期间是否有过修改,如果没有修改,则命中协商缓存)ETag
(表示资源内容的唯一标识,随服务器response
返回,仅根据文件内容是否变化判断)If-None-Match
(服务器通过比较请求头部的If-None-Match
与当前资源的ETag
是否一致来判断资源是否在两次请求之间有过修改,如果没有修改,则命中协商缓存)重绘和回流会在我们设置节点样式时频繁出现,同时也会很大程度上影响性能。
color
就叫称为重绘以下几个动作可能会导致性能问题:
window
大小重绘和回流其实也和 Eventloop
有关。
Eventloop
执行完 Microtasks
后,会判断 document
是否需要更新,因为浏览器是 60Hz
的刷新率,每 16.6ms
才会更新一次。resize
或者 scroll
事件,有的话会去触发事件,所以 resize
和 scroll
事件也是至少 16ms
才会触发一次,并且自带节流功能。media query
requestAnimationFrame
回调IntersectionObserver
回调,该方法用于判断元素是否可见,可以用于懒加载上,但是兼容性不好 更新界面requestIdleCallback
回调如何减少重绘和回流:
transform
替代 top
visibility
替换display: none
,因为前者只会引起重绘,后者会引发回流(改变了布局)table
布局,可能很小的一个小改动会造成整个 table
的重新布局requestAnimationFrame
CSS
选择符从右往左匹配查找,避免节点层级过多video
标签来说,浏览器会自动将该节点变为图层。css
表达式(expression
),因为每次调用都会重新计算值(包括加载页面)css
属性简写,如:用 border
代替 border-width
, border-style
, border-color
elem.className
和 elem.style.cssText
代替 elem.style.xxx
display:"none"
),操作完成后再显示DOM
节点时,使用DocumentFragment
创建完后一次性的加入document
Layout
属性值,如:var left = elem.offsetLeft;
这样,多次使用 left
只产生一次回流设置节点为图层的方式有很多,我们可以通过以下几个常用属性可以生成新图层
will-change
video
、iframe
标签可利用performance.timing
看各个步骤的耗时: 白屏时间:performance.timing.responseStart - performance.timing.navigationStart
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
新增功能:HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加
移除的元素:
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
<!--
width 设置viewport宽度,为一个正整数,或字符串‘device-width’
device-width 设备宽度
height 设置viewport高度,一般设置了宽度,会自动解析出高度,可以不用设置
initial-scale 默认缩放比例(初始缩放比例),为一个数字,可以带小数
minimum-scale 允许用户最小缩放比例,为一个数字,可以带小数
maximum-scale 允许用户最大缩放比例,为一个数字,可以带小数
user-scalable 是否允许手动缩放
-->
延伸提问:怎样处理 移动端 1px 被 渲染成 2px问题?
!important > inline > id > class > tag > * > inherit > default
同级别的后写的优先级高。
相同class样式,css中后写的优先级高,和html中的class名字前后无关
text-algin: center
line-height
等于容器height
;display: flex; algin-items: center;
浮动的影响: (1)由于浮动元素脱离了文档流,所以父元素的高度无法被撑开,影响了与父元素同级的元素 (2)与浮动元素同级的非浮动元素会跟随其后,因为浮动元素脱离文档流不占据原来的位置 (3)如果该浮动元素不是第一个浮动元素,则该元素之前的元素也需要浮动,否则容易影响页面的结构显示 清除浮动的3个方法:
clear: both
清除浮动在浮动元素后面放一个空的div标签,div设置样式clear:both来清除浮动。它的优点是简单,方便兼容性好,但是一般情况下不建议使用该方法,因为会造成结构混乱,不利于后期维护。
after
来清除浮动给父元素添加了:after伪元素,通过清除伪元素的浮动,达到撑起父元素高度的目的
.clearfix:after{
content: "";
display: block;
visibility: hidden;
clear: both;
}
overflow
属性当给父元素设置了overflow样式,不管是overflow:hidden或overflow:auto都可以清除浮动只要它的值不为visible就可以了,它的本质就是建构了一个BFC,这样使得达到撑起父元素高度的效果
布局垂直方向上两个元素的间距不等于margin的和,而是取较大的一个
现象:上方元素设置margin-bottom: 20px
,下方元素设置margin-top: 10px
,实际的间隔是20px
避免办法:同级元素不要同时设置,可都设置margin-bottom或margin-top的一个,或者设置padding
现象:父元素设置margin-top: 20px
,下方元素设置margin-top: 10px
,实际的间隔是20px
避免办法:父元素有padding-top,或者border-top。或者触发BFC
要求:左边右边固定宽度,中间自适应
<style> .left{ float: left; width: 300px; height: 100px; background: #631D9F; } .right{ float: right; width: 300px; height: 100px; background: red; } .center{ margin-left: 300px; margin-right: 300px; background-color: #4990E2; } </style> <body> <div class="left">左</div> <div class="right">右</div> <div class="center">中</div> <!-- center如果在中间,则right会被中间block的元素挤到下一行 --> </body>
<style> .left{ position: absolute; left: 0; width: 300px; background-color: red; } .center{ position: absolute; left: 300px; right: 300px; background-color: blue; } .right{ position: absolute; right: 0; width: 300px; background-color: #3A2CAC; } </style> <body> <div class="left">左</div> <div class="center">中</div> <div class="right">右</div> </body>
<style> .main { display: flex; } .left{ width: 300px; } .center{ flex-grow: 1; flex-shrink: 1; } .right{ width: 300px; } </style> <body class="main"> <div class="left">左</div> <div class="center">中</div> <div class="right">右</div> </body>
BFC
是Block Formatting Context
,也就是块级格式化上下文
,是用于布局块级盒子的一块渲染区域。
简单来说,BFC 实际上是一块区域,在这块区域中遵循一定的规则,有一套独特的渲染规则。
文档流其实分为普通流
、定位流
和浮动流
和三种,普通流其实就是指BFC中的FC,也即格式化上下文
。
普通流:元素按照其在 HTML 中的先后位置从上到下、从左到右布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行。
格式化上下文:页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用
§ BFC的几条规则: 1)BFC 区域内的元素外边距会发生重叠。
2)BFC 区域内的元素不会与浮动元素重叠。
3)计算 BFC 区域的高度时,浮动元素也参与计算。
4)BFC 区域就相当于一个容器,内部的元素不会影响到外部,同样外部的元素也不会影响到内部。
§ BFC的应用:
§ 触发BFC的方式:
弹性布局,Flex 布局将成为未来布局的首选方案。 兼容性:
基本概念:
flex-derection: column
设置主轴为垂直方向。容器属性:
项目的属性:
order:项目的排列顺序,数值越小,排列越靠前,默认为0。
flex-grow:放大比例,默认为0,指定元素分到的剩余空间的比例。
flex-shrink:缩小比例,默认为1,指定元素分到的缩减空间的比例。
flex-basis:分配多余空间之前,项目占据的主轴空间,默认值为auto
flex:grow, shrink 和 basis的简写,默认值为0 1 auto
align-self:单个项目不一样的对齐方式,默认值为auto,auto | flex-start | flex-end | center | baseline | stretch;
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
1. transition过渡 将变化按照设置的时间长度缓慢执行完毕,而不是立即执行。
delay
的真正意义在于,它指定了动画发生的顺序,使得多个不同的transition可以连在一起,形成复杂效果。
transition的值是简写,扩展开依次是:
/* 变化在1s过渡 */
transition: 1s;
/* 指定过渡属性 */
transition: 1s height;
/* 指定多个属性同时发生过渡 */
transition: 1s height, 1s width;
/* 指定delay延时时间 */
transition: 1s height, 1s 1s width;
/* 指定状态变化速度 */
transition: 1s height ease;
/* 指定自定义移状态变化速度 */
transition: 1s height cubic-bezier(.83,.97,.05,1.44);
transition的局限 transition的优点在于简单易用,但是它有几个很大的局限。
CSS Animation就是为了解决这些问题而提出的。
2. animation动画
.element:hover {
animation: 1s rainbow;
/*
animation: 1s rainbow infinite; 关键字infinite让动画无限次播放
animation: 1s rainbow 3; 指定动画播放次数
*/
}
@keyframes rainbow {
0% { background: #c00; }
50% { background: orange; }
100% { background: yellowgreen; }
}
其中animation的值是简写,扩展开依次是:
webpack
是一个模块打包工具,你可以使用webpack管理你的模块依赖,并编绎输出模块们所需的静态文件。loader
。编写一个loader:
loader
就是一个node
模块,它输出了一个函数。当某种资源需要用这个loader
转换时,这个函数会被调用。并且,这个函数可以通过提供给它的this
上下文访问Loader API
。 reverse-txt-loader
。
解析顺序:从下向上,从右向左
// 定义
module.exports = function(src) {
//src是原文件内容(abcde),下面对内容进行处理,这里是反转
var result = src.split('').reverse().join('');
//返回JavaScript源码,必须是String或者Buffer
return `module.exports = '${result}'`;
}
//使用
{
test: /\.txt$/,
loader: 'reverse-txt-loader'
}
§ base
module.exports = { entry: { app: './src/main.js' }, output: { path: path.resolve(__dirname, '../dist'), filename: '[name].js', publicPath: '' }, resolve: { extensions: ['.js', '.vue', '.json', '.css', '.less'], alias: { '@': resolve('src'), src: resolve('src'), static: resolve('static') } }, module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.js$/, loader: 'babel-loader', include: [resolve('src'), resolve('test')] }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', query: { limit: 1, name: utils.assetsPath(`img/[name].[ext]`) }, include: /nobase64/ }, { test: /\.svg(\?\S*)?$/, loader: 'svg-sprite-loader', query: { prefixize: true, name: '[name]-[hash]' }, include: [resolve('src')], exclude: /node_modules|bower_components/ } ] }, plugins: [ new VueLoaderPlugin(), new ProgressBarPlugin({ format: 'build [:bar] ' + chalk.green.bold(':percent') + ' (:elapsed seconds) : (:msg)', clear: false, width: 60 }) ] };
§ dev
var path = require('path'); var utils = require('./utils'); var webpack = require('webpack'); var config = require('../config'); var merge = require('webpack-merge'); var baseWebpackConfig = require('./webpack.base.conf'); var CopyWebpackPlugin = require('copy-webpack-plugin'); var MyPlugin = require('./htmlPlugin'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var MiniCssExtractPlugin = require('mini-css-extract-plugin'); var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); module.exports = merge(baseWebpackConfig, { mode: 'development', externals: { vue: 'Vue' }, devtool: '#source-map', output: { path: config.build.assetsRoot, filename: utils.assetsPath(`js/[name].js`), chunkFilename: utils.assetsPath(`js/[name].js`) }, plugins: [ new webpack.HotModuleReplacementPlugin(), new FriendlyErrorsPlugin(), new CopyWebpackPlugin([ { from: path.resolve(__dirname, `../static`), to: path.resolve(config.dev.assetsPublicPath, `/dist/static`) } ]), new HtmlWebpackPlugin({ alwaysWriteToDisk: true, filename: 'index.html', template: path.resolve(__dirname, `../src/index.html`), // 模板路径 inject: false, excludeChunks: [], baseUrl: '', currentEnv: 'development', envName: 'local', curentBranch: '' }), new HtmlHardDisk() ], optimization: { /* 作用域提升插件 [注意] 这个插件在 mode: production 时时默认开启的 这样配置时为了在 development 时也开启 https://webpack.js.org/configuration/optimization/#optimizationconcatenatemodules */ concatenateModules: true, splitChunks: { cacheGroups: { commons: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' }, styles: { name: 'styles', test: /\.css$/, chunks: 'all', enforce: true } } }, runtimeChunk: { name: 'manifest' }, minimizer: [ // 代码压缩UglifyJsPlugin的升级版 new TerserPlugin({ cache: true, parallel: true, terserOptions: { sourceMap: true, warnings: false, compress: { // warnings: false }, ecma: 6, mangle: true }, sourceMap: true }), new OptimizeCSSPlugin({ cssProcessorOptions: { autoprefixer: { browsers: 'last 2 version, IE > 8' } } }) ] } }
§ prod
var path = require('path'); var utils = require('./utils'); var webpack = require('webpack'); var merge = require('webpack-merge'); var baseWebpackConfig = require('./webpack.base.conf'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin'); var CopyWebpackPlugin = require('copy-webpack-plugin'); var HtmlHardDisk = require('html-webpack-harddisk-plugin'); var MiniCssExtractPlugin = require('mini-css-extract-plugin'); var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); module.exports = merge(baseWebpackConfig, { mode: 'production', externals: { vue: 'Vue' }, output: { path: config.build.assetsRoot, filename: utils.assetsPath(`js/[name].js`), chunkFilename: utils.assetsPath(`js/[name]-[chunkhash].js`) }, plugins: [ // http://vuejs.github.io/vue-loader/en/workflow/production.html new webpack.DefinePlugin({ 'process.env': env }), // extract css into its own file new MiniCssExtractPlugin({ filename: utils.assetsPath('css/[name].css'), allChunks: true }), // copy custom static assets new CopyWebpackPlugin([ { from: path.resolve(__dirname, `../static`), to: path.resolve(__dirname, `../dist/static`) } ]), new HtmlWebpackPlugin({ alwaysWriteToDisk: true, filename: 'index.html', template: path.resolve(__dirname, `../src/index.html`), // 模板路径 inject: false, baseUrl: '', currentEnv: 'production', envName: 'prod', curentBranch: '' }), new BundleAnalyzerPlugin() ], optimization: { minimizer: [ // 代码压缩UglifyJsPlugin的升级版 new TerserPlugin({ // cache: true, parallel: true, terserOptions: { warnings: false, compress: { }, // ecma: 6, mangle: true }, sourceMap: true }), new OptimizeCSSPlugin({ cssProcessorOptions: { autoprefixer: { browsers: 'last 2 version, IE > 8' } } }) ], splitChunks: { cacheGroups: { commons: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' } } }, runtimeChunk: { name: 'manifest' } } };
optimization.splitChunks(4之前老版本用CommonsChunkPlugin)
UglifyJsPlugin
require.ensure
=css
文件,单独打包如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
背景: 项目中,有一个入口文件,相当于一棵树的主干,入口文件有很多依赖的模块,相当于树枝。实际情况中,虽然依赖了某个模块,但其实只使用其中的某些功能。通过 tree-shaking,将没有使用的模块摇掉,这样来达到删除无用代码的目的。
思路: 基于ES6提供的模块系统对代码进行静态分析,并将代码中的死代码(dead code)移除的一种技术。因此,利用Tree Shaking技术可以很方便地实现我们代码上的优化,减少代码体积。
Tree Shaking 摇树 是借鉴了 rollup 的实现。
摇树删除代码的原理: webpack基于ES6提供的模块系统,对代码的依赖树进行静态分析,把import & export标记为3类:
为何基于es6模块实现(ES6 module 特点:):
条件:
配置方法:
{
// sideEffects如果设为false,webpack就会认为所有没用到的函数都是没副作用的,即删了也没关系。
"sideEffects": false,
// 设置黑名单,用于防止误删代码
"sideEffects": [
// 数组里列出黑名单,禁止shaking下列代码
"@babel/polly-fill",
"*.less",
// 其它有副作用的模块
"./src/some-side-effectful-file.js"
],
}
tree-shaking 摇掉代码中未使用的代码 在生产模式下自动开启
tree-shaking并不是webpack中的某一个配置选项,是一组功能搭配使用后的优化效果,会在生产模式下自动启动
// 在开发模式下,设置 usedExports: true ,打包时只会标记出哪些模块没有被使用,不会删除,因为可能会影响 source-map的标记位置的准确性。 { mode: 'develpoment', optimization: { // 优化导出的模块 usedExports: true }, } // 在生产模式下默认开启 usedExports: true ,打包压缩时就会将没用到的代码移除 { mode: 'production', // 这个属性的作用就是集中配置webpack内部的优化功能 optimizition: { // 只导出外部使用的模块成员 负责标记枯树叶 usedExports: true, minimize: true, // 自动压缩代码 负责摇掉枯树叶 /** * webpack打包默认会将一个模块单独打包到一个闭包中 * webpack3中新增的API 将所有模块都放在一个函数中 ,尽可能将所有模块合并在一起, * 提升效率,减少体积 达到作用域提升的效果 */ concatenateModules: true, }, }
使用摇树的注意事项:
tree-shaking & babel 使用babel-loader处理js代码会导致tree-shaking失效的原因:
解决办法:
收到配置preset-env的modules: false,确保不会开启自动转换的插件(在最新版本的babel-loader中自动帮我们关闭了转换成commonjs规范的功能)
presets: [
['@babel/preset-env', {module: 'commonjs'}]
]
class Middleware { constructor() { this.middlewares = []; } use(fn) { if(typeof fn !== 'function') { throw new Error('Middleware must be function, but get ' + typeof fn); } this.middlewares.push(fn); return this; } compose() { const middlewares = this.middlewares; return dispatch(0); function dispatch(index) { const middleware = middlewares[index]; if (!middleware) {return;} try{ const ctx = {}; const result = middleware(ctx, dispatch.bind(null, index + 1)); return Promise.resolve(result); } catch(err) { return Promise.reject(err); } } } } // 使用 const middleware = new Middleware(); middleware.use(async (ctx, next) => { console.log(1); await next(); console.log(2); }); middleware.use(async (ctx, next) => { console.log(3); await next(); console.log(4); }); middleware.compose();// 1 3 4 2
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
OSI是一个定义良好的协议规范集,并有许多可选部分完成类似的任务。它定义了开放系统的层次结构、层次之间的相互关系以及各层所包括的可能的任务,作为一个框架来协调和组织各层所提供的服务。
OSI参考模型并没有提供一个可以实现的方法,而是描述了一些概念,用来协调进程间通信标准的制定。即OSI参考模型并不是一个标准,而是一个在制定标准时所使用的概念性框架。
应用层(Application Layer)提供为应用软件而设计的接口,以设置与另一应用软件之间的通信。例如:HTTP、HTTPS、FTP、Telnet、SSH、SMTP、POP3等。
表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式。
会话层(Session Layer)负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接。
传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。
网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。网络表头包含了网络资料。例如:互联网协议(IP)等。
数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。
分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media access control,MAC)子层。
物理层(Physical Layer)在局部局域网上发送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机接口卡等。
SYN
报文段发送连接请求,确定服务端是否开启端口准备连接。状态设置为 SYN_SEND
;SYN+ACK
报文段给客户端,状态设置为 SYN_RECV
;SYN+ACK
报文段,向服务器发送 ACK
报文段表示确认。此时客户端和服务器都设置为 ESTABLISHED
状态。连接建立,可以开始数据传输了。翻译成大白话就是: 客户端:你能接收到我的消息吗? 服务端:可以的,那你能接收到我的回复吗? 客户端:可以,那我们开始聊正事吧。
为什么是3次?:避免历史连接,确认客户端发来的请求是这次通信的人 为什么不是4次?:3次够了第四次浪费
GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1
Host: www.w3.org
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Referer: https://www.google.com.hk/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: authorstyle=yes
If-None-Match: "2cc8-3e3073913b100"
If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT
name=qiu&age=25
HTTP/1.1 200 OK
Date: Tue, 08 Jul 2014 05:28:43 GMT
Server: Apache/2
Last-Modified: Wed, 01 Sep 2004 13:24:52 GMT # 最后修改时间,用于协商缓存
ETag: "40d7-3e3073913b100" # 文件hash,用于协商缓存
Accept-Ranges: bytes
Content-Length: 16599
Cache-Control: max-age=21600 # 强缓存(浏览器端)最大过期时间
Expires: Tue, 08 Jul 2014 11:28:43 GMT # 强缓存(浏览器端)过期时间
P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"
Content-Type: text/html; charset=iso-8859-1
{"name": "qiu", "age": 25}
§ http1.0 vs http1.1
Cache-Control
等缓存相关头(看下面详细介绍);range
可用于断点续传
,它支持只请求资源的某个部分,可用于断点续传
。请求头
试探一下服务器,再决定要不要发请求体
)** 6. http1.x vs http2.0**
用于判断强缓存
,也就是是否直接取在客户端缓存文件,不请求后端。
请求头和响应头都可以使用。
请求时的缓存指令包括:no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached, 响应消息中的指令包括:public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。
常用指令含义如下:
no-cache
:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。no-store
:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。public
:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。private
:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。max-age
:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。HTTPS = HTTP + 加密 + 认证 + 完整性保护
http的不足
:
https
就是为了解决上述http协议的安全性问题诞生的。https并非是应用层的新协议,是基于http协议的,将http和tcp协议接口部分用SSL
和TLS
协议代替而已。
http: IP ➜ TCP ➜ HTTP(应用层)
https: IP ➜ TCP ➜ SSL ➜ HTTP(应用层)
§ 加密
对称加密:用同一个密钥加密、解密。常用对称加密算法:AES,RC4,3DES 非对称加密:用一个密钥加密的数据,必须使用另一个密钥才能解密。常用非对称加密算法:RSA,DSA/DSS
常用HASH算法:MD5,SHA1,SHA256
其中非对称加密
算法用于在握手过程中加密生成的密码,对称加密
算法用于对真正传输的数据进行加密,而HASH
算法用于验证数据的完整性。
由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。
非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。
§ CA 证书包含的信息::
CA(Certification Authority证书颁发机构)
§ https加密通信的流程:
下图表示https加密通信的过程:
浏览器页面有哪三层构成,分别是什么,作用是什么?
HTML5的优点与缺点?
Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
HTML5有哪些新特性、移除了哪些元素?
你做的网页在哪些浏览器测试过,这些浏览器的内核分别是什么?
每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗?
说说你对HTML5认识?(是什么,为什么)
对WEB标准以及W3C的理解与认识?
HTML全局属性(global attribute)有哪些?
说说超链接target属性的取值和作用?
iframe有哪些缺点?
Label的作用是什么,是怎么用的?
如何实现浏览器内多个标签页之间的通信?
谈谈你对canvas的理解?
解释一下CSS的盒子模型?
请你说说CSS选择器的类型有哪些,并举几个例子说明其用法?
请你说说CSS有什么特殊性?(优先级、计算特殊值)
常见浏览器兼容性问题与解决方案?
列出display的值并说明他们的作用?
如何居中div, 如何居中一个浮动元素?
请列举几种清除浮动的方法(至少两种)?
block,inline和inlinke-block细节对比?
什么叫优雅降级和渐进增强?
说说浮动元素会引起的问题和你的解决办法
你有哪些性能优化的方法?
为什么要初始化CSS样式?
CSS样式表根据所在网页的位置,可分为哪几种样式表?
请你说说em与rem的区别?
js的各种位置,比如clientHeight,scrollHeight,offsetHeight ,以及scrollTop, offsetTop,clientTop的区别?
js拖拽功能的实现
异步加载js的方法
js的防抖与节流
说一下闭包
说说你对作用域链的理解
JavaScript原型,原型链 ? 有什么特点?
请解释什么是事件委托/事件代理
Javascript如何实现继承?
函数执行改变this
babel编译原理
函数柯里化
说一下类的创建和继承
说说前端中的事件流
如何让事件先冒泡后捕获
说一下图片的懒加载和预加载
js的new操作符做了哪些事情
改变函数内部this指针的指向函数(bind,apply,call的区别)
Ajax解决浏览器缓存问题
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式。
Vue中 key 值的作用
Vue 组件中 data 为什么必须是函数?
vuex的State特性是?
介绍一下Vue的响应式系统
computed与watch的区别
介绍一下Vue的生命周期
为什么组件的data必须是一个函数
组件之间是怎么通信的
Vue.cli中怎样使用自定义的组件?有遇到过哪些问题吗?
Vue如何实现按需加载配合webpack设置
简单描述每个周期具体适合哪些场景
scss是什么?在Vue.cli中的安装使用步骤是?有哪几大特性?
聊聊你对Vue.js的template编译的理解?
Vue 路由跳转的几种方式
Vue如何实现按需加载配合webpack设置?
Vue的路由实现:hash模式和history模式
Vue与Angular以及React的区别?
Vue路由的钩子函数
什么是Vue的计算属性?
React单项数据流
react生命周期函数和react组件的生命周期
react和Vue的原理,区别,亮点,作用
reactJs的组件交流
有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢
项目里用到了react,为什么要选择react,react有哪些好处
怎么获取真正的dom
选择react的原因
react的生命周期函数
setState之后的流程
react高阶组件知道吗?
React的jsx,函数式编程
react的组件是通过什么去判断是否刷新的
如何配置React-Router
路由的动态加载模块
Redux中间件是什么东西,接受几个参数
redux请求中间件如何处理并发
跨标签页通讯
浏览器架构
浏览器下事件循环(Event Loop)
从输入 url 到展示的过程
重绘与回流
存储
Web Worker
V8垃圾回收机制
内存泄露
reflow(回流)和repaint(重绘)优化
如何减少重绘和回流?
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
localStorage 与 sessionStorage 与cookie的区别总结
http多路复用
cookie可设置哪些属性?
正向代理和反向代理
HTTPS和HTTP的区别
HTTP版本
从输入URL到页面呈现发生了什么?
HTTP缓存
缓存位置
强缓存
协商缓存
缓存的资源在那里
用户行为对浏览器缓存的影响
缓存的优点
不同刷新的请求执行过程
为什么会有跨域问题
如何解决跨域
访问控制场景(简单请求与非简单请求)
withCredentials 属性
服务器如何设置CORS
URL类中的常用方法
二叉树层序遍历
B树的特性,B树和B+树的区别
尾递归
如何写一个大数阶乘?递归的方法会出现什么问题?
把多维数组变成一维数组的方法
说一下冒泡快排的原理
Heap排序方法的原理?复杂度?
几种常见的排序算法,手写
数组的去重,尽可能写出多个方法
如果有一个大的数组,都是整型,怎么找出最大的前10个数
最后
跳槽是升职涨薪最直接有效的方式,备战2021金九银十,各位做好面试造火箭,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在激烈竞争中又可以夺目不少。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
如果你需要这份完整版的面试笔记,可以点击这里直达领取方式!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。