JS模板编译的实现详情

 更新时间:2022年07月19日 16:54:46   作者:​ 阿海丶​  
这篇文章主要介绍了JS模板编译的实现详情,编译是一种格式变成另一种格式的过程。编译会导致好的结果,比如书写简单的代码,编译出来复杂的代码;或者提高代码的使用性能

前言

编译是一种格式变成另一种格式的过程。编译会导致好的结果,比如书写简单的代码,编译出来复杂的代码;或者提高代码的使用性能

这里只聊聊模板编译。

模板编译的简单实现

写一个最简单的模板

<p>Hello, {{name}}!</p>

这个模板用数据{name: "world"}渲染后的结果是:

<p>Hello, world!</p>

解决方法:最简单的方案,正则替换就行了

const compile = function(template, data) {
  return template.replace(/{{(.+?)}}/g, (match, key) => data[key])
}

const template = "<p>Hello, I'm {{name}}! {{age}} years old!</p>"
const data = {
  name: "hayes",
  age: 18
}
const result = compile(template, data)
console.log(result); // <p>Hello, I'm hayes! 18 years old!</p>

缺点很明显,除了正则替换字段,其他啥都干不了,

来看看简单的嵌套需求:

模板:

<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>

渲染数据;

const data = {
  user: {
    name: "hayes",
    age: 18
  }
}

现在再使用上面的方法,就失效了。还用正则的话,会很难做。因为需要做语法/词法分析,来看看大括号内写的是什么了。

模板编译

其实对于上述的模板,也可以使用如下方式来写:

const compile = function(data) {
  return `<p>Hello, I'm ${data.name}! ${data.age} years old!</p>`
}

好处:只需一次编译,之后再使用就只需要直接填充数据即可。而且也方便支持data.user.name这种形式。

工具:使用new Function生成函数

生成一个函数,传入x和 y,执行return x + y来获得求和的功能

const fn = new Function("x", "y", "return x + y");

打印fn可以看到输出的内容如下:

ƒ anonymous(x,y) {
return x + y
}

1、构建模板生成函数

传入模板字符串,通过new Function方式返回一个新函数。新函数接收一个obj对象

const compile = function(template) {
  // 模板字符串
  let result = "";
  // ...
  return new Function("obj", result);
}

2、正则替换

{{xxx}}找出来,替换为obj.xxx

const compile2 = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `obj.${key}`
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template2 = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render2 = compile2(template2)
console.log(render2);

此时,函数打印如下:

ƒ anonymous(obj
) {
return "<p>Hello, I'm obj.user.name! obj.user.age years old!</p>"
}

我们需要把字符串中的obj.user.nameobj.user.age变成动态的。

修改一下正则

const compile2 = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `" + obj.${key} + "`  // 前后添上加号
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template2 = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render2 = compile2(template2)
console.log(render2);

再来看看函数的打印:

ƒ anonymous(obj
) {
return "<p>Hello, I'm " + obj.user.name + "! " + obj.user.age + " years old!</p>"
}

最终代码:

const compile = function(template) {
  // 模板字符串
  let result = template.replace(/{{(.+?)}}/g, (match, key) => {
    return `" + obj.${key} + "`
  });
  result = `return "${result}"`;
  return new Function("obj", result);
}
const template = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render = compile(template)

const data = {
  user: {
    name: "hayes",
    age: 18
  }
}
const result = render(data)
console.log(result); // <p>Hello, I'm hayes! 18 years old!</p>

渲染结果:

"<p>Hello, I'm hayes! 18 years old!</p>"

到此这篇关于JS模板编译的实现详情的文章就介绍到这了,更多相关JS模板编译 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript函数库-集合框架

    javascript函数库-集合框架

    javascript函数库-集合框架...
    2007-04-04
  • js数组与字符串常用方法总结

    js数组与字符串常用方法总结

    本文主要总结了js数组与字符串的常用方法。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • JavaScript手写数组的常用函数总结

    JavaScript手写数组的常用函数总结

    这篇文章主要给大家介绍了关于JavaScript手写数组常用函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 微信小程序自定义导航栏效果

    微信小程序自定义导航栏效果

    这篇文章主要为大家详细介绍了微信小程序自定义导航栏效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • js 代码集(学习js的朋友可以看下)

    js 代码集(学习js的朋友可以看下)

    js 代码集 学习js的朋友可以看下,功能比较多,大家可以自己选择。
    2009-07-07
  • 详解uniapp分包的实现方式及优点

    详解uniapp分包的实现方式及优点

    当今移动应用开发领域,随着用户对于应用功能和体验的要求不断提高,应用程序的复杂度也在不断增加,在这种情况下,应用程序的体积也随之增大,为了解决这个问题,Uniapp提供了分包功能,本文将详细介绍Uniapp分包的功能和优势,包括如何通过配置文件实现分包
    2023-09-09
  • 一文详解HTML中script 标签的属性

    一文详解HTML中script 标签的属性

    在HTML中,<script>标签用于嵌入或引用JavaScript代码,在HTML中,<script>标签用于嵌入或引用JavaScript代码,本文将详细的而介绍这两个标签,感兴趣的同学可以参考一下
    2023-04-04
  • JavaScript折半查找(二分查找)算法原理与实现方法示例

    JavaScript折半查找(二分查找)算法原理与实现方法示例

    这篇文章主要介绍了JavaScript折半查找(二分查找)算法原理与实现方法,结合具体问题描述了折半查找算法的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2018-08-08
  • JavaScript显示当前文档最后修改日期的方法

    JavaScript显示当前文档最后修改日期的方法

    这篇文章主要介绍了JavaScript显示当前文档最后修改日期的方法,实例分析了javascript中document.lastModified的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • js中的document.querySelector()方法举例详解

    js中的document.querySelector()方法举例详解

    这篇文章主要给大家介绍了关于js中document.querySelector()方法的相关资料,document.querySelector是JavaScript中的一个内置方法,用于通过CSS选择器选择文档中的第一个匹配元素,需要的朋友可以参考下
    2024-01-01

最新评论