Bladeren bron

shouldIgnoreFirstNewline 讲解

HcySunYang 7 jaren geleden
bovenliggende
commit
020aeab1c4
1 gewijzigde bestanden met toevoegingen van 25 en 0 verwijderingen
  1. 25 0
      note/9Vue中的html-parser.md

+ 25 - 0
note/9Vue中的html-parser.md

@@ -249,6 +249,31 @@ const encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10|#9);/g
 
 所以这里的常量 `decodingMap` 以及两个正则 `encodedAttr` 和 `encodedAttrWithNewLines` 的作用就是用来完成对 `html` 实体进行解码的。
 
+再往下是这样一段代码:
+
+```js
+// #5992
+const isIgnoreNewlineTag = makeMap('pre,textarea', true)
+const shouldIgnoreFirstNewline = (tag, html) => tag && isIgnoreNewlineTag(tag) && html[0] === '\n'
+```
+
+定义了两个常量,其中 `isIgnoreNewlineTag` 是一个通过 `makeMap` 函数生成的函数,用来检测给定的标签是否是 `<pre>` 标签或者 `<textarea>` 标签。这个函数被用在了 `shouldIgnoreFirstNewline` 函数里,`shouldIgnoreFirstNewline` 函数的作用是用来检测是否应该忽略元素内容的第一个换行符。什么意思呢?大家注意这两段代码上方的注释:`// #5992`,感兴趣的同学可以去 `vue` 的 `issue` 中搜一下,大家就会发现,这两句代码的作用是用来解决一个问题,该问题是由于历史原因造成的,即一些元素会受到额外的限制,比如 `<pre>` 标签和 `<textarea>` 会忽略其内容的第一个换行符,所以下面这段代码是等价的:
+
+```html
+<pre>内容</pre>
+```
+
+等价于:
+
+```html
+<pre>
+内容</pre>
+```
+
+以上是浏览器的行为,所以 `Vue` 的编译器也要实现这个行为,否则就会出现 `issue #5992` 或者其他不可预期的问题。
+
+
+