Minimal and Clean blog theme for Hugo
CDN内容分发网络
CDN是什么
如果没有CDN
www.baidu.com
-> DNS解析
-> 123.123.123.123
加入了CDN以后
访问 www.baidu.com
-> DNS解析为CNAME域名
-> CDN地址image.baidu.cnd258.com
-> 在CDN服务器中未发现请求的资源
-> 到源服务器请求资源
当再次请求相同的资源时,CDN服务器会直接返回资源,而不会访问源服务器。
- 由于有了cdn缓存资源,源服务器的压力大大减小。避免了由于访问量过多而无法响应请求。
- cdn服务商有大量的服务器分布于广阔的地理范围内,可以就近响应请求,从而提高响应请求的速度。
- 可以通过cdn的api提前将cdn没有缓存的资源添加到缓存中,这样用户第一次访问资源就可以享受到cdn的缓存加速。
配置
- 提供给CDN服务商需要加速的网址和源服务器的ip或域名。服务商会给我们一个cdn网址
- 域名解析:在网址的dns解析处,加一条CNAME解析,将原来的网址解析为cdn网址
Nginx的简单使用
CSS知识点汇总
选择器
优先级
伪类
伪元素
盒子模型
- 内容、内边距、边框、外边距、box-sizing
- 背景颜色、背景图片、背景渐变色
- outline、box-shadow
外边距合并
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者
布局
- 浮动和定位在内的传统布局方法
- 弹性盒(flexbox)布局
书写规范
less
…React With Gesture
React Rangeslider
利用workbox实现资源的预下载
需求
- 资源本地化:上课时课件的所有资源预先下载。
- 绘本插件图片资源多,需要预先下载。
实现方案
workbox
使用
- 安装 workbox
npm install workbox-cli --global
- 在项目目录下运行命令,进行 workbox 的配置,会生成一个配置文件 workbox-config.js
cd ./a/b/project_path workbox wizard
- 默认生成的 workbox 的依赖是 google 的 cdn ,国内无法访问,可通过配置改为使用本地依赖。在配置文件(workbox-config.js)中添加或修改为
"importWorkboxFrom": "local",
- 根据配置文件让 workbox 工作,会生成一些 service worker 相关的文件,入口是 sw.js 文件
workbox generateSW workbox-config.js
- 在项目入口的html文件(index.html)中引入 workbox 。
<script> if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/sw.js'); }); } </script>
workbox 会遍历它的工作目录下的所有html文件,将html文件及其中依赖的图片、css和js文件全部加入一个列表中。当第一个页面载入后 workbox 开始工作,利用 service worker 的 api 预下载列表中的文件(缓存)。当访问其他网页或者没有网络/弱网时,就可以使用缓存工作。
…正则表达式
精准匹配
一个字符跟着一个字符,完全匹配
/test/
匹配一类字符
匹配组合中的任意一个👇
[abc]
除了组合中的所有👇
[^abc]
☢️歧义:^
有2中含义:在[]
中表示“非”,在正则表达式的开头/^abc/
,表示匹配以abc
开头的字符串。
从a到m之间👇
[a-m]
转义
字母和数字都可以表示自己。但$``-``^
可以表达自身以外的东西,要使用反斜杠“\”来转义。
重复
/t?est/
👉字符后加?
表示一次或零次出现
/t+est/
👉+
表示一次或多次出现
/t*est/
👉 *
表示零次或多次出现
/t{4}est/
👉{4}
表示4次出现
/t{4,10}est/
👉{4-10}
表示4-10次出现
/t{4,}est/
👉{4,}
表示4-多次出现
预定义字符
\t
表示水平制表符tab
\s
表示任何空字符,如空格、tab、回车等
还有很多
分组
操作符(如+``*``?
)只能影响它前面的术语。使用小括号()
可以使操作符作用于一组术语。
例子:/(ab)+/
会匹配"ab"
字符串一次或多次。
☢️歧义:()
同时还有捕获的作用。
或
使用竖线表示或的关系,比如/a|b/
匹配a或b,与/[ab]/
类似
反向引用
看这个正则/^([abc])a\1)/
,其中()
为捕获,可能捕获到a
或b
或c
,\1
就表示被捕获到的那个字符。
比如,对于字符串bab
,首先([abc])
捕获到了b
,\1
就代表b
,所以bab
可以匹配。
捕获及捕获的引用
/(hello) (world)/
在匹配字符串 hello world
时会将 () 中的字符进行捕获,可以用 $1
$2
表示。
在string.replace()
中,使用"$1"表示被捕获到的字符。
比如,'hello world'.replace(/(hello) (world)/, '$1 666-$2')
,会输出"hello 666-world"
(?: . . .)表示非捕获分组,也就是不会被捕获,仅表示分组。
trim()的实现
方法1
str.replace(/^\s+|\s+$/g,"")
,在头尾分别替换掉空字符
方法2
var str = strings.replace(/^\s\s*/,""), //在头部替换
ws = /\s/,
i = str.length;
while(ws.test(str.charAt(--i))); // 看在尾部有几个空字符
return str.slice(0,i+1); // 剔除空字符
方法2比方法1在长文档中性能更好。
…React Popup
D3学习笔记
circle
circle(圆形)有3个主要属性
- cx、cy,圆心的坐标
- r,半径
线性映射
const scale = d3.scaleLiner();
scale.domain = ([100, 200]);
scale.range = ([10, 50]);
const output = scale(50);
3个概念:
- scaleLiner,线性映射。
- domain(域),存放的是真实的数据。
- range(范围),映射后的范围。
domain中的数据会被线性映射到range中。
scale(50);
中的50
是domain中的值,output为映射后的值。
最值
const positionData = [[1, 7, -4],[6, 3, 8],[2, 8, 3]]
const maxZ = d3.max(positionData, (d)=>d[2])
动态缩放
处理复杂数据的第一步是确定缩放比例,才能让所有数据点都包含在svg画布中。
const xScale = d3.scaleLinear()
.domain([0, d3.max(dataset, (d) => d[0])])
.range([padding, w - padding]);
在数据集中找到最大最小值,作为domain
的边界,将数据集映射到画布大小的range
中
坐标轴
const yAxis = d3.axisLeft(yScale);
svg.append("g")
.attr("transform", "translate(0," + (h - padding) + ")")
.call(xAxis);
svg的image元素
<image
fill="#000000"
x={x} y={x}
width={w} height={h}
preserveAspectRatio="none"
xlinkHref={mark.point.image}
/>