Codelet Keep code simple stupid

绘制Chrome风格的Tab栏

大约在12年左右第一次接触Sublime编辑器和Chrome浏览器的时候,对这两款软件最深刻的印象就是其非常 现代化的标签栏样式。同样作为多Tab布局应用,不同于当时我用的比较多的IE或者NotePad++,这两款软件 的Tab栏都采用了圆角梯形加底部融合过渡曲线的设计,但因为当时我也不太关注UI,就忽略这块没有深究了。 但正巧最近在研究一个东西,得知了这种Tab风格在Chromium里的实现叫做GM2TabStyle,就翻了一下源码 看看究竟是怎么绘制的,同时解答心中多年的疑惑。 代码 真实的源码太长了,而且有很多细节处理,这里就大致简化了,有兴趣的可以参看下面的Chromium源...

构建V8

V8 简介 Google V8是一款高性能的开源JavaScript解释器,就像现实中的大排量V8发动机一样,V8强力的驱动着 Web技术的方方面面,从最初的Google Chrome浏览器,到Node.js,再到MongoDB,V8已成为许多项目的 重要组成部分。 就像所有的开源C/C++工程一样,构建是第一步,下面就记录一下V8的构建方法 环境 我是在Ubuntu 16.04下编译的,V8默认会自动下载clang,这里就不列出了编译器版本了 安装 depot_tools V8所用的构建系统是GN,用于生成Ninja的构建文件,它的功能类似于CMake,用于跨平台多目标构建,GN...

VS Code Chrome debug

最近发现了一个vscode插件——vscode-chrome-debug,通过它可以直接在编辑器里调试代码,为浏览器、 Node.js、Python甚至C++提供了统一的调试方式,下面记录一下踩过的坑 添加配置 通过Add Configuration命令添加的默认配置如下 { "type": "chrome", "request": "launch", "name": "Launch Chrome", "url": "http://localhost:8080", "webRoot": "${workspaceFolder}" } 遇到的问题 开启服务器之后,...

JavaScript绑定函数

在JS中,我们经常需要指定函数的this值,通常我们会用call/apply这样的函数为this绑定值, 除此之外函数还可以通过bind方法绑定this,现在就来深入分析一下bind函数。 先看下面的例子 function test () {} test.call(obj, 0, 1) test.apply(obj, [0, 1]) var fn = test.bind(obj, 0, 1) fn() 可见,不同于call/apply在调用时指定this,bind完成绑定后会返回一个函数,当调用此函数时 原函数才会执行,这种方式很适合为回调函数绑定上下文,因此在Web环境中被...

JavaScript扩展/剩余语法

ES6又新增了一种运算符——...,称为扩展/剩余操作符,实际上这个操作符有两种语义,分别用于数组或 对象的属性填充以及将函数实参转化成数组形式。 还是老规矩,根据Babel生成的代码来分析语义: let arr = [1, 2, 3] let dst = [0, ...arr, 4] 会生成以下代码 var arr = [1, 2, 3]; var dst = [0].concat(arr, [4]); 除了扩展数组,对象也可以使用扩展语法 let obj = { b: 'bbb' } let dst = { a: 'aaa', ...obj, c: ...