愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

持续集成(Continuous Integration)的基础概念

一、持续集成的特点 至少每日集成一次 有助于快速解决问题 不止一个过程 二、所谓持续,是至少每日集成一次 持续集成(Continuous Integration, CI)是一种开发实践,它要求开发者将 代码 在一日内集...

《编程语言实现模式》学习笔记(一):LL(1)递归下降的词法分析器

一、什么是Lexer? 在阅读的时候,人们会无意识地将字母合成单词,然后将合成的单词组成句子,之后考虑语法结构,最终明白句子的含义。在编译的过程中,编译器为了更好地进行语法分析,就也需要先将字符流识别分类为有意义的一个个单元,而这些单元便称之为词法单元,编译器解析字符流到生成词法...

使用rebase的Git工作流

Git是目前最为强大的代码版本管理工具,被开源社区和各大公司所广泛使用。使用Git进行团队协作开发是很便利的一件事情,但是在多人协作的过程中,我们也会面临如何运用好Git的问题。这种情况下,就出现了各种各样的Git Workflow,而本文将介绍一种基于rebase的工作流,这种工作流也是目前开源社区所比较推崇的做法,了解了这种工作流之后可以更好地优化对git...

BDD工具Cucumber学习记录

一、前言 BDD(Behavior Driven Development)是一种有效的软件开发与测试方法,它能够清晰化地描述应用程序的行为,用于在业务方、开发者与测试人员之间明确业务需求,并且为更好地自动化测试提供指导。Cucumber是广泛使用的一个BDD工具,支持多种语言,本文则基于JS...

彻底理解JavaScript中的Event Loop

一、前言 Javascript从诞生之日起,就一直是一门单线程的非阻塞的语言。即便后面出现了WebWorker,但是其本质上还是主线程的子线程,帮助主线程分担一部分计算任务,并非真正意义上的多线程。由于浏览器环境和Node环境在处理Event Loop上大致相同,但又有所区别,所以本文将区分开讲解 二、...

关于前端枚举的一点思考

一、枚举的业务场景与遇到的问题 我们在日常业务开发中,经常遇到枚举,如商品状态、页面状态、审核状态等,翻阅以往的一些业务代码,会发现很多地方都是这么写的: <span v-if="status == 0">审核中</span> <span v-else-if="...

可能是比Mixin更好的方案:React新特性Hooks探索

一、什么是Hooks? Hooks是React新引入的一个特性,它允许我们能够不采用类式声明组件方式来使用状态和React其他特性(如生命周期、Ref、Context等),简单的例子如下: import { useState } from 'react' function Example() { const [count, se...

Node.js之Stream的应用与原理探索

为什么使用流? 假设我们现在要读取一个文件,通常情况下,会写成: const fs = require('fs') fs.readFile(fileName, (err, body) => { console.log(body.toString()) }) 这在文件比较小的时候...

LeetCode - 买卖股票的最佳时机

一、题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格...

LeetCode - 最大子序列和

一、题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精...

LeetCode - 爬楼梯

一、题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶

浏览器缓存技术总结

一、浏览器缓存技术 浏览器中,为了加快一些不常变内容的访问速度,会将其缓存在本地中,当下次再次访问时,就直接加载这些资源,从而加速访问。这种技术称之为浏览器缓存。 判断浏览器加载的一个资源,是否是使用缓存,可以使用开发者工具查看Network,存在缓存中的资源,其Size会显示为from disk cache或者fro...

深入解析Vue依赖收集原理

一、先谈观察者模式 观察者模式是一种实现一对多关系解耦的行为设计模式。它主要涉及两个角色:观察目标、观察者。如图: 它的特点:观察者

每天一个JavaScript设计模式:抽象工厂模式

一、场景 抽象工厂模式是一种创建型模式,抽象工厂模式创建的是类簇,而非是具体某一个类的实例。 抽象工厂模式适用于系统里有多于一个的产品族,而只需要用到某一族的类的场景 ...