当前位置:   article > 正文

Vue源码mustache模板引擎-手写Scanner类_mustache scanner

mustache scanner

需要了解Vue源码,先了解mustache模板引擎

什么是模板引擎呢

模板引擎是将数据变为视图最优雅的解决方案,用过Vue的都知道v-for,v-for实际上就是一种模板引擎

发展

纯dom法:非常笨拙,没有实战价值,现在基本不用

数组join法:曾经前端必备

ES6反引号法ES6新增的`${a}`语法糖

模板引擎:将数据变为视图最优雅的解决方案

手写Scanner类

先创建文件夹,配置mustache环境,安装webpack及相关依赖和配置webpack,这部分不清楚的可以上网查看一下相关文章

在mustache源码中一个Scanner类,有一个scan方法,作用是跳过指定内容,有一个scanUtil方法,作用是让指针进行扫描直到遇见直到内容结束,返回结束之前的内容

  1. //扫描类
  2. export default class Scanner {
  3. constructor(templateStr) {
  4. //将模板字符串写到实例身上
  5. this.templateStr = templateStr
  6. // 指针
  7. this.pos = 0
  8. //尾巴,一开始就是字符串原文
  9. this.tail = templateStr
  10. }
  11. //功能弱,就是走过指定内容,没有返回值
  12. scan(tag) {
  13. if (this.tail.indexOf(tag) === 0) {
  14. //tag有多长,就让指针后移多少位
  15. this.pos += tag.length
  16. // 改变尾巴从pos位置开始
  17. this.tail = this.templateStr.substring(this.pos)
  18. }
  19. }
  20. //让指针进行扫描,直到遇见指定内容结束,返回结束之前的文字
  21. scanUtil(stopTag) {
  22. //记录一下pos的值
  23. const pos_back = this.pos
  24. //当尾巴开头不是stopUtil的时候,就继续
  25. //this.eos()找到最后找不到就停止
  26. while (this.tail.indexOf(stopTag) !== 0 && !this.eos()) {
  27. this.pos++
  28. //改变尾巴从当前pos开始
  29. this.tail = this.templateStr.substr(this.pos)
  30. }
  31. return this.templateStr.substring(pos_back, this.pos)
  32. };
  33. //指针是否到头,返回布尔值 end of string
  34. eos() {
  35. return this.pos >= this.templateStr.length;
  36. }
  37. };

测试

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <!-- 虚拟文件 webpack把src中的js文件打包到bundle.js中-->
  11. <script src="/xuni/bundle.js"></script>
  12. <script>
  13. let templateStr = '我有一个好{{mood}},真开心啊{{zn}},再见'
  14. let data ={}
  15. TemplateEnging.render(templateStr,data)
  16. </script>
  17. </body>
  18. </html>

index.js

  1. import Scanner from './Scanner.js';
  2. // 全局提供templateenging对象
  3. window.TemplateEnging={
  4. // 渲染方法
  5. render (templateStr,data){
  6. // 实例化一个扫描器。构造时提供一个参数,这个参数是字符串模板
  7. // 也就是说这个扫描器就是针对这个模板字符串工作的
  8. var scanner =new Scanner(templateStr)
  9. console.log(templateStr)
  10. //当scanner没有到头
  11. let word;
  12. while(!scanner.eos()){
  13. word = scanner.scanUtil('{{')
  14. console.log(word)
  15. scanner.scan("{{");
  16. word = scanner.scanUtil('}}')
  17. console.log(word);
  18. scanner.scan('}}')
  19. }
  20. }
  21. }

结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/997725
推荐阅读
相关标签
  

闽ICP备14008679号