xyxsw
文章35
标签3
分类0
JavaScript | 青训营笔记

JavaScript | 青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第 3 天

课程重点

  1. 编码原则
  2. 组件封装
  3. 过程抽象概念
  4. 高阶函数使用模式
  5. JavaScript 编程范式

详细知识点介绍

编码原则

各司其职,组件封装,过程抽象

我们在编码的时候需要注意,尽量让HTML/CSS/JS各司其职,避免不必要的由JS直接操作样式。

组件封装

组件是指一个包含模板、功能、样式的单元,好的组件具有封装性、正确性、扩展性、复用性。

过程抽象

过程抽象用来处理细节控制的一些方法。 需要函数式编程的思想。

函数式编程,简单理解就是无副作用的输入->处理->输出。

为了能够让只执行一次的需求覆盖不同的事件处理,我们可以将这个需求剥离出来,这个过程我们称为过程抽象

高阶函数(HOF)介绍

  • 以函数作为参数

  • 以函数作为返回值

  • 常用于作为函数装饰器

常见的高阶函数

Once

用于只需要执行一次的函数

function once(fn) {
    return function(...args) {
        if(fn) {
            const ret = fn.apply(this, args);
            fn = null;
            return ret;
        }
    }
}

使用方法:

const print = (content) => {
    console.log(content)
}

const printOnce = once(print)

printOnce("1") // 输出 1
printOnce("2") // 不输出

常用于只需要执行一次的的事件侦听器(也可以使用事件侦听器自带的once option,或者手动在执行后移除侦听器)

节流(Throttle)

如果快速调用函数,那么只有第一次能成功调用函数,之后时间间隔之内的调用会被忽略。常用于滚动条事件/瀑布流无限滚动的场景(限制函数调用频率,保证一段时间内函数只调用一次)

function throttle(fn, time = 500) {
    let timer = null;
    return function (...args) {
        if (timer) return;
        fn.apply(this, args);
        timer = setTimeout(() => {
            timer = null;
        }, time);
    }
}

防抖

当在时间间隔之内快速调用函数时,函数将始终没法执行,直到停止后,函数才会被执行。常用于一些文本输入的场景(比如搜索框停止输入后,展示联想词;文章编辑器中,输入停止后,进行草稿的保存)。

function debounce(fn, time = 500) {
    let timer = null;
    return function (...args) {
        if (timer) clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, time);
    }
}

Consumer

从名字也很好理解,当快速点击时,函数并不会立刻被调用,而是先将任务推入列表,然后在一定时间后一个一个消费掉。

function consumer(fn, time = 500) {
    let tasks = [];
    let timer = null;
    return function (...args) {
        tasks.push(args);
        if (timer) return;
        timer = setInterval(() => {
            fn.apply(this, tasks.shift());
            if (tasks.length === 0) {
                clearInterval(timer);
                timer = null;
            }
        }, time)
    }
}

Lterative 可迭代函数

编程范式

命令式与声明式。

命令式趋向于怎么做。声明式趋向于做什么。

JS是既有命令式又有声明式。

命令式

let list =[1,2,3]
let map = []

for(let i =0;i<list.length;i++){
    map.push(list[i]*2);
}

声明式

let list = [1,2,3,4];
const double = x => x*2;
list.map(double);

实践练习例子

实现一个只能执行一次的函数:

// 只执行一次函数
const once = (fn) => {
  let done = false;
  return function (...args) {
    if (!done) {
      done = true;
      return fn.apply(this, args);
    }
  }
}

// 测试
const sayHello = (name) => {
  console.log(`Hello ${name}`);
};

const sayHelloOnce = once(sayHello);

sayHelloOnce('xiaoming'); // Hello xiaoming
sayHelloOnce('xiaohong'); // undefined

课后个人总结

​ 本次课程让我学到了很多有关编程原则、组件封装、过程抽象概念、高阶函数使用模式以及JavaScript编程范式的知识,收获很大。

​ 对于高阶函数,过去只是略有了解,现在能够真正去理解它们是什么,以及它们的用处如何。

引用参考

https://bytedance.feishu.cn/file/boxcnxKucsHPvnJ7PfXyCQF5WCd

深入CSS | 青训营笔记

深入CSS | 青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第 2 天

课程重点

  1. 选择器的特异度
  2. 属性的继承
  3. Layout 方式
  4. 盒子模型
  5. 块级元素和行级元素
  6. flex
  7. grid
  8. float
  9. position

详细知识点介绍:

1. 选择器的特异度(Specificity)

即 CSS 选择器的优先级,当一个元素能够匹配多个样式时,浏览器会根据优先级为元素赋予正确的样式。

一般情况下,ID选择器优先级最高,其次是类选择器/属性选择器/伪类,优先级最低的是类型选择器和伪元素选择器。不同选择器的叠加也会改变优先级。!important 的样式会覆盖其他样式。

VSCode 中,鼠标悬浮在选择器上是,能实时看到选择器的优先级数值

id选择器 大于 类选择器 大于 标签选择器

2. CSS 属性的继承

某些属性会自动继承其父元素的计算值除非显式指定一个值

不同的 CSS 属性有着不同的继承规则。对于一个能够被继承的样式属性,子元素能够从父元素继承相同的属性值,而不需要额外的设置。当然,对于一个默认不继承的样式,也可以通过将其值设置为inherit来强制从父元素继承。

初始值:CSS 中,每个属性都有一个初始值 background-color 的初始值为 transparent
margin-left 的初始值为 0
可以使用 initial 关键字显式重置为初始值
background-color: initial

3. CSS 布局方式

CSS 存在许多种布局方式。总体上分为三类:常规流/文档流、浮动、绝对定位。其中,在正常的文档流中,又可以细分出很多布局方式,例如行级、块级、表格布局、弹性布局(flex)、网格布局(grid)

盒子模型:margin border padding

4. CSS 盒子模型

width: content box 的宽度

height: content box 的高度

padding: 元素内边距,百分比相对于元素宽度

border: 元素的边框样式、粗细和颜色

margin: 元素外边距,百分比相对于元素宽度

当 box-sizing 取值为 border-box 时,模型会发生相应变化。

5. 块级元素

display 属性值为 block 的元素。例如 bodyarticledivmainsectionph1~`h6ul/olli` 等

行级元素

display 属性值为 inline 的元素。

6. flex

布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。

2009年,W3C提出了一种新的方案—Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性.

.box{
  display: flex;
}

任何一个容器都可以指定为Flex布局。

采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}

项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

7. grid

网格是一组相交的水平线和垂直线,它定义了网格的列和行。

CSS 提供了一个基于网格的布局系统,带有行和列,可以让我们更轻松地设计网页,而无需使用浮动和定位。

当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将成为网格元素。

grid: none;
grid: "a" 100px "b" 1fr;
grid: [linename1] "a" 100px [linename2];
grid: "a" 200px "b" min-content;
grid: "a" minmax(100px, max-content) "b" 20%;
grid: 100px / 200px;
grid: minmax(400px, min-content) / repeat(auto-fill, 50px);

grid: 200px / auto-flow;
grid: 30% / auto-flow dense;
grid: repeat(3, [line1 line2 line3] 200px) / auto-flow 300px;
grid: [line1] minmax(20em, max-content) / auto-flow dense 40%;

grid: auto-flow / 200px;
grid: auto-flow dense / 30%;
grid: auto-flow 300px / repeat(3, [line1 line2 line3] 200px);
grid: auto-flow dense 40% / [line1] minmax(20em, max-content);

grid: inherit;
grid: initial;
grid: unset;

我们通过 grid-template-columnsgrid-template-rows 属性来定义网格中的行和列。

这些属性定义了网格的轨道,一个网格轨道就是网格中任意两条线之间的空间。

在下图中你可以看到一个绿色框的轨道——网格的第一个行轨道。第二行有三个白色框轨道。

轨道可以使用任何长度单位进行定义。

网格引入了 fr 单位来帮助我们创建灵活的网格轨道。一个 fr 单位代表网格容器中可用空间的一等份。

以下实例定义了一个网格定义将创建三个相等宽度的轨道,这些轨道会随着可用空间增长和收缩。

一个网格单元是在一个网格元素中最小的单位, 从概念上来讲其实它和表格的一个单元格很像。现在再看回我们前面的一个例子, 一旦一个网格元素被定义在一个父级元素当中,那么他的子级元素将会排列在每个事先定义好的网格单元中。

列与列,行与行之间的交接处就是网格线。

Grid 会为我们创建编号的网格线来让我们来定位每一个网格元素。

#container {
  display: grid;
  grid: repeat(2, 60px) / auto-flow 80px;
}

#container > div {
  background-color: #8ca0ff;
  width: 50px;
  height: 50px;
}

网格线的编号顺序取决于文章的书写模式。在从左至右书写的语言中,编号为 1 的网格线位于最左边。在从右至左书写的语言中,编号为 1 的网格线位于最右边。

接下来我使用了 grid-column-start, grid-column-end, grid-row-start 和 grid-row-end 属性来演示如何使用网格线。

以下实例我们设置一个网格元素的网格线从第一列开始,第三列结束:

.item1 {
  grid-column-start: 1;
  grid-column-end: 3;
}

https://www.runoob.com/try/gridgarden/index.html

菜鸟教程的grid布局小游戏

实践练习例子:

特异度相关例子

下面的文字是什么颜色?

<div class="wrapper1">
  <div class="text1">文本1</div>
</div>
<style>
  .wrapper1 .text1 {
    color: red;
  }
  
  .text1 {
    color: black;
  }
</style>

正确答案是红色

虽然黑色的属性声明在后面,理应覆盖掉前面的红色,但是前面是两个类选择器的叠加,优先级是 0, 2, 0 ,后者只有一个类选择器,优先级是 0, 1, 0,所以最终浏览器应用了红色。

课后个人总结:

本节课中,我学习了CSS中特异度、属性继承、布局方式、盒子模型、块级元素和行级元素、flex、grid等概念,掌握了相关的知识和应用。 特异度是CSS中最重要的概念之一,让我们明白当一个元素能够匹配多个样式时,浏览器会根据优先级为元素赋予正确的样式。

属性的继承也是重要的概念,它会依赖于不同的CSS属性,有了它,我们可以让HTML元素的样式可以从父元素继承。

我们还学习了CSS中的布局方式,包括常规流/文档流、浮动、绝对定位等,以及flex、grid等网格布局。

熟练掌握这些知识,我们可以更好的制作网页,满足各种布局的需求。

引用参考:

课程ppt

https://developer.mozilla.org/zh-CN/docs/Web/CSS/grid

https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox

前端与 HTML | 青训营笔记

前端与 HTML | 青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第 1 天

本堂课重点内容:

  1. 前端的介绍
  2. HTML 标签的简单介绍
  3. HTML 语义化

详细知识点介绍:

  1. 前端技术栈
  2. 前端的边界、开发环境(ide、浏览器)
  3. DOM 树的简单介绍
  4. HTML 语法简单介绍
  5. 各类常用标签(h1-h5、p、form、a)
  6. 常见的语义化标签(main/footer/section)
  7. 语义化的优势

实践练习例子:

1. 标题元素

使用 h1~`h6` 标签将标题文本包裹,标题会根据级别拥有默认的字重、字号和外边距。

<h1>一级标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h4>四级标题</h4>
<h5>五级标题</h5>
<h6>六级标题</h6>

2. 图片元素

使用 src 属性来确定图片链接,alt 属性用于表示图片无法显示时的替代文本

<img src="https://example.com/image" />
<img src="https://example.com" alt="显示不出来的图片" />

3. 单选框

radio 类型的 input 元素,相同 name 的单选框会归为同一组(只能选其中一个) 使用 label 标签来标识单选框的内容

<input type="radio" id="el1" name="group1" />
<label for="el1">第一组-选项1</label>
<input type="radio" id="el2" name="group1" />
<label for="el2">第一组-选项1</label>
<br>
<input type="radio" id="el3" name="group2" />
<label for="el3">第二组-选项1</label>
<input type="radio" id="el4" name="group2" />
<label for="el4">第二组-选项2</label>

4. 超链接

使用 a 标签包裹文本,href 属性是目标链接,默认在当前页面打开,为了在新标签页打开,可以将 target 属性设置为 _blank

<a href="https://example.com">在当前页面打开</a>
<a href="https://example.com" target="_blank">在新页面打开</a>

5. 有序列表

最外层使用 ol标签包裹,内部包含多个 li 标签

<ol>
    <li>第一</li>
    <li>第二</li>
    <li><em>第三</em></li>
</ol>

6. 无序列表

最外层使用 ul标签包裹,内部包含多个 li标签

<ul>
    <li>第一</li>
    <li>第二</li>
    <li><em>第三</em></li>
</ul>

课后个人总结:

本节课主要介绍了前端的技术栈,以及 HTML 标签的简单介绍和 HTML 语义化,通过本节课的学习,我对 HTML 标签有了一定的了解,掌握了如何使用标签来表达页面元素,并且学习了如何使用语义化标签来提高前端代码的可读性,以及提升代码的可维护性。

HTTP3初体验 | 青训营笔记

HTTP3初体验 | 青训营笔记

HTTP/3试水

I

小看一眼,发现全是编译啥的。应该会踩很多坑的,这次用国外没东西的小1h512M服务器试水一下。
目前cloudflare给出了一键开启http3。很好用,我在netlify托管的网页一键开开了。
1
2

II

现在要编译安装一个nginx,用的是https://github.com/cloudflare/quiche方案。
https://github.com/cloudflare/quiche/tree/master/nginx处理nginx的教程在这里,一步步跟上

  curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
  tar xzvf nginx-1.16.1.tar.gz
  git clone --recursive https://github.com/cloudflare/quiche
  cd nginx-1.16.1
  patch -p01 < ../quiche/nginx/nginx-1.16.patch

在之前要apt upgrade一下避免有装不上的东西
3
外网服务器下的就是快😎
要编译了发现cmake没有 装个cmake先
apt install cmake

gcc g++也没有 装个

接下来

  ./configure                                 \
       --prefix=$PWD                           \
       --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" \
       --with-http_ssl_module                  \
       --with-http_v2_module                   \
       --with-http_v3_module                   \
       --with-openssl=../quiche/quiche/deps/boringssl \
       --with-quiche=../quiche
  make

nginx configure 时候报错,
the HTTP rewrite module requires the PCRE library.
搜了 装这个 apt install libpcre3 libpcre3-dev

the HTTP gzip module requires the zlib library
搜了 装这个 apt install zlib1g-dev

又error 没有cargo 装个
apt install cargo

make好了

nginx -V

装是装好了 好像要一个https证书啊
acme签一个
https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E

events {
    worker_connections  1024;
}

http {
    server {
        # Enable QUIC and HTTP/3.
        listen 443 quic reuseport;

        # Enable HTTP/2 (optional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Enable all TLS versions (TLSv1.3 is required for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Add Alt-Svc header to negotiate HTTP/3.
        add_header alt-svc 'h3=":443"; ma=86400';
    }
}

签证书签了半天 签好了 放在

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

里面
配置好nginx 注意网站不要在root下
在root下nginx访问不到直接403了
建一个/www/wwwroot/domin文件夹放东西

III

最后配置结果是这样滴

第一个

https://geekflare.com/tools/test/yn22t29e04y7v0u5jl61mcark2dwxmbn
6
这个网站会检测什么h3-xxx的版本协议 (看不懂,看懂了在写一篇
你没有这个版本号的协议这个网站就检测不出来好像 在这里改就行
add_header alt-svc 'h3=":443"; ma=86400';
我加了版本号114514🤓
add_header alt-svc h3=":443"; ma=86400; h3-114514=":443"; ma=86400
上面这个好像就检测这个alt-svc这个头

第二个

https://http3check.net/?host=http3.typescriptactions.xyz
7
这个就很正常了 不加版本直接检测h3的

第三个

然后是wappalyzer插件
8

第四个

然后是浏览器devtools的协议检查
9

IV

总结一下
2023-1-11 21:57:32 开始的
2023-1-12 00:53:12 写完这篇
🤥感觉没啥可总结的 国外服务器也测不了http3优势啥的
下班!睡觉!😝