EJS模板的全局变量实现

简介: > 知识补充:什么是EJS? EJS 是一个用 JavaScript 语言生成 HTML 页面的模板库,所以对前端开发者非常友好,几乎没有额外的学习成本。常在 Node.js 服务端使用。# 问题背景目前我们的网盘系统使用了类似淘宝中途岛架构的方式,服务端用Node.js 来渲染HTML模板,其中服务端使用的模板引擎就是 EJS。由于不同页面需要引用的CDN资源不一样,所以编写成了不同
知识补充:什么是EJS? EJS 是一个用 JavaScript 语言生成 HTML 页面的模板库,所以对前端开发者非常友好,几乎没有额外的学习成本。常在 Node.js 服务端使用。

问题背景

目前我们的网盘系统使用了类似淘宝中途岛架构的方式,服务端用Node.js 来渲染HTML模板,其中服务端使用的模板引擎就是 EJS。

由于不同页面需要引用的CDN资源不一样,所以编写成了不同的渲染模板,比如登录页面。而模板中的一些变量的需要经常地改动,比如CDN资源的版本信息。由于模板之间都某些CDN资源是共享的,比如国际化的资源文件、第三方SDK,所以希望设置一个全局变量实现统一修改,而不是到每个模板配置项中进行复制粘贴。

我们进行模板编辑的运维平台,目前并没有提供跨模板共享变量的功能,但是为了方便渲染逻辑的复用,提供了模板引用的功能,也就是说一些公共模板可以被页面模板所引用。

解决思路

官方文档

EJS 功能比较简单,文档也非常简单(估计一千字左右),不到一页。
翻遍文档也没找到全局变量的使用说明

三方示例

既然官方找不到正解,看看“民间”有没有解决方案。

网上搜索发现,比较接近的一种实现方式是在 express.js 中保存全局变量,然后在渲染模板的时候传入。

基本上就是借助Node.js服务端来实现,这种方案需要对代码进行改动,不能通过配置实现,方式并不优雅。

深入底层

回到问题本身,目的在于复用一些配置,能够在版本更新的时候做到一处修改每个模板都生效,而不是不同模板重复修改(版本号)。

在浏览器和Node.js 环境中,我们可以通过 window 或 Global 默认全局变量来传递参数。但其实在 ESM 和 CommonJS 的模块机制中还有另一种实现方式,那就是用一个模块(或配置文件)专门来保存全局变量,然后其它模块按需引用。在EJS模板上实现会遇到一个问题:模板不支持导出变量,只支持变量引入。

有没有办法把模板的变量导出来了呢?

答案当然是有的,熟悉 JavaScript 语言的同学都知道,函数调用的入参如果为对象数据类型的时候使用的是浅拷贝,也就是说函数内部可以对入参进行修改,然后函数调用方就可以得到最新的值。只是为了避免产生副作用,这种修改入参的方式在开发的时候并不推荐,很少用到。

最后的实现方式如下:

// Variable 模板
<%
  // Config once, run anywhere!
  var font = config.font || "font_1664786_pvgug973rb8";
  config.fontURL = `//at.alicdn.com/t/${font}.js`;
  ......
%>
<% var config = {} %>
<%- include('Variable', {config}) %>
<script src="<%=config.fontURL%>"></script>

总结

遇到技术问题如果官方没有提供解决方案的话,如果在官方文档上找不到实现方式的话,可以在两个思路方向上进行突破:

  • 横向借助第三方模。
  • 纵向深入底层原理。
相关文章
|
关系型数据库 MySQL Linux
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
【Linux】jdk & Tomcat & MySql的安装及Linux后端接口部署
317 0
|
机器学习/深度学习 自然语言处理 语音技术
字正腔圆,万国同音,coqui-ai TTS跨语种语音克隆,钢铁侠讲16国语言(Python3.10)
按照固有的思维方式,如果想要语音克隆首先得有克隆对象具体的语言语音样本,换句话说,克隆对象必须说过某一种语言的话才行,但现在,coqui-ai TTS V2.0版本做到了,真正的跨语种无需训练的语音克隆技术。 coqui-ai TTS实现跨语种、无需训练克隆语音的方法是基于Tacotron模型,该模型使用了一种音素输入表示来鼓励在不同语种之间共享模型容量。此外,还引入了对抗损失项,以鼓励模型将说话者身份与语音内容进行解耦。这使得模型能够在不同语种之间进行语音合成,而无需在任何双语或平行示例上进行训练。
字正腔圆,万国同音,coqui-ai TTS跨语种语音克隆,钢铁侠讲16国语言(Python3.10)
|
JavaScript 前端开发 索引
JS遍历数组里数组下的对象,根据数组中对象的某些值,组合成新的数组对象
这篇文章介绍了如何在JavaScript中遍历数组里数组下的对象,并根据对象的某些属性值组合成一个新的数组对象。主要内容包括使用ES6的`for...of`循环来遍历数组对象,然后根据需要提取对象中的属性值,并将它们放入新的对象中,最终形成一个新的对象数组以供使用。
|
缓存 IDE Java
maven install报错原因揭秘:‘parent.relativePath‘指向错误的本地POM文件
在使用Maven构建项目时,遇到&#39;parent.relativePath&#39;错误通常是由于父项目POM路径设置错误、版本不一致或内容不匹配导致的。解决方法包括:校正父项目POM的相对路径、确保版本一致、保持POM文件内容同步,并排查其他潜在问题,如子模块命名冲突和Maven缓存问题。通过这些步骤可解决该错误,避免项目构建失败。
maven install报错原因揭秘:‘parent.relativePath‘指向错误的本地POM文件
|
安全 数据可视化 编译器
AST 的应用
【10月更文挑战第23天】抽象语法树在软件开发的各个领域都有着广泛而重要的应用。它为代码的分析、优化、生成、转换等提供了基础和支持,是提升代码质量和开发效率的重要工具。随着技术的不断发展,AST 的应用还将不断扩展和深化,为软件开发带来更多的创新和便利。
|
JSON 前端开发 JavaScript
总结 Vue3 的一些知识点:Vue3 Ajax(axios)
总结 Vue3 的一些知识点:Vue3 Ajax(axios)
|
应用服务中间件 程序员
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
1869 0
IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
|
安全 Linux 网络安全
linux服务器木马排查
【4月更文挑战第18天】该文提供了服务木马排查的六个步骤:1) 检查系统日志,观察异常IP并用SSH防护,限制22端口和root用户;2) 查看系统用户,找寻异常或新创建的UID/GID为0的用户;3) 检查UID为0的进程和隐藏进程,防止恶意活动;4) 搜索异常大文件和具有特殊权限的文件;5) 检验系统计划任务的完整性;6) 使用rkhunter和chkrootkit检测rootkit。关键在于识别入侵点并采取相应措施。
431 0
|
开发工具 git
git revert 多条已提交的记录
我需要撤销最后的四个提交 如果用git revert 一个一个revert 挺费劲,可以用git revert OLDER_COMMIT^..NEWER_COMMIT 这种格式,对应我的工程就是 $ git revert 54b23c2251acde.
6093 0
|
存储 编解码 算法
深入浅出:FFmpeg 音频解码与处理AVFrame全解析(一)
深入浅出:FFmpeg 音频解码与处理AVFrame全解析
2169 0