Compare commits

...
8 Commits
Author SHA1 Message Date
ascoders 688337f7c4 Merge branch 'master' of https://github.com/ascoders/weekly 2022-04-18 09:54:36 +08:00
ascoders 8ab24fca04 238 2022-04-18 09:52:43 +08:00
黄子毅 e043a91f07 Merge pull request #412 from Trojan0523/patch-1
fix: typo
2022-04-16 17:23:21 +08:00
trojan0523 448544786b fix: typo 2022-04-16 16:46:57 +08:00
黄子毅 f5859dbe08 Merge pull request #411 from FrankKai/master
fix: typo in 144.精读《Webpack5 新特性 - 模块联邦》
2022-04-16 15:17:00 +08:00
frankkai c83a2cd983 fix: typo in 144.精读《Webpack5 新特性 - 模块联邦》 2022-04-15 16:28:09 +08:00
黄子毅 b3c5ad948b Merge pull request #409 from careteenL/patch-2
fix: typo in 精读《Typescript 4.5-4.6 新特性》
2022-04-11 10:58:36 +08:00
Careteen a0cd51951e fix: typo in 精读《Typescript 4.5-4.6 新特性》 2022-04-11 09:37:04 +08:00
4 changed files with 177 additions and 4 deletions
+2 -1
View File
@@ -6,7 +6,7 @@
前端界的好文精读,每周更新!
最新精读:<a href="./前沿技术/237.%E7%B2%BE%E8%AF%BB%E3%80%8ATypescript%204.5-4.6%20%E6%96%B0%E7%89%B9%E6%80%A7%E3%80%8B.md">237.精读《Typescript 4.5-4.6 新特性》</a>
最新精读:<a href="./前沿技术/238.%E7%B2%BE%E8%AF%BB%E3%80%8A%E4%B8%8D%E5%86%8D%E9%9C%80%E8%A6%81%20JS%20%E5%81%9A%E7%9A%84%205%20%E4%BB%B6%E4%BA%8B%E3%80%8B.md">238.精读《不再需要 JS 做的 5 件事》</a>
素材来源:[周刊参考池](https://github.com/ascoders/weekly/issues/2)
@@ -187,6 +187,7 @@
- <a href="./前沿技术/228.%E7%B2%BE%E8%AF%BB%E3%80%8Apipe%20operator%20for%20JavaScript%E3%80%8B.md">228.精读《pipe operator for JavaScript》</a>
- <a href="./前沿技术/230.%E7%B2%BE%E8%AF%BB%E3%80%8A%E5%AF%B9%20Markdown%20%E7%9A%84%E6%80%9D%E8%80%83%E3%80%8B.md">230.精读《对 Markdown 的思考》</a>
- <a href="./前沿技术/237.%E7%B2%BE%E8%AF%BB%E3%80%8ATypescript%204.5-4.6%20%E6%96%B0%E7%89%B9%E6%80%A7%E3%80%8B.md">237.精读《Typescript 4.5-4.6 新特性》</a>
- <a href="./前沿技术/238.%E7%B2%BE%E8%AF%BB%E3%80%8A%E4%B8%8D%E5%86%8D%E9%9C%80%E8%A6%81%20JS%20%E5%81%9A%E7%9A%84%205%20%E4%BB%B6%E4%BA%8B%E3%80%8B.md">238.精读《不再需要 JS 做的 5 件事》</a>
### 设计模式
@@ -86,7 +86,7 @@ module.exports = {
1. `name` 当前应用名称,需要全局唯一。
2. `remotes` 可以将其他项目的 `name` 映射到当前项目中。
3. `exposes` 表示导出的模块,只有在此申明的模块才可以作为远程依赖被使用。
4. `shared` 是非常重要的参数,定了这个参数,可以让远程加载的模块对应依赖改为使用本地项目的 React 或 ReactDOM。
4. `shared` 是非常重要的参数,定了这个参数,可以让远程加载的模块对应依赖改为使用本地项目的 React 或 ReactDOM。
比如设置了 `remotes: { app_two: "app_two_remote" }`,在代码中就可以直接利用以下方式直接从对方应用调用模块:
@@ -158,7 +158,7 @@ class Person {
}
```
该判断隐式要求了 `#name in other``other` 是 Person 实例化的对象,因为该语法仅可能存在于类中,而且还能进一步类型缩窄为 Persion 类。
该判断隐式要求了 `#name in other``other` 是 Person 实例化的对象,因为该语法仅可能存在于类中,而且还能进一步类型缩窄为 Person 类。
## Import 断言
@@ -452,7 +452,7 @@ f1("a", 42);
f1("b", "hello");
```
如果把参数定义为组且使用或并列枚举时,其实就潜在包含了一个运行时的类型收窄。比如当第一个参数值为 `a` 时,第二个参数类型就确定为 `number`,第一个参数值为 `b` 时,第二个参数类型就确定为 `string`
如果把参数定义为组且使用或并列枚举时,其实就潜在包含了一个运行时的类型收窄。比如当第一个参数值为 `a` 时,第二个参数类型就确定为 `number`,第一个参数值为 `b` 时,第二个参数类型就确定为 `string`
值得注意的是,这种类型推导是从前到后的,因为参数是自左向右传递的,所以是前面推导出后面,而不能是后面推导出前面(比如不能理解为,第二个参数为 `number` 类型,那第一个参数的值就必须为 `a`)。
@@ -0,0 +1,172 @@
关注 JS 太久,会养成任何功能都用 JS 实现的习惯,而忘记了 HTML 与 CSS 也具备一定的功能特征。其实有些功能用 JS 实现吃力不讨好,我们要综合使用技术工具,而不是只依赖 JS。
[5 things you don't need Javascript for](https://lexoral.com/blog/you-dont-need-js/) 这篇文章就从 5 个例子出发,告诉我们哪些功能不一定非要用 JS 做。
## 概述
### 使用 css 控制 svg 动画
原文绘制了一个放烟花的 [例子](https://lexoral.com/blog/you-dont-need-js/),本质上是用 css 控制 svg 产生动画效果,核心代码:
```css
.trail {
stroke-width: 2;
stroke-dasharray: 1 10 5 10 10 5 30 150;
animation-name: trail;
animation-timing-function: ease-out;
}
@keyframes trail {
from,
20% {
stroke-width: 3;
stroke-dashoffset: 80;
}
100%,
to {
stroke-width: 0.5;
stroke-dashoffset: -150;
}
}
```
可以看到,主要使用 `stroke-dasharray` 控制线条实虚线的样式,再利用动画效果对 `stroke-dashoffset` 产生变化,从而实现对线条起始点进行位移,实现线条 “绘图” 的效果,且该 css 样式对 svg 绘制的路径是生效的。
### sidebar
可以完全使用 css 实现 hover 时才出现的侧边栏:
```css
nav {
position: 'absolute';
right: 100%;
transition: 0.2s transform;
}
nav:hover,
nav:focus-within {
transform: translateX(100%);
}
```
核心在于 `hover` 时设置 `transform` 属性可以让元素偏移,且 `translateX(100%)` 可以位移当前元素宽度的身位。
另一个有意思的是,如果使用 TABS 按键聚焦到 sidebar 内元素也要让 sidebar 出来,可以直接用 `:focus-within` 实现。如果需要 hover 后延迟展示可以使用 `transition-delay` 属性。
### sticky position
使用 `position: sticky` 来黏住一个元素:
```css
.square {
position: sticky;
top: 2em;
}
```
这样该元素会始终展示在其父容器内,但一旦其出现在视窗时,当 top 超过 `2em` 后就会变为 `fixed` 定位并保持原位。
使用 JS 判断还是挺复杂的,你得设法监听父元素滚动,并且在定位切换时可能产生一些抖动,因为 JS 的执行与 CSS 之间是异步关系。但当我们只用 CSS 描述这个行为时,浏览器就有办法解决转换时的抖动问题。
### 手风琴菜单
使用 `<details>` 标签可以实现类似一个简易的折叠手风琴效果:
```html
<details>
<summary>title</summary>
<p>1</p>
<p>2</p>
</details>
```
`<details>` 标签内的 `<summary>` 标签内容总是会展示,且点击后会切换 `<details>` 内其他元素的显隐藏。虽然这做不了特殊动画效果,但如果只为了做一个普通的展开折叠功能,用 HTML 标签就够了。
### 暗色主题
虽然直觉上暗色主题好像是一种定制业务逻辑,但其实因为暗色主题太过于普遍,以至于操作系统和浏览器都内置实现了,而 CSS 也实现了对应的方法判断当前系统的主题到底是亮色还是暗色:[prefers-color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme)。
所以如果系统要实现暗色系主题,最好可以和操作系统设置保持一致,这样用户体验也会更好:
```css
@media (prefers-color-scheme: light) {
/** ... */
}
@media (prefers-color-scheme: dark) {
/** ... */
}
@media (prefers-color-scheme: no-preference) {
/** ... */
}
```
如果使用 Checkbox 勾选是否开启暗色主题,也可以仅用 CSS 变量判断,核心代码是:
```css
#checkboxId:checked ~ .container {
background-color: black;
}
```
`~` 这个符号表示,`selector1 ~ selector2` 时,为选择器 `selector1` 之后满足 `selector2` 条件的兄弟节点设置样式。
## 精读
除了上面例子外,笔者再追加几个例子。
### 幻灯片滚动
幻灯片滚动即每次滚动有固定的步长,把子元素完整的展示在可视区域,不可能出现上下或者左右两个子元素各出现一部分的 “割裂” 情况。
该场景除了用浏览器实现幻灯片外,在许多网站首页也被频繁使用,比如将首页切割为 5 个纵向滚动的区块,每个区块展示一个产品特性,此时滚动不再是连续的,而是从一个区块到另一个区块的完整切换。
其实这种效果无需 JS 实现:
```css
html {
scroll-snap-type: y mandatory;
}
.child {
scroll-snap-align: start;
}
```
这样便将页面设置为精准捕捉子元素滚动位置,在滚轮触发、鼠标点击滚动条松手或者键盘上下按键时,`scroll-snap-type: y mandatory` 可以精准捕捉这一垂直滚动行为,并将子元素完全滚动到可视区域。
### 颜色选择器
使用 HTML 原生就能实现颜色选择器:
```html
<input type="color" value="#000000">
```
<img width=500 src="https://s1.ax1x.com/2022/04/17/LNUv7t.png">
该选择器的好处是性能、可维护性都非常非常的好,甚至可以捕捉桌面的颜色,不好的地方是无法对拾色器进行定制。
## 总结
关于 CSS 可以实现哪些原本需要 JS 做的事,有很多很好的文章,比如:
- [youmightnotneedjs](http://youmightnotneedjs.com/)。
- [You-Dont-Need-JavaScript](https://github.com/you-dont-need/You-Dont-Need-JavaScript)。
- 以及本文简介里介绍的 [5 things you don't need Javascript for](https://lexoral.com/blog/you-dont-need-js/)。
但并不是读了这些文章,我们就要尽量用 CSS 实现所有能做的事,那样也没有必要。CSS 因为是描述性语言,它可以精确控制样式,但却难以精确控制交互过程,对于标准交互行为比如幻灯片滑动、动画可以使用 CSS,对于非标准交互行为,比如自定义位置弹出 Modal、用 svg 绘制完全自定义路径动画尽量还是用 JS。
另外对于交互过程中的状态,如果需要传递给其他元素响应,还是尽量使用 JS 实现。虽然 CSS 伪类可以帮我们实现大部分这种能力,但如果我们要监听状态变化发一个请求什么的,CSS 就无能为力了,或者我们需要非常 trick 的利用 CSS 实现,这也违背了 CSS 技术选型的初衷。
最后,能否在合适的场景选择 CSS 方案,也是技术选型能力的一种,不要忘了 CSS 适用的领域,不要什么功能都用 JS 实现。
> 讨论地址是:[精读《不再需要 JS 做的 5 件事》· Issue #413 · dt-fe/weekly](https://github.com/dt-fe/weekly/issues/413)
**如果你想参与讨论,请 [点击这里](https://github.com/dt-fe/weekly),每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。**
> 关注 **前端精读微信公众号**
<img width=200 src="https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg">
> 版权声明:自由转载-非商用-非衍生-保持署名([创意共享 3.0 许可证](https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh)