2022-09


用好 TypeScript,请再深入一些

TypeScript 已经成为前端编程语言的事实标准。但我从大量的 Code Review 和面试经历中发现,真正能深入使用 TypeScript 的开发其实并不多。如果你不知道 ReturnType<T> 的作用和实现,或许这篇文章也适合你。 当然,我们花大量时间去学习一门语…
2022-09-09

2022-05


电影《Moneyball》观后

「电影剧照」:虽然皮特打趣说“开你玩笑的”,但连续输球后他其实压力非常大,皮特或许也是想从小胖子那儿得到一些信心。电影中类似的微妙片段很多,好电影充满了这些神来之笔的细节。 今天是劳动节,也是五一放假的第二天。在连续两天的高强度学习后,晚上打算放松一会。熄灯拉窗帘沉浸式地带着有…
2022-05-01

2022-03


如何做好 Code Review

作为技术工作者,你会发现我们的工作中有很多看似“玄学"的部分。比如性能优化,比如技术管理,比如这篇文章要说的 Code Review。对于这些技术领域,似乎每个人都有自己的一些经验,但真正能把这些事情做好的公司、团队、个人据我了解又比较稀少。以 Code Review 为例,国…
2022-03-27

2022-02


Typescript 中的断言函数

Typescript 3.9 在类型系统中实现了对断言函数的支持。断言函数是指当异常发生的时候会抛出错误的函数。通过使用断言签名,我们可以告诉 Typescript 某个函数应该被当做断言函数。 一个例子:document.getElementById() 方法 让我们来看一个…
2022-02-19

2021-08


前端高效工作工具篇:用 Chrome 插件高效管理输入源

前面一篇介绍 Vimium 插件的文章中有提到,前端开发每天工作逃不开编辑器和浏览器。在介绍完 Vim之后,顺着 Vimium 插件,今天继续推荐一些可以提高生产力的 chrome 插件。"前端高效工作"系列后面几篇文章会介绍 Chrome 插件开发、Chrome Devtoo…
2021-08-01

2021-07


前端高效工作工具篇:在 Chrome 中使用 Vim

作为一个前端开发,用得最多的两类软件应该就是编辑器和浏览器了。编辑器我们有 VSCode、Vim,浏览器我们会选择 Chrome。那有没有可能在 Chrome 中使用 Vim?借助 Vim 的快捷键来提升浏览体验?有,这就是今天要介绍的 Vimium 插件。 Vimium 是一…
2021-07-25

前端高效工作工具篇:常用的 Vim 配置和插件

在默认配置下,如果掌握了 Vim 的 常用命令 已经可以进行非常高效的文本编辑了。但如果你想更进一步,其实可以稍微花点时间学习一下 Vim 的自定义配置和插件使用。它会让你的 Vim 使用体验更好,编辑效率更高。 自定义 Vim 配置 我们可以在用户目录(~)下新增 .vimr…
2021-07-18

Typescript 中的 ?. 可选链操作符

Typescript 3.7 增加了对 ?. 操作符的支持,也被称为可选链操作符。我们可以使用可选链链式地访问一个对象上可能为 null 或 undefined 的属性,并且不用检查中间的属性是否为空。 可选链不是 Typescript 中特定的语法。?. 操作符已经作为 ES…
2021-07-04

2021-06


Typescript 中的 ?? 空值合并运算符

Typescript 3.7 中增加了对 ?? 运算符的支持,它被称为空值合并运算符(nullish coalescing operator)。我们可以使用这个操作符来给可能是 null 或者 undefined 的值提供一个备用值(fallback)。 Javascript …
2021-06-27

Typescript 中的 Omit 帮助类型

在 3.5 版本中, Typescript 增加了 Omit<T, K> 帮助类型,作为 lib.es5.d.ts 类型定义文件的一部分和 Typescript 编译器一起发布。Omit<T, K> 允许我们通过从一个对象中删除特定的属性来创建一个新的对象类型。 Omit<T,…
2021-06-20

Typescript 中字面量表达式的 Const 断言

Typescript 3.4 中新增了 const 断言。const 断言是一种特殊的类型断言,它使用了 const 关键字而不是具体的类型名称。在这篇文章中,我会解释 const 断言是如何工作的,以及我们为什么需要使用它。 const 断言的产生缘由 假设我们写了下面的 f…
2021-06-13

Typescript 中的只读数组和元组类型

Typescript 3.4 增加了一些语法糖使得处理只读的数组和元组类型更容易。我们现在可以使用 readonly 修饰符来创建只读的数组类型(比如 readonly string[]),或只读的元组类型(比如 readonly [number, number])。 Type…
2021-06-06

2021-05


Typescript 中的 --showConfig 编译器选项

TypeScript 3.2 给 tsc 添加了新的 --showConfig 编译选项。tsc --showConfig 命令会计算有效的 tsconfig.json 文件内容,并且将它们打印到终端中。这对于调试项目配置是很有用的,尤其是我们在 tsconfig.json 文…
2021-05-30

Typescript 中的 unknown 类型

Typescript 3.0 引入了一个新的 unknown 类型,它是 any 类型的对应类型,且是类型安全的。 unkonwn 类型和 any 类型最主要的区别是,unkonw 类型的使用没有 any 那么宽松。对于 unknown 类型的值,我们在对它做大部分操作之前都需…
2021-05-23

Typescript 中导入 JSON 模块

Typescript 2.9 引入了一个新的 --resolveJsonModule 编译器选项,允许我们在 Typescript 中导入 JSON 模块。 通过 require 导入 JSON 模块 假设我们有个用 Typescript 写的 Node 应用,需要导入下面的 …
2021-05-16

Typescript 中给 JSX 元素传递泛型

Typescript 2.9 支持给 JSX 元素设置泛型类型参数。这意味着我们可以像下面这样在 TSX 文件中写组件: 为了理解为什么泛型 JSX 元素是有用的(以及为什么我们通常并不需要显式地把类型参数写出来),我们先来写一个 Select 组件,然后围绕这个组件迭代升级它…
2021-05-09

Typescript 中的映射类型修饰符

在2016年12月 Typescript 2.1 的时候,映射类型被添加到了这门语言中。作为 Typescript 2.8 的一部分,映射类型增加了给属性添加或删除特定修饰符的能力。在这之前,我们只能给属性添加修饰符,而不能移除它们。 ? 属性修饰符 你可以在一个对象类型声明的…
2021-05-02

2021-04


Typescript 中的条件类型

Typescript 2.8 引入了条件类型,它是类型系统强有力的补充。条件类型允许我们表达更灵活的类型映射,也就是,类型转换会根据不同的条件而不同。 介绍条件类型 条件类型会先测试一种类型关系,并基于测试结果,选择两种可能类型中的一种。它永远有以下的形式: 条件类型使用了熟悉…
2021-04-25

Typescript 中基于文件设置JSX工厂函数

Typescript 2.8 允许你基于单个文件来设置特定的 JSX 工厂函数名字。在这之前,你只能通过 --jsxFactory 编译选项来设置 JSX 工厂函数。并且这个设置会应用到整个项目中的所有 JSX 文件。现在,你可以通过在文件的开头添加特殊的 @jsx 注释来覆盖…
2021-04-18

Typescript 中的严格属性初始化

Typescript 2.7 中引入了一个新的编译选项用来对类的属性初始化做严格检查。如果 --strictPropertyInitialization 选项被开启,类型检查会验证类中的每一个实例属性是否满足以下三个条件之一: 类型中包括了 undefined 类型, 有一个明…
2021-04-11

Typescript 中的数字分隔符

Typescript 2.7 支持了数字分隔符,具体内容在 Numberic Separators 这个 ECMAScript 提案中有陈述。有了这个特性,你可以在数字字面量中添加下划线作为分隔符来分组数字: 分隔符不会改变数字字面量的值,但是通过这种逻辑分组可以帮助人们更快地…
2021-04-04

2021-03


Typescript 中的 JSX Fragment 语法

TypeScript 2.6 添加了对 JSX fragments 的支持。在 .tsx 文件中,你现在可以使用新的 <>...</> 语法来创建一个 fragment。 JSX Fragments 背后的动机 在 React 中,从一个组件中返回多个元素是常见的模式。举个例子…
2021-03-28

Typescript 中的 Optional catch Binding

Typescript 2.5 实现了 optional catch binding 提案,该提案修改了 ECMAScript 语法,允许 catch 从句可以没有绑定的错误变量。也就是,你现在可以忽略这个错误变量以及包裹它的圆括号: 在此之前,你必须声明这个变量即便你根本用不…
2021-03-21

Typescript 中的动态 import() 表达式

Typescript 2.4 添加了对动态 import() 表达式的支持,它允许按需异步加载和执行 ECMAScript 模块。 在 2018 年一月的写作当下,TC39 官方的动态 import() 表达式提议处在 TC39 提议流程的阶段3(stage 3),这意味着它很…
2021-03-14

Typescript 中的拼写更正

Typescript 2.4 实现了标识符拼写更正机制。即便你只是稍微拼写错了变量、属性,或者函数名,Typescript 也会尽可能地给出正确的拼写建议。 拼写更正实际案例 你想调用 window.location.reload()来重载应用的当前页面,但你不小心打了loca…
2021-03-07

2021-02


Typescript 中的弱类型检测

Typescript 2.4 引入了弱类型(weak types)的概念。当一个类型的所有属性都是可选的时候 ,它被认为是弱类型。说得更具体一些,一个弱类型定义了一个或多个可选属性,没有必需属性,也没有索引签名。 举个例子,下面的类型被认为是弱类型: 弱类型检测的主要目的是为了…
2021-02-28

Typescript 中的字符串枚举

Typescript 2.4 实现了一个呼声很高的特性:字符串枚举,或者更准确地说,成员的值是 string 类型的枚举。 现在允许将一个字符串赋值给一个枚举成员: 字符串枚举可以像其他 Typescript 中的枚举一样被使用: 下面是编译器生成的 ES3/ES5 代码: 输…
2021-02-21

Typescript 中针对 ES3/ES5 的迭代降级

Typescript 2.3 引入了一个新的 --downlevelIteration 选项,支持将 ES2015 的迭代协议(iteration protocol)编译为 ES3 和 ES5 代码。for...of 循环现在能够被降级编译为带有正确语义的代码。 使用 for.…
2021-02-14

Typescript 中使用 --checkJs 检查 Javascript 文件

一直到 Typescript 2.2,类型检查以及相应的错误提示仅限于 .ts 文件。从 Typescript 2.3 开始,编译器可以对普通的.js文件进行类型检查和报错。 我们可以通过设置新增的 --checkJs 标识来默认开启对所有 .js 文件的类型检查。除此之外,还…
2021-02-07

Typescript 中的 --strict 编译选项

Typescript 2.3 引入了一个新的 --strict 编译选项,它会开启一些相关的其他编译选项来使用更严格的类型检查。 严格类型检查选项 添加这个选项的初衷是让你可以方便地使用“默认严格模式”(strict-by-default mode)来得到更好的类型安全而不用一…
2021-02-01

2021-01


Typescript 中的泛型参数默认值

Typescript 2.3 实现了泛型参数默认值,它允许你给泛型的参数类型设置默认类型。 在这篇文章中,我会通过将下面的 React 组件从 Javascript(即 JSX) 转成 Typescript(即 TSX) 来展开我们如何能够从泛型参数默认值中获益: 不用担心,你…
2021-01-25

Typescript 中的 Mixin 类

Typescript 致力于支持在不同框架和库中使用的 Javascript 通用模式(common pattterns)。从 Typescript 2.2 开始,mixin 类就是其中一种得到静态类型检查支持的模式。这篇文章会先简单介绍 mixin 是什么,然后通过一些例子来…
2021-01-18

Typescript 中表达式操作数的空检查

Typescript 2.2 中,空检查(null checking)又得到了改善。Typescript 现在会识别操作数可能为空的表达式,并报编译时错误。 当遇到以下的情况,Typescript 会将可能为空的表达式操作数标记为错误。内容引用自发布记录: 如果 + 操作符任意…
2021-01-11

Typescript 中的点操作符属性和字符串索引签名

在 Typescript 2.2 之前,你如果想访问一个包含字符串索引签名类型上的任意属性,你必须使用 [] 的方式,而不能使用 . 操作符: Typescript 2.2 移除了这个限制。现在你既可以用点操作符也可以用方括号的形式来访问属性,编译器不会再对你咆哮了。在很多场景…
2021-01-04

2020-12


Typescript 中的 object 类型

Typescript 2.2 引入了一个新类型叫 object。它代表了任意的非原始类型。下面的这些类型在 Javascript 中被认为是原始类型: string boolean number bigint symbol null undefined 其他所有的类型都被认为是…
2020-12-28

Typescript 中没有类型的导入

Typscript 2.1 使得导入不具类型的模块更容易。之前,编译器过于严格,所以当你导入一个没有类型声明的模块的时候会提示错误: 从 Typescript 2.1 开始,对于这种情况编译器不会再报错。Typescript 允许导入没有类型的模块,编辑器也不会在导入的模块下…
2020-12-21

Typescript 中的字面量类型拓宽

在我上一篇谈 Typesript 2.1 更好的类型推断的文章中,我解释了 Typescript 如何将初始化了字面量值的 const 变量和 readyonly 属性推断为字面量类型。在这篇文章中,我会继续讨论并区分拓宽和非拓宽的字面量类型。 拓宽的字面量类型 当你用 con…
2020-12-14

Typescript 中增强的字面量类型推断

Typescript 中很早就存在字符串字面量类型。到 2.0 的时候,类型系统又新增了一些新的字面量类型: 布尔字面量类型 数字字面量类型 枚举字面量类型 在 TypeScript 2.1 中,如果一个变量用 const 声明或者一个属性用 readonly 声明,并且有一个…
2020-12-07

2020-11


Typescript 中的映射类型

Typescript 2.1 引入了映射类型(mapped types),这给类型系统添加了强大的武器。简单说,映射类型允许你通过映射已有类型的每个属性来创建新的类型。已有类型的每个属性会根据你设置的规则进行转换。转换后的属性会构造出一个新的类型。 使用映射类型,你就能捕获一些…
2020-11-30

Typescript 中的 keyof 和类型查询

Javascript 是高度动态的语言。所以想要在一个静态类型系统中捕获某些操作的语义并不是件容易的事。比如下面的 prop 函数: 它接受一个对象和一个 key 作为入参,然后返回对应的属性的值。对象中不同属性的值可能有完全不同的类型,并且,我们甚至不知道 obj 的类型是怎…
2020-11-23

Typescript 中的对象剩余和扩展属性

Typescript 2.1 实现了在 ES2018 中标准化的对象剩余和扩展属性(Object Rest And Spread Properties)。所以你可以以类型安全的方式使用剩余和扩展属性,编译器最终会将这两个特性降级为 ES3 代码。 对象剩余属性 假设你声明了一个…
2020-11-16

Typescript 中的外置帮助函数

在某些情况下,Typescript 编译器会在生成的代码中注入一些运行时执行的帮助函数。每个帮助函数都模拟了一个语言特性,这些特性在构建目标语言版本(ES3, ES5, ES2015, …)中没有得到原生支持。 目前,Typescript 中存在以下的一些帮助函数: __ext…
2020-11-09

Typescript 如何将 async/await 编译成 ES3/ES5

早在2015年11月的时候,Typescript 在 1.7 的版本就已经支持 async/await 关键字了。编译器会把异步函数转换成 generator 函数。然而,这也意味着编译后的代码不能运行在只支持 ES3或ES5 的环境中,因为 generator 是 ES201…
2020-11-02

2020-10


Typescript 中的内置类型声明

Typescript 2.0 让你能够更细粒度地控制哪些内置的 API 声明可以被加入到项目中。在之前,如果你的项目的构建目标(target)是ES6,那么你只能访问 ES2015 的API。现在,内置的标准库声明已经模块化,Typescript 已经允许你选择哪些类型声明需要…
2020-10-25

Typescript 中的 never 类型

Typescript 2.0 中引入了一个新的原始类型 never。它代表了某种不可能发生的值的类型。never 类型通常在以下两种场景中被使用。 作为没有返回值的函数的返回类型 在类型守卫中不可能有正确类型的值的类型 下面是 never 类型具体的一些特征,详细内容见这里: …
2020-10-18

Typescript 中更多的字面量类型

Typescript 1.8 引入了字符串字面量类型,用于将变量的值限定在有限的字符串字面量集合中。在 Typescript 2.0 中,字面量类型不再局限于字符串字面量。以下的这些字面量类型被添加到了类型系统中: 布尔字面量类型 数字字面量类型 枚举字面量类型 下面我们就每一…
2020-10-11

Typescript 中的标签联合类型

译者注:tagged union types 没有比较好的中文翻译,维基百科翻译为标签联合,也称可辨识联合(discriminated union)或者变体类型(variant type)。它是一种数据结构,很像联合(C/C++程序员一定知道这个结构)。它有一个字段(或称为属性…
2020-10-04

2020-09


Typescript 中的 Ready-Only 属性

Typescript 2.0 中增加了 readonly 修饰符。被标记为 readonly 的属性只能在初始化的时候赋值或者在同一个类的构造函数中赋值。除此之外,均不被允许。 让我们来看一个例子。这儿有个简单的 Point 类声明了两个 read-only 属性,x 和 y:…
2020-09-27

Typescript 中如何获取类型声明文件

本文是 Typescript Evolution 系列的第 3 篇,原作者已经更新到了 40 多篇。该系列从 Typescript 2.0 开始,对每次语言更新新增的重要特性都做了通俗易懂的介绍,等不及翻译的同学建议直接阅读系列原文。 在 Typescript 2.0 中,获取…
2020-09-20

Typescript 中基于控制流的类型分析

本文是 Typescript Evolution 系列的第 2 篇,原作者已经更新到了40多篇。该系列从 Typescript 2.0 开始,对每次语言更新新增的重要特性都做了通俗易懂的介绍,等不及翻译的同学建议直接阅读系列原文。 Typescript 2.0 发布带来了许多新…
2020-09-13

Flutter 开发完整指南

本文的写作目的是为了方便有一定 UI 编程经验的开发者快速上手 Flutter 开发移动应用,并且对 Flutter 开发的相关主题形成全貌的认识。在每个主题之后,会附有相关的资源链接,方便有兴趣的同学按图索骥深入学习。在文章的最后,整理了一些学习资料,如果想更系统地学习 Fl…
2020-09-01

2020-08


战胜 Electron

你使用的部分桌面应用很可能是用 Electron 开发的,它是一种框架,结合了 Node.js,部分 Chromium,以及一层原生代码。Visual Studio Code,Slack,Atom,WhatsApp,甚至微软的 Visual Studio 安装程序都使用它来构建…
2020-08-29

简单代码的密码

10倍程序员如何创造10倍价值。 有成为10倍程序员的捷径吗?是否有某种神奇的秘密——你只要知道它——就能为你解锁精通软件开发和提高生产力的全新世界? 持怀疑态度的人会想“没有捷径!任何人都需要练习来精进!”。这自然是对的,但高手是如何练习来提高软件开发生产力的呢?有没有某种…
2020-08-16

Vue3 设计背后的思考

在过去的一年中,Vue 团队一直在为 Vue.js 的下一个大版本工作。我们希望能在2020年的年中发布(本文写作的时候开发正在持续进行中)。Vue 新版本的想法成形于2018年末,彼时 Vue 2 的代码库已经两岁半了。相比于普通软件的生命周期,这似乎并不算太长的时间,但在前…
2020-08-09

2020-07


用信鸽解释 HTTPS

密码学是一个难以理解的主题。它充满了数学证明。但除非你自己是开发加密系统的,理解高抽象层次的概念并不需要深入到复杂的细节中。 如果你打开这篇文章是想要开发下一代的 HTTPS 协议,那么很抱歉信鸽不能满足你的需求。如果不是,那么去煮一杯咖啡,然后开始享受文章吧。 Alice, …
2020-07-29

BLoC 模式入门

摘要:讲解如何使用流行的 BLoC 模式来架构你的 Flutter 应用,以及通过 Dart streams 来管理组件的数据流。 版本:Dart 2, Flutter 1.7, Android Studio 3.4 在应用开发领域,如何设计一个应用的结构通常是最具争议的话题之…
2020-07-20

深入理解CSS:字体规格,line-height 和 vertical-align

line-height 和 vertical-align 是简单的 CSS 属性。如此简单以至于我们大多数人都自信已经完全理解它们以及如何使用它们。但真的并非如此。它们真的很复杂,也许是最难以理解的属性,因为它们是某个很少为人所知的 CSS 特性——行内格式化上下文(inlin…
2020-07-13

为什么 Flutter 选择了 Dart 语言

很多语言学家认为人们说的自然语言会影响思考本身。这种想法同样适用于计算机语言吗?使用不同编程语言的程序员针对相同问题往往会想出截然不同的解决方案。举个极端的例子,计算机科学家为了鼓励大家写出更具结构化的程序而去除了 goto 语句(并不完全像小说 1984 中极权主义者故意从自…
2020-07-08

2020-06


认真锻炼一个多月后

五一节某一天的中午,看着镜子里日渐圆润隐隐待产的肚子,我决定开始健身减肥。先贴图看一个多月锻炼前后的对比: 效果还是明显的。 如何开始健身 相信很多人和我一样都曾经尝试过健身——办卡,看各种健身视频,跟着Keep上的教程做HIIT,甚至也请过私教。但很多人最终放弃了,体重没…
2020-06-26

2020-05


开始认真对待健身这件事

为什么要健身 首先是为了减肥。肥胖除了在大众审美上是减分项,也会带来各种健康问题。比如某著名80后,肥胖带来的健康问题甚至造成了世界性的话题。 成年后我的体重起起伏伏过多次,最胖的时候达到了210斤,最瘦的时候只有120多斤。不像很多人减肥特别困难,就我个人经验,每次减肥都非常…
2020-05-14

2019-05


前端高效工作工具篇:常用的 vim 命令

Vim 编辑器很强大,但却有非常陡峭的学习曲线。非运维向的程序员如果只是偶尔在终端修改一些文本文件,或许真的没有必要花很多的精力把 Vim 的各种强大功能和奇技淫巧都摸透。不过花几天时间学习和掌握一些常用命令,在偶尔需要用 Vim 编辑的时候能像使用其他编辑器一样快速高效还是很…
2019-05-12

2019-04


《经济学人》写作法摘记

财新总编王烁很早之前译介过经济学人杂志的写作指南。里面有一些建议我觉得对于写作有非常好的启发。看病住院中,为了避免整天昏昏欲睡无所事事,我翻出之前的摘记炒了一遍,是为温故。这儿有原文,有兴趣的同学可以直接看。 奥威尔的六条基本规则 清晰的写作来自于清晰的思想。所以想清楚你要说什…
2019-04-10

2019-03


useEffect 完整指南

你用Hooks写了一些组件,甚或写了一个小型应用。你可能很满意,使用它的API很舒服并且在这个过程中获得了一些小技巧。你甚至可能写了一些 custom Hooks去抽离重复的逻辑(精简掉了300行代码),并且得意地展示给你的同事看,“干得漂亮”,他们如是说。 但有时候当你使用u…
2019-03-18

Typescript 中的 Non-Nullable类型

Typescirpt 2.0发布了许多新的特性。在这篇文章中,我们一起学习non-nulable类型。它是对类型系统的重要改进,旨在避免一整类在编译时因为可能为空值引发的报错。 null和undefined 在Typescript 2.0之前,null和undefined可以是…
2019-03-09

在上海办理意大利旅行签证

计划三月底和女友去意大利旅行,整理了签证办理流程和所需材料,供参考。2019-03-01。 签证办理 备注:第一次申根签因为要采集指纹,必须亲自去签证中心递交材料,不能代办 上海签证中心:上海四川中路213号久事商务大厦   时间:周一到周五上午8点开门 办理流程:在二楼取号,…
2019-03-01

2019-01


Sentry 简明指南

本指南包含以下几个部分: 如何上手 如何上报事件 如何设置 Context 如何设置 Breadcrumbs 如何收集用户反馈 如何设置 Release 如何设置事件分组 如何设置 SourceMaps 如何上手 1. 安装SDK 以Node.js为例: 或者 2. 配置SDK…
2019-01-10

2018-12


你不知道的 ECMAScript 6

ECMAScript 6 可以说是 Javascript 语言标准最重要的一次更新。它包含的内容非常多,我相信有相当多的前端程序员并没有很系统地学习过 ES6。比如你是否有完整地阅读过扎老师的《 Understanding ECMAScript 6》 或者阮老师的《ES6 标准…
2018-12-15

理解React中的children

React 的核心是组件。你可以像嵌套 HTML 标签一样嵌套组件,所以写 JSX 并不难。当我刚开始学 React 的时候,我觉得关于 children 我只要会用 props.children 就可以了。我承认,我天真了。 因为在 JSX 里可以写 Javascript,我…
2018-12-10

工具控系列:youtube-dl

Youtube是全球最大的视频网站,上面有各色各样非常多的视频。Youtube最吸引我的是各互联网大厂的技术频道,因为里面有各种顶尖会议的录播和教学视频。比如Google Developers频道中有Google I/O大会的视频。 虽然购买Youtube Premium会员可…
2018-12-09

2018-10


编写可维护代码的学习清单

和很多事情一样,软件代码质量的提升是一件无止境的事。编写可维护的代码是每个专业程序员必备的素养。我整理了一些学习资料,有些看过有些没看过,所以这个清单既是学习指南也是对过去学习的一个整理。 清单包括三个部分:相关主题的经典书籍;React常用模式的相关书籍和文章;Code R…
2018-10-29

2018-06


如何在国内使用Google Home Mini

上周去东京,买了两个Google Home Mini给自己和女友。因为众所周知的原因,在国内使用Mini需要自己搭梯子。自由的路总是磕磕绊绊,昨天在家折腾许多,当深夜里Mini说出"play some music on Spotify..."的时候,泪流满面。 1、小米路由器刷…
2018-06-04

2018-04


编写可读代码的艺术

《编写可读代码的艺术》是一本不错的讲解如何让代码变得易于理解的书。书虽然不厚,但以具体的例子传递了非常多实用的方法和技巧。相信看完这本书,你或许能写出更易于阅读和理解的代码。以下是我的读书笔记。 代码应当易于理解 可读性基本定理:代码的写法应当使别人理解它所需的时间最小化。 尽…
2018-04-12

2018-03


工具控系列:iTerm2

iTerm2 iTerm2是Mac下的一款终端工具,可能也是最好用的一款终端工具。配合zsh + oh-my-zsh可以打造高效的命令行环境。这篇文章主要分享一些我自己用得比较多的iTerm2特性。 Smart Selection 双击选中,三击选中整行,能够智能识别网址,引号…
2018-03-05

2018-01


每天一个Node模块:Path

注:node v8.11.1 目录 Path Windows vs. POSIX path.basename(path, ext) path.delimiter path.dirname(path) path.extname(path) path.format(pathObje…
2018-01-22

2017-12


区分await、return以及return await

当我们写async函数的时候,需要注意await、return以及return await的区别,并作出正确的选择。 我们先来看一个async函数: 调用这个函数会返回一个promise,等待一秒后,50%的可能性fulfill,返回值为"yay",另外50%的可能性会reje…
2017-12-28

2017-11


免费启用HTTPS

昨天花了一些时间将之前的Ghost博客改用灵活强大的Gatsby重新搭建,顺带启用了HTTPS。HTTPS使用的是Let’s Encrypt提供的免费方案。具体的配置步骤如下: 打开https://certbot.eff.org 网站 选择你使用的web服务器和操作系统,我的是…
2017-11-20

2017-10


RSCSS,简单有效的CSS命名规范

Reasonable System for CSS Stylesheet Structure. A set of simple ideas to guide your process of building maintainable CSS. 这是官网给的定义,RSCSS不是…
2017-10-27

2017-09


Node.js Child Processes, 你需要知道的一切

就单进程而言,Node.js的单线程非阻塞执行表现良好。然而,单CPU单进程的方式不足以处理应用程序日益增长的工作负载。 无论你的服务器有多强大,需要承认的是,单线程只能承受有限的负荷。 Node单线程执行js的事实并不意味着我们不能利用多进程、多处理器的优势。 使用多进程是扩…
2017-09-20

2017-08


使用ngrok实现内网穿透

首先说下什么是“内网穿透”。简单来说,就是让外网能够访问你本地电脑上的应用。例如你本地启了一个Node服务器,端口8000,本地可以访问 http://localhost:8000, 但外网并不能访问你的这个本地应用。使用ngrok做反向代理,就可以实现“内网穿透”访问你的本地…
2017-08-13

2017-07


理解 Node.js 的事件驱动架构

大部分的Node对象,比如 HTTP的requests、responses 对象, 以及streams,都实现了 EventEmitter 模块,所以它们都提供了触发和监听事件的功能。 事件驱动的本质可以从Node.js一些常用函数的回调风格这种最简单形式中看出来。比如,fs…
2017-07-18

2017-06


Node.js Streams, 你需要知道的一切

Node.js的streams向来被认为难以使用,更难于理解。不过现在有一个好消息告诉你,看过这篇文章后前面的话就可以收回了。 在过去的几年里,很多开发者为了能够更容易地使用streams,写了很多的模块。但在这篇文章里,我只关注原生的Node.js stream API。 S…
2017-06-12

Node.js 按图索骥

根据饿了么的node-interview按主题整理了node学习资料,方便日后按图索骥,检索学习。 1. Javascript 基础问题 类型判断,推荐阅读lodash源码,建议学习Typescript。 作用域,推荐阅读你不知道的Javascript。 引用传递,还是传递引用…
2017-06-02

2017-04


轻松理解async函数

Async函数是ES2017规范的一部分。刚刚发布的Node7.6.0版本开始支持该语法,不用加flag也能运行。Chrome55版本之后以及大部分现代浏览器也都已经支持。对于不支持的浏览器和Node环境,可以通过Babel转译成ES3/ES5的语法运行。 Async函数是什么…
2017-04-09
郑超的独立博客