iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS模板编译的实现详情
  • 512
分享到

JS模板编译的实现详情

2024-04-02 19:04:59 512人浏览 八月长安
摘要

目录前言模板编译的简单实现模板编译1、构建模板生成函数2、正则替换前言 编译是一种格式变成另一种格式的过程。编译会导致好的结果,比如书写简单的代码,编译出来复杂的代码;或者提高代码的

前言

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

这里只聊聊模板编译。

模板编译的简单实现

写一个最简单的模板

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

--结束END--

本文标题: JS模板编译的实现详情

本文链接: https://www.lsjlt.com/news/164673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JS模板编译的实现详情
    目录前言模板编译的简单实现模板编译1、构建模板生成函数2、正则替换前言 编译是一种格式变成另一种格式的过程。编译会导致好的结果,比如书写简单的代码,编译出来复杂的代码;或者提高代码的...
    99+
    2024-04-02
  • vue模版编译详情
    目录1、parse 解析器1.1 截取的规则1.2  截取过程部分1.3  解析器总结2、optimize 优化器2.1 静态节点2.2 静态根节点2.3 优化器...
    99+
    2024-04-02
  • vue模板编译的原理是什么
    这篇文章主要介绍了vue模板编译的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue模板编译的原理是什么文章都会有所收获,下面我们一起来看看吧。vue提供了模板语法,允许我们声明式地描述状态和DOM...
    99+
    2023-07-05
  • 一文详解如何实现PyTorch模型编译
    目录准备加载预训练的 PyTorch 模型​加载测试图像​将计算图导入 Relay​Relay 构建​在 TVM 上执行可移植计算图​查找分类集名称​准备 本篇文章译自英文文档 Co...
    99+
    2023-05-17
    PyTorch 模型编译 PyTorch 模型
  • js 实现拖拽排序详情
    目录1、前言2、实现3、为何不使用HTML拖放API实现?4、总结1、前言 拖拽排序对于小伙伴们来说应该不陌生,平时工作的时候,可能会选择使用类似Sortable.js这样的开源库来...
    99+
    2024-04-02
  • Vue3模板编译优化的示例分析
    小编给大家分享一下Vue3模板编译优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!编译入口了解过 Vue3 的同学肯...
    99+
    2024-04-02
  • 模板引擎artTemplate及模板预编译器的知识点有哪些
    这篇文章主要讲解了“模板引擎artTemplate及模板预编译器的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“模板引擎artTemplate及...
    99+
    2024-04-02
  • 怎么用JS实现代码编译器
    本篇内容介绍了“怎么用JS实现代码编译器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言对于前端同学...
    99+
    2024-04-02
  • js模拟实现京东详情页图片放大效果
    本文实例为大家分享了js实现京东详情页图片放大的具体代码,供大家参考,具体内容如下 效果: html: <div class="preview_img"> <...
    99+
    2024-04-02
  • C++ 函数模板详解:揭秘编译期可变性的奥秘
    函数模板提供了编译器生成的编译期可变函数,提高代码效率和通用性。语法: template t sum(t a, t b)编译期可变性: 类型参数在调用时生成新函数版本。实际案例:通用排序...
    99+
    2024-04-26
    c++ 函数模板
  • c++模拟实现string类详情
    目录一、string类简介二、模拟实现成员变量成员函数迭代器重载运算符[ ]三、几种常见函数reserve()resize()push_back()append()重载+=inser...
    99+
    2024-04-02
  • js 实现文件上传样式详情
    目录1、概述2、创建对象的参数3、监听例子4、使用方法5、源代码1、概述 这个js包括按钮样式,列表样式、带有删除、添加、放大(使用的是自带的放大功能,提供有API来放入你的弹窗...
    99+
    2024-04-02
  • 基于JS实现一个小型编译器
    目录前言ParseTransformTraversal(遍历)Visitors(访问)Code generate代码实现词法分析器(tokenizer)语法分析器(parser)遍历...
    99+
    2024-04-02
  • vue2.6.10+vite2开启template模板动态编译的过程
    在从vue-cli迁移到vite2的时候,之前在代码中使用的模板编译遇到了问题: 我在项目中会根据后台返回的内容动态渲染,如果返回内容中有<el-image>等标签,v-...
    99+
    2023-02-03
    vue开启template模板动态编译 vue template模板编译 vue vite动态编译
  • vue中template模板编译的过程全面剖析
    目录简述过程vue的渲染过程parseparse过程总结generate生成render函数简述过程 vue template模板编译的过程经过parse()生成ast(抽象语法树)...
    99+
    2024-04-02
  • 模板化编程的具体实现方式?
    模板化编程允许根据类型生成代码,提高可重用性和性能。它包括:在 c++++ 中使用模板指定类型参数,并通过实例化来生成代码。利用元编程在编译时操作类型信息,实现代码生成和静态分析等功能。...
    99+
    2024-05-08
    模板化编程 具体实现方式 c++
  • Go语言编译器实现原理与编译过程详解
    标题:Go语言编译器实现原理与编译过程详解 在计算机编程领域中,编译器是一种非常重要的工具,它负责将我们编写的高级语言代码转换为目标机器能够执行的机器码。Go语言作为一种快速、高效的编...
    99+
    2024-03-11
    编译器 go语言 实现
  • Python实现访问者模式详情
    假设要实现一个存放多种类型数据结构的对象,比如一个存放算术操作数和操作符的树结点,需要存放包含一元操作符、二元操作符和数字类型的结点 class Node:     pass c...
    99+
    2024-04-02
  • Vue编译优化实现流程详解
    目录动态节点收集与补丁标志1.传统diff算法的问题2.Block和PatchFlags3.收集动态节点4.渲染器运行时支持5.Block树静态提升预字符化缓存内联事件处理函数v-o...
    99+
    2023-01-28
    Vue编译优化 Vue代码优化
  • 基于JS怎么实现一个小型编译器
    这篇文章主要讲解了“基于JS怎么实现一个小型编译器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于JS怎么实现一个小型编译器”吧!前言the-super-tiny-compiler&nbs...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作