nth-type-of 和 nth-child 的区别

CSS 伪类选择器

本文将用代码例子的形式展示以下几个比较容易混淆的 css 伪类选择器的使用:

  • p:first-of-type 选择属于其父元素的首个元素
  • p:last-of-type 选择属于其父元素的最后元素
  • p:only-of-type 选择属于其父元素唯一的元素
  • p:only-child 选择属于其父元素的唯一子元素
  • p:nth-type-of(n) 选择属于其父元素的第 n 个 p 元素
  • p:nth-child(n) 选择属于其父元素的第 n 个子元素

点击这里查看本文提到的例子.

使用到的 html 片段如下:

Read More

styled-component 工作原理

参考原文: https://medium.com/styled…

在 React 的前端开发生态中,css-in-js 越来越常见了。styled-component 是其中使用最多的 css-in-js 库。这篇就介绍一下 styled-component 的工作原理。

特性

  • 基于标签模板(tagged_templates)的语法
  • 以编写 React 组件的形式来定义样式
  • 解决了 CSS 模块化的问题,并提供了 CSS 嵌套
  • 无需再为 css 类名而苦恼

标签模板( Tagged Templates)

首先需要了解下 标签模板(tagged_templates) 的语法。 这是 ES6 的一个新特性, 和 styled-components 没有直接关系,它只是使用了这种新语法而已。 直接上一个 🌰:

Read More

python 实现 k-means 算法

算法基础

机器学习中有两大类问题,一个是分类,一个是聚类。分类是根据已知类别标号(label)的样本,训练某个分类器,使它能够对未知类别的样本进行分类。属于 supervised learning (监督学习)。而聚类指事先并不知道任何样本的类别标号,而希望通过某种算法来把一组未知类别的样本划分成若干类别,这在机器学习中属于 unsupervised learning(非监督学习)

而本文要实现的 k-means 算法就是一个比较简单的聚类算法。

k-means 算法的基本思想是:通过迭代寻找 k 个聚类,使得用这 k 个聚类的均值来代表相应各类样本时所得的总体误差最小。k-means 算法的基础是最小误差平方和准则。

k-means 算法的代价函数如下:

x(i) 表示第 i 个样本点,μc(i)表示第 i 个聚类的均值,c 表示某个类别的集合

我们希望代价函数最小,如果各类内的样本越相似,其与该类均值间的误差平方越小,则各类的误差平方和也越小。

k-means 算法基本步骤如下:

Read More

momoize-one 源码解析

momoize-one 是一个 javascript 记忆库。它能根据函数的参数来缓存函数运算的结果。momoize-one 和其他 js 记忆库相比的不同之处在于它只会缓存函数最近一次入参对应的执行结果,所以内存溢出的风险较小。

Usage

memoize-one 的 api 非常简便,模块只 export 唯一一个 api: memoizeOne。先看下 memoize-one 如何使用:

Read More

写一个 webpack loader

前几天看了 webpack 的官网介绍 write a loader 的文档,觉得挺有意思,于是打算自己实践一下。

什么是 loader

官网的介绍很直接明了:

A loader is a node module that exports a function. This function is called when a resource should be transformed by this loader. The given function will have access to the Loader API using the this context provided to it

首先 loader 是一个 nodejs 的模块,然后这个模块需要 exports 一个 function。这个 function 可以通过 this 上下文获得 Loader API 上的数据。

sync/async loader

sync loader 可以直接返回转义后的 js 字符串。async loader 需要调用 this.async() 来指明需要等待一个异步的结果,this.async() 返回 this.callback 函数,之后 async loader 必须 return undefined 并通过 callback 来返回转义后的 js。

Read More

redux 源码分析【4.0.0-beta.2】

redux 一个可预测的 js 状态容器(Predictable state container for JavaScript apps), 在很多 React 项目中都会默认使用 react-redux 作为全局状态管理工具。

让我们先来看下源码仓库暴露出来的方法。redux 库一共导出如下几个方法 createStore, combineReducers, bindActionCreators, applyMiddleware, compose, DO_NOT_USE__ActionTypes。

createStore

先看下 createStore。 createStore 接受三个参数:reducer, preloadedState, enhancer

Read More

fastdom 源码解析

浏览器如何渲染页面

说到 fastdom,就必须先了解浏览器渲染一个页面的流程。通常浏览器渲染页面需要如下的步骤:
页面渲染流程图
(其中的 layout 有时候也称为 reflow)

layout 是非常消耗性能和时间的,所以应该尽量避免 js 的执行过程中频繁触发 layout 。特别是在有动画的情况下,太多的 layout 会使得浏览器的刷新频率低于 60fps,出现动画卡顿的现象。具体的原理和细节可以参考这篇文章:

Avoid Large, Complex Layouts and Layout Thrashing

fastdom 的出现就是为了优化 layout,防止出现 forced synchronous layouts 。

Read More