whinc.github.io icon indicating copy to clipboard operation
whinc.github.io copied to clipboard

个人站点,包含技术笔记、博客、作品、工具等

Results 20 whinc.github.io issues
Sort by recently updated
recently updated
newest added

>原文链接:https://github.com/whinc/blog/issues/18 > 在编程中匹配字符最常见的工具是正则表达式,此外还有一种 glob 模式经常用于匹配文件路径,glob 模式在某些方面与正则表达式功能相同,但是他们各自有着不同的语法和约定,今天就一起学习下 glob 模式。 内容目录: - [介绍](#介绍) - [基础语法](#基础语法) - [扩展语法](#扩展语法) - [与 regexp 的差异](#与regexp的差异) - [JavaScript API](#JavaScriptAPI) - [应用例子](#应用例子) - [参考](#参考) # 介绍 根据[维基百科](https://en.wikipedia.org/wiki/Glob_(programming))的介绍,在计算机编程中 glob...

JS/TS

>原文链接:https://github.com/whinc/blog/issues/13 >在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂。想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理还是比较简单的。本文针对前端路由主流的实现方式 hash 和 history,提供了原生JS/React/Vue 共计六个版本供参考,每个版本的实现代码约 25~40 行左右(含空行)。 ## 什么是前端路由? 路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系。 在 Web 前端单页应用 SPA(Single Page Application)中,路由描述的是 URL 与 UI 之间的映射关系,这种映射是单向的,即 URL 变化引起 UI 更新(无需刷新页面)。 ## 如何实现前端路由? 要实现前端路由,需要解决两个核心问题:...

JS/TS

**目录** - 动机 & 目标 - `useHash` - 读写 hash 值 - `useHashSearchParams` - 读写 hash 的查询参数 - `useHashSearchParamsJSON` - 按 JSON 格式读写 hash 的查询参数 - 小结 ## 动机 &...

JS/TS

## redux 是什么? redux 是一个前端状态管理库。 为什么要搞个状态管理库来增加复杂度和学习成本呢?这样讲没错,简单的项目用 redux 就是折腾自己,我也不建议你用,但是大一点项目,尤其是多人协作时,就完全是另一回事了。 随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state(状态)。 这些 state 可能包括服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括 UI 状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等。 管理不断变化的 state 非常困难。如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,就可能引起对应 model 以及另一个 model...

JS/TS

基于 React 的 UI 组件库层出不穷,作为组件库很重要的一个功能就是实现主题换肤功能。通过组件库提供的主题定制接口,用户只需要修改一些组件的 UI 参数,就可以达到修改整个组件库样式。 目标:可定制性强,并且易学易用。 ## 一种简单的主题设计方案 为了支持根据主题改变外观,组件库中每个组件都要求暴露一个`style`属性,以便外部可以通过传入不同样式控制组件的外观。 ```javascript ``` 为了切换主题,先定义黑白两套主题。不同主题之间只是样式取值不一样,数据结构必须保持一致。每种主题详细定义了每个组件的`style`值。 ```javascript const DarkTheme = { ButtonStyle: {...}, InputStyle: {...} } const LightTheme = { ButtonStyle: {...},...

JS/TS

计算机语言很多,无论哪种语言编写代码时都会遇到变量命名、方法命名等问题,网上关于代码命名风格的讨论已经多到无法形容了,甚至成为了程序员的一种价值观。今天不讨论命名风格孰优孰劣,仅整理下已有的命名风格作为了解,方便相互之间沟通。 ## camel case (驼峰式) ![](https://raw.githubusercontent.com/whinc/blog/master/assets/7/camel.png) 特点:名称中间没有空格和标点,除第一个单词外后面的单词首字母均大写。 如果第一个单词首字母大写,称之为`upper camel case`(`CamelCase`,大驼峰式),例如`"GetUserName"`。 如果第一个单词首字母小写,称之为`lower camel case`(`camelCase`,小驼峰式),例如`"getUserName"`。 >`upper camel case`还有一个称呼`Pascal case` ## snake case (蛇式) ![](https://raw.githubusercontent.com/whinc/blog/master/assets/7/snake.jpg) 特点:名称中间的标点被替换成下划线(`_`)。 如果所有单词都小写,称之为`lower snake case`(小蛇式),例如`"get_user_name"`。 如果所有单词都大写,称之为`upper snake case`(大蛇式),例如`"GET_USER_NAME"`。 ##...

软件设计

## 需求背景 一句话描述需求:答题并根据答案生成你是什么食物,可长按保存图片。 体验地址: ![示例图片](https://github.com/whinc/blog/blob/master/assets/8/result1.png?raw=true) ## 问题1:字体文件太大 活动页用到了特殊的中文字体“汉仪小麦”,完整的字体文件约 6.9MB,而实际活动页只用到了很少的一部分字体,全部加载会增加整个页面的加载时间,需要对字体进行按需裁剪。 使用 [fontmin](https://github.com/ecomfe/fontmin) 工具进行字体裁剪,将要裁剪的文字集合保存到文本文件`keep.txt`中(有重复文字没关系会自动去重),通过下面命令裁剪字体文件: ```bash # input.ttf 输入的字体文件 # output 裁剪后的字体输出目录,包含了多种字体格式 fontmin -t "$(cat keep.txt)" input.ttf output ``` 在 CSS 中引入裁剪后的字体文件,下面这段代码是 fontmin...

JS/TS

最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论。需要同时在 H5 和小程序两端实现,该需求处理图片的地方较多,本文对 H5 端的图片处理实践做一个小结。项目代码基于 Vue 框架,为了避免受框架影响,我将代码全部改为原生 API 的实现方式进行说明,同时项目代码中有很多其他额外的细节和功能(预览、裁剪、上传进度等)在这里都省去,只介绍与图片处理相关的关键思路和代码。小程序的实现方式与 H5 类似,不再重述,在文末附上小程序端的实现代码。 ![](https://raw.githubusercontent.com/whinc/blog/master/assets/9/demo1.png) ## 拍照 使用``标签,`type`设为`"file"`选择文件,`accept`设为`"image/*"`选择文件为图片类型和相机拍摄,设置`multiple`支持多选。监听`change`事件拿到选中的文件列表,每个文件都是一个`Blob`类型。 ```html function onFileChange (event) { const files = Array.prototype.slice.call(event.target.files) files.forEach(file => console.log('file name:', file.name)) }...

JS/TS

**目录** 1. 单组件生命周期 1. 父子组件生命周期 1. 使用 keep-alive 后的单组件生命周期 1. 使用 keep-alive 后的父子组件生命周期 1. 小结 组件化思维现在已得到广泛的认可,Vue 是围绕组件化构筑起来的框架。相比传统命令式 DOM 操作需要手动检查和处理 DOM 变化,Vue 以组件为单位,使用响应式数据自动更新 DOM,在组件生命周期中处理数据和 DOM 变化的各个阶段。基于 Vue 构建的交互界面始于一个根组件,将组件有组织的层层嵌套形成一颗组件树构建起复杂的网页应用。组件层层嵌套后,组件的生命周期方法调用的顺序变得很重要,尤其在处理一些需要父子组件联动的场景。本文先分析单组件的生命周期方法的执行时机,再考虑存在父子组件时,组件生命周期方法的执行顺序变化。 ## 单组件生命周期 单组件生命周期方法执行顺序参考...

JS/TS

>简单介绍 react-router 的总体组成,大概需要阅读 5 分钟。 react-router 是基于 react 封装的前端路由库,通过它可以实现 SPA 中的路由切换(不刷新页面的情况下进行页面切换)。react-router 是一组声明式导航组件的集合,意味着你可以像普通 UI 组件一样,在 JSX 中使用路由组件,这非常符合 react 的风格。 ## 安装 react-router 项目包含四个 npm 包,按需选择安装。 * react-router:是实现路由的核心包,其余的几个包都依赖此包。服务端渲染时,只需要引入此包即可。 * react-router-dom:react-router 的 react...

JS/TS