持续创作,加速成长!这是我参与「编程 · 10 月更文挑战」的第21天,点击查看活动详情
我们在文章 模版转成AST树的逻辑上的匹配过程介绍一个匹配的过程逻辑,这篇介绍一下细节,主要是怎么用用正则进行匹配,正则的表达式咱们主要是在vue2的源码的,需要自己复制一下,就不自己写了,咱们来看下位置吧 github.com/vuejs/vue/b… 我们用的就是这个位置的正则 看一下每个正则可以匹配什么,下面是我们这次用到的正则,
// 正则匹配标签
// 可以匹配id = “app” id = 'app' id = app
const attribute =
/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
// 匹配标签名 my-header 自定义标签
const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z]*`
// 匹配特殊的 my:header 这种标签
const qnameCapture = `((?:${ncname}\\:)?${ncname})`
//<匹配div
const startTagOpen = new RegExp(`^<${qnameCapture}`)
// > />
const startTagClose = /^\s*(\/?)>/
// 匹配</div>
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`)
我们拿到了这个正则,就可以对模版字符串进行处理了,方式在上一篇文章也说了,就是进行while循环,咱们来看看循环里的具体逻辑
function paresHtmlToAst(html) {
while(html){ // 使用了while循环
// 首先需要判断是不是开始标签
let textEnd = html.indexOf('<') // 尖括号找到了说明时第一项,没找到说明不是
if (textEnd==0) {// 找到了
// 交给开始函数去做
const startTagMatch = parseStartTag()
}
}
function parseStartTag() { // 这个函数树主要做开始标签处理的,
const start = html.match(startTagOpen) // 这里我们就用到了startTagOpen的这个正则,他是专门为找开始标签使用的
//咱们log就是下面截图,我们看到的具体信息
// 我们拿到信息之后首先要生成一个tagname 后面做AST树要用这个数据
if (start) {
const match = {
tagName: start[1],
attrs: [],
}
// 对html进行切割
advance(start[0].length)
}
}
// 截取字符串方法
function advance(n) {
html = html.substring(n)
}
}
被切割后的模板图片
第一步切割已经完成了 后面继续
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!