我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS模板编译的实现详情

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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模板编译 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS模板编译的实现详情

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文详解如何实现PyTorch模型编译

这篇文章主要为大家介绍了如何实现PyTorch 模型编译详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

C++ 函数模板详解:揭秘编译期可变性的奥秘

函数模板提供了编译器生成的编译期可变函数,提高代码效率和通用性。语法: template t sum(t a, t b)编译期可变性: 类型参数在调用时生成新函数版本。实际案例:通用排序算法类型安全运算符重载元编程优势:代码重用通用性编译时
C++ 函数模板详解:揭秘编译期可变性的奥秘
2024-04-26

模板化编程的具体实现方式?

模板化编程允许根据类型生成代码,提高可重用性和性能。它包括:在 c++++ 中使用模板指定类型参数,并通过实例化来生成代码。利用元编程在编译时操作类型信息,实现代码生成和静态分析等功能。实战应用包括通用数据结构、算法实现和代码生成工具。模板
模板化编程的具体实现方式?
2024-05-08

android编程实现的自定义注释模板实例

本文实例讲述了android编程实现的自定义注释模板。分享给大家供大家参考,具体如下: 作为一名程序员 不仅要有一个写代码的能力,养成一个良好的编写习惯也是很重要的。今天给大家详细介绍一下如何创建注释模板,给每个类和方法都自己手动去注释信息
2022-06-06

如何使用js模拟实现京东详情页图片放大效果

这篇文章给大家分享的是有关如何使用js模拟实现京东详情页图片放大效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果:html:
2023-06-25

C++ 函数模板详解:助力 OOP 设计模式的实现

函数模板在 c++++ 中实现了 oop 设计模式,其好处包括:代码重用:通用代码可用于多种数据类型,减少重复代码。类型安全性:编译器确保类型有效,提高可靠性。可扩展性:通过创建新实例轻松添加新类型。在 C++ 中使用函数模板实现 OOP
C++ 函数模板详解:助力 OOP 设计模式的实现
2024-04-27

单独编译Android 源代码中的模块实现方法

第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了。以后如果我们修改了Android源代码中的某个模块或
2022-06-06

C++ 函数模板详解:直观理解 STL 的实现

函数模板是一种 c++++ 机制,允许编写通用代码以适用于不同类型数据。它在 stl 中广泛使用,使容器和算法灵活、可重用。函数模板的语法为:template returntype functionname(parameterlist),其
C++ 函数模板详解:直观理解 STL 的实现
2024-04-28

纯 JS 实现的轻量化图片编辑器实例详解

这篇文章主要为大家介绍了纯JS实现的轻量化图片编辑器实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

C++ 成员函数详解:对象方法的底层实现与编译过程

c++++ 中的成员函数是附加在类中的对象方法,用于操作对象中的数据成员。编译过程包括:实例化:为每个成员函数创建函数指针,存储在对象中;调用机制:编译器自动插入类似于 result = ((_this)->*memberfunction(
C++ 成员函数详解:对象方法的底层实现与编译过程
2024-04-29

Android如何模仿实现微博详情页滑动固定顶部栏的效果

这篇文章主要介绍了Android如何模仿实现微博详情页滑动固定顶部栏的效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先来看下我们今天要实现的效果:滑动固定顶部栏效果图这段
2023-05-30

编程热搜

目录