某天,公司的数据库被某运维同学用自动化脚本批量改了一批数据,并且改出问题来了,需要恢复修改的数据。由于我司采用了阿里云的云数据库 RDS,于是我登录了公司的阿里云控制台进行了恢复操作,操作过程总结如下,供需要的同学参考。
某天,公司的数据库被某运维同学用自动化脚本批量改了一批数据,并且改出问题来了,需要恢复修改的数据。由于我司采用了阿里云的云数据库 RDS,于是我登录了公司的阿里云控制台进行了恢复操作,操作过程总结如下,供需要的同学参考。
本文基于 webpack 4.8.1
webpack 彪版本号的速度真是飞快,4.0 发布没多久上去看的时候才 4.1.*,现在已经刷到 4.8.1 了,给人一种“我版本号很高了,可以安心升级了”的感觉,然而坑依然很多…尤其是 API 文档,到处可见 3.0 的陈旧信息。Code Splitting 章节点进去依然在讲 CommonsChunkPlugin ,CommonsChunkPlugin 点进去提示去看 SplitChunksPlugin,看文档的时候经常会迷失自我,心累…好了,吐槽完毕,下面是正文。需要直接复制粘贴的同学直接拉到最后~
基本类型
继承实现
macrotask 和 microtask
事件循环每次只会入栈一个 macrotask ,主线程执行完该任务后又会先检查 microtasks 队列并完成里面的所有任务后再执行 macrotask。
macrotasks: setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O, UI rendering
microtasks: process.nextTick, Promises, Object.observe, MutationObserver
https://juejin.im/entry/58d4df3b5c497d0057eb99ff
https://stackoverflow.com/questions/25915634/difference-between-microtask-and-macrotask-within-an-event-loop-context#
Event Loop
浏览器侧
1 | requestAnimationFrame(() => { |
服务端侧,setImmediate 和 setTimeout 触发先后不固定
1 | new Promise((resolve, reject) => { |
原型Function.prototype
和Function.__proto__
都指向Function.prototype
,这就是鸡和蛋的问题怎么出现的。Object.prototype.__proto__ === null
,说明原型链到Object.prototype
终止。
1 | function F() {} |
依赖
数组的方法
1 | arr.slice(); |
不同 TAB 页下通讯
BroadcastChannel,Chrome54、Firefox38 Support
1 | // tab1 |
Shared Workers,Chrome、Firefox29 Support
1 | // work.js |
localStorage
1 | // tab1 |
window.opener
盒子模型
CSS 中的每个元素都被表示为一个矩形的盒子,每个盒子有四个边:content edge, padding edge, border edge, and margin edge。
box-sizing: content-box(默认),border-box ,padding-box(deprecated)。
content-box 下盒子实际宽度不等于 width,不包括 padding 和 border 部分,布局计算不方便。border-box 下盒子实际宽度与 width 相等。
外边距合并(Margin collapsing)
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并。
浮动元素和绝对定位元素的外边距不会折叠。
上外边距和下外边距在没有 content、padding、border 间隔的情况下相遇,就会发生外边距合并,为其中一个元素添加 content、padding、border 使得上下外边距分离,即可取消叠加。
可能发生外边距合并的三种基本情况:
相邻元素之间、父元素与其第一个或最后一个子元素之间、空的块级元素。
注意:
浮动 float
将一个元素放置在 container 的左侧或右侧,允许 text 和 inline 元素环绕它。float
使用块布局,在某些情况下会修改 display
的计算值,inline -> block, inline-block -> block, inline-table -> table, table-cell -> block。对 flex/inline-flex 无效。举个 🌰 float
清除浮动
清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。
clear
举个 🌰 clearfix、multi-float-clearfix
1 | .container { |
1 | <div class="container container1"> |
块格式化上下文(Block Formatting Context,BFC)
浮动元素和绝对定位元素,非块级盒子的块级容器(例如,inline-block、table-cells 和 table-captions),以及 overflow 值不为 visiable 的块级盒子,都会为他们的内容创建新的 BFC(块级格式上下文)。
在 BFC 中,盒子从顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的 margin 值所决定的。在一个 BFC 中,两个相邻的块级盒子的垂直外边距会产生折叠。
在 BFC 中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)。对于从右到左的格式来说,则触碰到右边缘。
BFC 中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。)并且在一个 BFC 中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。
动画实现
css 实现动画与 js 不同,css 是定义关键帧,js 则是定义渲染页面与运行时间差的关系。
选择器
选择器的特殊性分成 4 个权重等级:
居中
1 | // flex 算是最优解,指哪打哪,特别方便 |
1 | // block 元素 margin |
1 | // inline 元素 text-align |
1 | // 知道宽高的情况下 |
1 | // 不知道宽高的情况下 |
css 单位
响应式布局
基于媒体查询和 rem 的响应式布局实践
meta
浏览器引擎前缀
页面导入样式时,使用 <link>
和 @import
有什么区别?@import
是 CSS 加载样式的方式, <link>
是 HTML 加载样式的方式。页面被加载的时,<link>
会同时被加载,而 @import
引用的 CSS 会等到页面被加载完再加载。
tips 碰撞检测
圣杯布局
float 实现真是被 Flex 爆的体无完肤,flex 实现 css 语义清晰,float 满满的黑科技糅杂在一起。
MouseEvent offsetX/Y, pageX/Y, clientX/Y, screenX/Y
display
position
DOCTYPE 作用
DTD(文档类型定义)是一组机器可读的规则,他定义 XML 或 HTML 的特定版本中允许有什么,不允许有什么。而 DOCTYPE 是用来描述使用哪个 DTD,保证网页以标准模式渲染,一个不含任何 DOCTYPE 的网页将会以 怪异(quirks) 模式渲染。HTML5 之前的 HTML 基于 SGML(Standard Generalized Markup Language, 标准通用标记语言)标准,需要 DTD 来保证在标准模式下渲染。HTML5 只需要 DOCTYPE 就可以保证在标准模式下渲染。
浏览器解析 HTML 方式
标准模式、怪异模式和部分怪异(近乎标准)模式。在标准模式中,浏览器根据规范显示页面;在混杂模式中,页面以一种比较宽松的向后兼容的方式显示。那些基于 Mozilla 的 Gecko 渲染引擎的,或者 Internet Explorer 8 在 strict mode 下,除了在处理表格的方式上有细微差异外,与标准模式相同。
行内元素与块级元素对比
内容上,
一般情况下,行内元素只能包含数据和其他行内元素。而块级元素可以包含行内元素和其他块级元素。这种结构上的包含继承区别可以使块级元素创建比行内元素更”大型“的结构。
格式上,
默认情况下,行内元素不会以新行开始,而块级元素会新起一行。
行内元素列表
一个行内元素只占据它对应标签的边框所包含的空间。
b, big, i, small, tt
abbr, acronym, cite, code, dfn, em, kbd, strong, samp, var
a, bdo, br, img, map, object, q, script, span, sub, sup
button, input, label, select, textarea
块级元素列表
块级元素占据其父元素(容器)的整个空间,因此创建了一个“块”。
1 | <address> 联系方式信息 |
常见的浏览器内核有哪些?
Trident:主要有 IE 浏览器以及多核浏览器
Gecko:主要有 Firefox 以及 Firefox 的衍生浏览器
WebKit:主要有 Chrome 与 Chrome 的衍生浏览器、Safari 以及多核浏览器
Presto:之前主要应用于 Opera,不过现在的 Opera 使用 WebKit 内核
EdgeHTML:Microsoft Edge,Trident 的一个分支,移除所有旧版 Internet Explorer 遗留下来的代码,并重写主要的代码以和其他现代浏览器的设计精神互通有无
HTML 语义化
在程序中, 语义指的是一段代码的含义 — 例如 “这个 HTML 的元素有什么作用,扮演了什么样的角色”。
对开发人员及团队,有利于增加代码可读性,减少差异化;
对搜索引擎,有助于爬虫抓取更多的有效信息,有利于确定上下文和各个关键字的权重,利于 SEO;
对浏览器,即使在 CSS 加载异常的情况下,也能提供一个基础的默认文档样式,方便屏幕阅读器以更有意义的方式渲染。
渲染原理
DOM Tree
,DOM Tree
的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。CSS Rule Tree
。DOM Tree
和 CSS Rule Tree
来构造 Rendering Tree。注意:Rendering Tree 渲染树并不等同于 DOM 树,因为一些像 Header 或 display:none 的东西就没必要放在渲染树中了。reflow(回流):读取或设置位置、尺寸、计算样式等等,都有可能触发 reflow。
repaint(重绘):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画, 但是元素的几何尺寸没有变。
https://gist.github.com/paulirish/5d52fb081b3570c81e3a
http://www.cnblogs.com/slly/p/6640761.html
HTTP 超文本传输协议(HyperText Transfer Protocol)
HTTP2
多路复用、二进制分帧、头部压缩、服务端推送。
HTTP/1.x 客户端需要使用多个连接才能实现并发和缩短延迟;HTTP/1.x 不会压缩请求和响应标头,从而导致不必要的网络流量;HTTP/1.x 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下;等等。
HTTP/2 通过支持标头字段压缩和在同一连接上进行多个并发交换,让应用更有效地利用网络资源,减少感知的延迟时间。具体来说,它可以对同一连接上的请求和响应消息进行交错发送并为 HTTP 标头字段使用有效编码。 HTTP/2 还允许为请求设置优先级,让更重要的请求更快速地完成,从而进一步提升性能。出台的协议对网络更加友好,因为与 HTTP/1.x 相比,可以使用更少的 TCP 连接。
这意味着与其他流的竞争减小,并且连接的持续时间变长,这些特性反过来提高了可用网络容量的利用率。 最后,HTTP/2 还可以通过使用二进制消息分帧对消息进行更高效的处理。
https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn
iframe 优缺点
优点:
样式隔离,内外样式不会冲突;低改动成本接入其他模块功能;无刷新文件上传;实现长连接,作为 Websocket 不支持浏览器的替代方案
缺点:
iframe 会阻塞主页面的 onload 事件;搜索引擎的检索程序无法解读这种页面,不利于 SEO;iframe 和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
Websocket 替代方案
DOM BOM 区别
DOM 全称是 Document Object Model,也就是文档对象模型,用来操作 HTML 中的元素。例如:document.body
、document.getElementById('someid')
、document.title = 'Welcome'
。
BOM 是 Browser Object Model,浏览器对象模型,用来控制浏览器的行为。例如,location.href = "http://www.xxxx.com"
、window.reload
。
DOM1/DOM2/DOM3 区别
DOM1 级主要定义了 HTML 和 XML 文档的底层结构。在 DOM1 中,DOM 由两个模块组成:DOM Core(DOM 核心)和 DOM HTML。其中,DOM Core 规定了基于 XML 的文档结构标准,通过这个标准简化了对文档中任意部分的访问和操作。DOM HTML 则在 DOM 核心的基础上加以扩展,添加了针对 HTML 的对象和方法,如:JavaScript 中的 Document 对象.
在 DOM1 的基础上 DOM2 引入了更多的交互能力,也支持了更高级的 XML 特性。DOM2 将 DOM 分为更多具有联系的模块。DOM2 级在原来 DOM 的基础上又扩充了鼠标、用户界面事件、范围、遍历等细分模块,而且通过对象接口增加了对 CSS 的支持。DOM1 级中的 DOM 核心模块也经过扩展开始支持 XML 命名空间。
DOM3 进一步扩展了 DOM,引入了以统一方式加载和保存文档的方法,它在 DOM Load And Save 这个模块中定义;同时新增了验证文档的方法,是在 DOM Validation 这个模块中定义的。
addEventListener、attachEvent、on 区别
attachEvent 是 IE8- 添加事件的方法,onclick 会覆盖掉之前绑定的事件,addEventListener 以事件数组的形式添加事件监听,不会覆盖掉之前的事件监听。1,2
浏览器前进/后退缓存(Backward/Forward Cache,BF Cache)
对整个 web 页面的一个浏览器会话进行了内存缓存,包括他们对 JavaScript 状态。在访问过的页面间后退和前进不需要页面加载同时保存 JavaScript 状态。这个特性,被称为 bfcache(“后退前进缓存”),使得页面导航(切换)非常快。这个状态缓存被保存直到用户关闭浏览器。
检测是否被缓存:
1 | window.addEventListener( |
https://harttle.land/2017/03/12/backward-forward-cache.html
https://developer.mozilla.org/en-US/docs/Archive/Misc_top_level/Working_with_BFCache
https://developer.mozilla.org/zh-CN/docs/Mozilla/Firefox/Releases/1.5/Using_Firefox_1.5_caching
事件的传播机制 w3c
三个阶段:首先进入捕获阶段 Window
->Document
-><html>
-><body>
,直到达到目标元素,再进入冒泡阶段,从目标元素反向沿着捕获路径回到 Window
。
parentNode 和 parentElement 的区别
在大部分情况下 parentElement === parentNode
,只有在 parentNode 不是 html element 的时候,parentElement = null。
1 | document.body.parentNode; // the <html> element |
children(HTMLCollection) 和 childNodes(NodeList) 的区别
childNodes 比 children 多包含了几个 text
节点,children 只有 html element。
如下图,children[0] === childNodes[1]
。
document.ready 实现
http 302 和 form 表单跳转区别
1 | open ~/.bash_profile |
1 | alias sb="open -a /Applications/Sublime\ Text.app" |
1 | source ~/.bash_profile |
sb.
打开当前文件夹sb file
打开当前已存在文件或文件夹