Skip to content

Commit d731de1

Browse files
committed
chore: adjust
1 parent 9a2efa8 commit d731de1

File tree

1 file changed

+31
-23
lines changed

1 file changed

+31
-23
lines changed

slides.md

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ obj.foo = 10 // 修改可以触发执行
11461146

11471147
## 自动脱 ref
11481148

1149-
在 Vue.js 中,如下面代码所示:
1149+
在 Vue.js 中,有下面代码:
11501150

11511151
```vue
11521152
<template>{{ msg }}</template>
@@ -1161,11 +1161,13 @@ export default {
11611161
</script>
11621162
```
11631163

1164-
可以看到,我们不需要在模板中使用 `{{ msg.value }}` 来获取属性值,而是直接使用 `{{ msg }}`这是怎么实现的呢?
1164+
可以看到,我们不需要在模板中使用 `{{ msg.value }}` 来获取属性值,而是直接使用了 `{{ msg }}`我们不禁好奇,这是怎么实现的?
11651165

11661166
---
11671167

1168-
我们知道,在 `setup()` 函数中会返回所有的响应式数据,那么是不是可以对返回值做一个代理,当访问 `ref` 数据时自动脱 ref 呢?
1168+
我们知道,在 `setup()` 函数中会统一返回所有的响应式数据,那么是不是可以对返回的数据做一个代理,当访问 `ref` 数据时自动脱 ref 呢?
1169+
1170+
> **自动脱 ref**: 比如,在模板中访问 `{{ msg }}` (ref),通过代理拦截,判断如果是一个 `ref`,那么就访问 `msg.value`
11691171
11701172
```js
11711173
<script>
@@ -1364,11 +1366,14 @@ const NodeTypes = {
13641366

13651367
---
13661368

1367-
## 模板解析器 parser
1369+
## 模板解析 parse
13681370

13691371
模板是如何被解析成 AST 的呢?
13701372

13711373
```js
1374+
/**
1375+
* @params {String} str 模板字符串
1376+
*/
13721377
function parse(str) {
13731378
/* ... */
13741379
}
@@ -1834,7 +1839,8 @@ function render(_ctx) {
18341839
我们看到,代码字符串中有 `h` 函数,`h` 函数实际上就是对 `createVNode` 的封装,它们都是用于创建 `VNode` 的。
18351840

18361841
```js
1837-
// 源码位置: packages/runtime-core/src/h.ts
1842+
// packages/runtime-core/src/h.ts
1843+
18381844
function h(tag, props, children) {
18391845
// 我们这里就简单的返回一个对象,实际源码中会复杂很多
18401846
return {
@@ -1848,6 +1854,8 @@ function h(tag, props, children) {
18481854
`_toDisplayString` 函数是 `toDisplayString` 的别名,它用于将插值表达式转换为字符串:
18491855

18501856
```js
1857+
// packages/shared/src/toDisplayString.ts
1858+
18511859
const toDisplayString = (val) => {
18521860
return String(val)
18531861
}
@@ -2168,6 +2176,24 @@ function compileToFunction(template) {
21682176

21692177
---
21702178

2179+
## 关于编译优化
2180+
2181+
我这里其实没做任何的优化,只是把主体逻辑走通了,让代码可以跑起来,而且还有很多功能都没去实现,比如指令的处理,组件的支持等等。
2182+
2183+
实际上在编译阶段,Vue3 内部是做了很多优化处理的,比如:
2184+
2185+
- 动态节点标记 patchFlag,为后续的 diff 做准备
2186+
- 静态提升
2187+
- 事件缓存
2188+
- ...
2189+
2190+
2191+
关于编译优化,可以看看 Vue3 提供的一个模板解析工具大致了解下。
2192+
2193+
[Vue3 Template Explorer](https://template-explorer.vuejs.org/)
2194+
2195+
---
2196+
21712197
## 挂载&更新
21722198

21732199
前面我们实现了 **响应式系统****编译**(丐中丐版),已经有能力将模板编译成渲染函数了,现在我们将它们整合起来,同时为了能将代码跑起来,我们还需要稍微简单实现下 **挂载和更新** (这里不涉及 patch)。
@@ -2438,24 +2464,6 @@ createApp({
24382464

24392465
</div>
24402466

2441-
---
2442-
2443-
## 关于编译优化
2444-
2445-
我这里其实没做任何的优化,只是把主体逻辑走通了,让代码可以跑起来,而且还有很多功能都没去实现,比如指令的处理,组件的支持等等。
2446-
2447-
实际上在编译阶段,Vue3 内部是做了很多优化处理的,比如:
2448-
2449-
- 动态节点标记 patchFlag,为后续的 diff 做准备
2450-
- 静态提升
2451-
- 事件缓存
2452-
- ...
2453-
2454-
2455-
关于编译优化,可以看看 Vue3 提供的一个模板解析工具大致了解下。
2456-
2457-
[Vue3 Template Explorer](https://template-explorer.vuejs.org/)
2458-
24592467
---
24602468
layout: image
24612469
image: /mikoto-misaka.jpg

0 commit comments

Comments
 (0)