Web Components 上手指南
现在的前端开发基本离不开 React、Vue 这两个框架的支撑,而这两个框架下面又衍生出了许多的自定义组件库: - Element(Vue) - Ant Design(React) 这些组件库的出现,让我们可以直接使用已经封装好的组件,而且在开源社区的...
MobX 上手指南
之前用 Redux 比较多,一直听说 Mobx 能让你体验到在 React 里面写 Vue 的感觉,今天打算尝试下 Mobx 是不是真的有写 Vue 的感觉。 题外话 在介绍 MobX 的用法之前,先说点题外话,我们可以看一下 MobX 的中文简介。在 MobX 的...
介绍两种 CSS 方法论
前言 说起 CSS 命名规范,大家应该都很熟悉,或者应该听说过 BEM 。BEM 是由 Yandex 团队提出的一种 CSS Class 命名方法,旨在帮助开发人员创建更好的且结构一致的 CSS 模块。 BEM 将页面的类名分为块(Block)、元素(Element...
2020年终总结
今天早上起来,看了下日期,没想到 2020 只剩下两天了,过去得如此快,甚至都还没想好怎么跨年😥。本来想看看之前立的 flag 有多少实现了,结果发现自己今年根本没立 flag,哈哈哈。仔细回顾了一下今年,发现还是挺丰富的,做...
Node.js 服务性能翻倍的秘密(二)
前言 前一篇文章介绍了 fastify 通过 schema 来序列化 JSON,为 Node.js 服务提升性能的方法。今天的文章会介绍 fastify 使用的路由库,翻阅其源码(lib/route.js)可以发现,fastify 的路由库并不是内置的,而是使用了一个叫做...
Node.js 服务性能翻倍的秘密(一)
前言 用过 Node.js 开发过的同学肯定都上手过 koa,因为他简单优雅的写法,再加上丰富的社区生态,而且现存的许多 Node.js 框架都是基于 koa 进行二次封装的。但是说到性能,就不得不提到一个知名框架: fastify ,听名字就知道...
我是如何阅读源码的
最近写了很多源码分析相关的文章,React、Vue 都有,想把我阅读源码的一些心得分享给大家。 React: - React 架构的演变 - 从同步到异步 - React 架构的演变 - 从递归到循环 - React 架构的演变 - 更新机制 - React 架构的演变...
Vue3 Teleport 组件的实践及原理
Vue3 的组合式 API 以及基于 Proxy 响应式原理已经有很多文章介绍过了,除了这些比较亮眼的更新,Vue3 还新增了一个内置组件:Teleport。这个组件的作用主要用来将模板内的 DOM 元素移动到其他位置。 使用场景 业务开发的过程中...
【翻译】CommonJS 是如何导致打包后体积增大的?
今天的文章,将介绍什么是 CommonJS,以及它为什么会导致我们打包后的文件体积增大。 什么是 CommonJS? CommonJS 是 2009 年发布的 JavaScript模块化的一项标准,最初它只打算在浏览器之外的场景使用,主要用于服务器端的应用...
Vue3 模板编译优化
Vue3 正式发布已经有一段时间了,前段时间写了一篇文章(《Vue 模板编译原理》)分析 Vue 的模板编译原理。今天的文章打算学习下 Vue3 下的模板编译与 Vue2 下的差异,以及 VDOM 下 Diff 算法的优化。 编译入口 了解过 Vue3 的...
小程序依赖分析
用过 webpack 的同学肯定知道 webpack-bundle-analyzer ,可以用来分析当前项目 js 文件的依赖关系。 因为最近一直在做小程序业务,而且小程序对包体大小特别敏感,所以就想着能不能做一个类似的工具,用来查看当前小程序各个主...
React 架构的演变 - Hooks 的实现
React Hooks 可以说完全颠覆了之前 Class Component 的写法,进一步增强了状态复用的能力,让 Function Component 也具有了内部状态,对于我个人来说,更加喜欢 Hooks 的写法。当然如果你是一个使用 Class Component 的老手,初...
Vue 3 的组合 API 如何请求数据?
前言 之前在学习 React Hooks 的过程中,看到一篇外网文章,通过 Hooks 来请求数据,并将这段逻辑抽象成一个新的 Hooks 给其他组件复用,我也在我的博客里翻译了一下:《在 React Hooks 中如何请求数据?》,感兴趣可以看看。虽...
React 架构的演变 - 更新机制
前面的文章分析了 Concurrent 模式下异步更新的逻辑,以及 Fiber 架构是如何进行时间分片的,更新过程中的很多内容都省略了,评论区也收到了一些同学对更新过程的疑惑,今天的文章就来讲解下 React Fiber 架构的更新机制。 Fib...
React 架构的演变 - 从递归到循环
这篇文章是 React 架构演变的第二篇,上一篇主要介绍了更新机制从同步修改为异步,这一篇重点介绍 Fiber 架构下通过循环遍历更新的过程,之所以要使用循环遍历的方式,是因为递归更新过程一旦开始就不能暂停,只能不断向下,直...
React 架构的演变 - 从同步到异步
写这篇文章的目的,主要是想弄懂 React 最新的 fiber 架构到底是什么东西,但是看了网上的很多文章,要不模棱两可,要不就是一顿复制粘贴,根本看不懂,于是开始认真钻研源码。钻研过程中,发现我想得太简单了,React 源码的复...
Webpack5 跨应用代码共享-Module Federation
Webpack 5 的消息尽管已经出来了许久,但是正式版一直还未发布。Webpack 5 的 ChangeLog 中,除了常规的性能优化、编译提速之外,有一个比较让人期待的功能就是 Module Federation。有些文件将 Module Federation 强行翻译成「...
面向未来的前端构建工具-vite
前言 如果近期你有关注 Vue 的动态,就能发现 Vue 作者最近一直在捣鼓的新工具 vite。vite 1.0 目前已经进入了 rc 版本,马上就要正式发布 1.0 的版本了。几个月前,尤雨溪就已经在微博介绍过了 vite ,是一个基于浏览器原生 E...
手把手教你实现 Promise
前言 很多 JavaScript 的初学者都曾感受过被回调地狱支配的恐惧,直至掌握了 Promise 语法才算解脱。虽然很多语言都早已内置了 Promise ,但是 JavaScript 中真正将其发扬光大的还是 jQuery 1.5 对 $.ajax 的重构,支持了 Prom...
你不知道的 TypeScript 高级类型
前言 对于有 JavaScript 基础的同学来说,入门 TypeScript 其实很容易,只需要简单掌握其基础的类型系统就可以逐步将 JS 应用过渡到 TS 应用。 // js const double = (num) => 2 * num // ts const double = (num: number): nu...
从零开始实现 VS Code 基金插件
写在前面 随着7月一波牛市行情,越来越多的人投身A股行列,但是股市的风险巨大,有人一夜暴富,也有人血本无归,所以对于普通人来说基金定投是个不错的选择,本人也是基金定投的一枚小韭菜。 上班的时候经常心理痒痒,想看看今...
Vue 模板编译原理
写在开头 写过 Vue 的同学肯定体验过, .vue 这种单文件组件有多么方便。但是我们也知道,Vue 底层是通过虚拟 DOM 来进行渲染的,那么 .vue 文件的模板到底是怎么转换成虚拟 DOM 的呢?这一块对我来说一直是个黑盒,之前也没有...
小程序自动化测试
背景 近期团队打算做一个小程序自动化测试的工具,期望能够做到业务人员操作一遍小程序后,自动还原之前的操作路径,并且捕获操作过程中发生的异常,以此来判断这次发布是否会影响小程序的基础功能。 上述描述看似简单,但是中...
Node.js 与二进制数据流
认识二进制数据 二进制数据就像上图一样,由0和1来存储数据。普通的十进制数转化成二进制数一般采用"除2取余,逆序排列"法,用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为...
【翻译】Node.js CLI 工具最佳实践
这是一个关于如何构建成功的、可移植的、对用户友好的Node.js 命令行工具(CLI)最佳实践的集合。 为什么写这篇文章? 一个糟糕的 CLI 工具会让用户觉得难用,而构建一个成功的 CLI 需要密切关注很多细节,同时需要站在用户的角...
2019年终总结
GoodBye 2019 2019 已经结束,是时候开始回忆下自己的 2019 了。年终总结好像是 2017 年开始写的,还是毕业的第一个年头,一晃已经毕业两年多了。一年过去,总得记点流水账吧。 工作上 工作上,去年还在感叹自己进入鹅厂多么不...
前端模块化的今生
背景 众所周知,早期 JavaScript 原生并不支持模块化,直到 2015 年,TC39 发布 ES6,其中有一个规范就是 ES modules(为了方便表述,后面统一简称 ESM)。但是在 ES6 规范提出前,就已经存在了一些模块化方案,比如 CommonJS(...
前端模块化的前世
随着前端项目的越来越庞大,组件化的前端框架,前端路由等技术的发展,模块化已经成为现代前端工程师的一项必备技能。无论是什么语言一旦发展到一定地步,其工程化能力和可维护性势必得到相应的发展。 模块化这件事,无论在哪个...
深入理解 ESLint
前言 小沈是一个刚刚开始工作的前端实习生,第一次进行团队开发,难免有些紧张。在导师的安排下,拿到了项目的 git 权限,开始进行 clone。 $ git clone git@github.com:company/project.git 小沈开始细细品味着同事们的代码,...
USB 科普
什么是 USB? 维基百科的解释: 在几年前,市面上常见的 USB 数据线都使用如下结构,一边 USB Type-A(主要用于连接电脑或充电器), 一边 USB Micro-B(主要用来连接手机或其他手持设备),主要还是因为安卓手机普遍使用这种类...
虚拟DOM到底是什么?
是什么? 虚拟 DOM (Virtual DOM )这个概念相信大家都不陌生,从 React 到 Vue ,虚拟 DOM 为这两个框架都带来了跨平台的能力(React-Native 和 Weex)。因为很多人是在学习 React 的过程中接触到的虚拟 DOM ,所以为先入为主...
【翻译】基于虚拟DOM库(Snabbdom)的迷你React
React 是 JavaScript 社区的新成员,尽管 JSX (在 JavaScript 中使用 HTML 语法)存在一定的争议,但是对于虚拟 DOM 人们有不一样的看法。 对于不熟悉的人来说,虚拟 DOM 可以描述为某个时刻真实DOM的简单表示。其思想是:每次...
【翻译】Vue.js 的注意事项与技巧
原文链接:Vue.js — Considerations and Tricks Vue.js 是一个很棒的框架。然而,当你开始构建一个大型 JavaScript 项目的时候,你将对 Vue.js 感到一些困惑。这些困惑并不是来自框架本身,相反 Vue.js 团队会经常调整一些重要...
【翻译】在 React Hooks 中如何请求数据?
通过这个教程,我想告诉你在 React 中如何使用 state 和 effect 这两种 hooks 去请求数据。我们将使用总所周知的 Hacker News API 来获取一些热门文章。你将定义属于你自己的数据请求的 Hooks ,并且可以在你所有的应用中复用,...
深度神经网络原理与实践
理论基础 什么是神经网络 我们知道深度学习是机器学习的一个分支,是一种以人工神经网络为架构,对数据进行表征学习的算法。而深度神经网络又是深度学习的一个分支,它在 wikipedia 上的解释如下: 首先我们可以知道,深度神经...
工作两年的迷茫
2019年着实是迷茫的一年,各大公司传来了裁员消息,再加上前段时间部门业务调整,工作开始有些闲置,调整完后,现在的业务方向与自己期望的有些偏差。工作近两年,照理来说应该还是个职场新手,却有种已经工作四五年的感觉,突...
推荐系统入门
什么是推荐系统 维基百科定义如下: 首先推荐系统是一个过滤系统,这里对“物品”的定义很宽泛,物品可以是人、消费品、服务、信息等等,不同的业务场景的“物品”是不同的。 e.g. - 电商业务(淘宝、京东)的推荐系统中物品指...
梯度下降与线性回归
基本概念 梯度下降法是机器学习中最常用的优化方法之一,主要作用是求解目标函数的极小值。基本原理就是让目标函数沿着某个方向去搜索极小值,而这个方向就是梯度下降的方向,如果搜索极大值,就是沿着梯度上升方向。 什么是梯...
2018年终总结
总觉得2018年过得非常快,快到以为现在还是2018,写日期的时候才反应过来现在已经到了2019。2018对我来说是圆满的一年,入职鹅厂,认识晴子,一切都显得那幸运。 工作经历 2018年算是迈入工作的的第二个年头,一月份刚好有个鹅...
Node.js的进程管理
众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进行异步IO操作的IO线程。这种单线程模型带来的好处...
koa-router源码解析
koa-router koa-router应该是最常使用的koa的路由库,其源码比较简单,而且有十分详细的注释与使用案例。使用方式也比tj大神的koa-route要简洁。 如何使用koa-router 按照惯例,先看看koa-router的使用方法。 var Koa = requir...
koa2源码解析
如何使用koa 在看koa2的源码之前,按照惯例先看看koa2的hello world的写法。 const Koa = require('koa'); const app = new Koa(); // response app.use(ctx => { ctx.body = 'Hello Koa'; }); app.listen(3000); 一开始就通过...
前端业务组件化实践
最近一直在做管理端相关的需求,管理端不比h5每天都有高流量,需要不断地做性能上的优化,以及适配不同设备兼容性。但是管理端也面临着自己的挑战,因为项目越来越大,可配置化的东西就越来越多,管理端的页面也就越多,同时面...
ElementUI的构建流程
背景 最近一直在着手做一个与业务强相关的组件库,一直在思考要从哪里下手,怎么来设计这个组件库,因为业务上一直在使用ElementUI(以下简称Element),于是想参考了一下Element组件库的设计,看看Element构建方式,并且总结成...
seajs源码解读
近几年前端工程化越来越完善,打包工具也已经是前端标配了,像seajs这种老古董早已停止维护,而且使用的人估计也几个了。但这并不能阻止好奇的我,为了了解当年的前端前辈们是如何在浏览器进行代码模块化的,我鼓起勇气翻开了S...
使用ESLint+Prettier来统一前端代码风格
正文之前,先看个段子放松一下: 去死吧!你这个异教徒! 想起自己刚入行的时候,从svn上把代码checkout下来,看到同事写的代码,大括号居然换行了。心中暗骂,这个人是不是个**,大括号为什么要换行?年轻气盛的我,居然满腔怒...
webpack4初探
一、前言 2018/2/25,webpack4正式发布,距离现在已经过去三个多月了,也逐渐趋于稳定,而且现在的最新版本都到了4.12.0(版本迭代快得真是让人害怕)。 很多人都说webpack复杂,难以理解,很大一部分原因是webpack是基于配置的...
git快速入门
背景 git作为现在最为流行的版本管理系统,大部分公司都使用git进行版本控制, 并且最大同性交友网站github也是在git的基础上建立的。 很多人认为git难,在于它的一些概念与之前流行的集中化的版本管理系统有所出入, 只要通过...
RequireJS源码分析(下)
这篇文章主要会讲述模块加载操作的主要流程,以及Module的主要功能。废话不多说,直接看代码吧。 模块加载使用方法: require.config({ paths: { jquery: 'https://cdn.bootcss.com/jquery/3.2.1/jquery' } }); require(['jque...
2017年终总结
想想日子过得也快,2017年算是自己正式参加工作的一年。而且也是今年毕业,正式踏入社会。 17年2月来深圳找实习工作,碰壁也蛮多次,得到的结果都是基础很好,但是没经验,我们不要实习生,还有这简历不匹配工作年限直接就被刷...
RequireJS源码分析(上)
requirejs作为AMD(Asynchronous Module Definition--异步的模块加载机制)规范的实现,还是有必要看看的。初识requirejs源码,必须先弄清楚requirejs的模块是如何定义的,并且要知道入口在哪个地方,如果清楚了调用方式,看源...
【翻译】深入ES6模块
回想2007年,那时候我刚加入Mozilla's JavaScript团队,那时候的一个典型的JavaScript程序只需要一行代码,听起来像个笑话。 两年后,Google Maps发布。在这之前,JavaScript主要用来做表单的验证,你用来处理<input onchange=...
babel到底该如何配置?
背景 说起ES6,webpack,打包,模块化总是离不开babel,babel作为一个js的编译器已经被广泛使用。在babel的官网是这样介绍它的: 大家都知道js作为宿主语言,很依赖执行的环境(浏览器、node等),不同环境对js语法的支持不尽相...
JavaScript中this关键字
this一直是js中一个老生常谈的东西,但是我们究竟该如何来理解它呢? 在《JavaScript高级程序设计》中,对this的解释是: 我们来逐字解读这句话: - this是一个对象 - this的产生与函数有关 - this与执行环境绑定 说通俗一点就...
linux下升级npm以及node
npm升级 废话不多说,直接讲步骤。先从容易的开始,升级npm。 npm这款包管理工具虽然一直被人们诟病,很多人都推荐使用yarn,但其使用人数还是不见减少,况且npm都是随node同时安装好的,一时让我抛弃它,还是有点难做到。 npm...
Gulp入门指南
为什么要写这篇博客? 谈起为什么,其实就是想总结下这段时间做的工作。之前一直在用gulp,但是一直没有自己的思考,下了两个插件就开始了。这一次为公司的项目配置了一次gulp,尽可能多的考虑到了一些情况,比如本地开发调试时...