当前位置: 首页 > article >正文

使用vite-plugin-html在 HTML 文件中动态注入数据,如元数据、环境变量、标题

vite-plugin-html 是一个用于 Vite 构建工具的插件,它可以帮助你在构建过程中动态注入一些 HTML 内容,比如标题、元数据、环境变量等。通过使用这个插件,你可以根据项目的配置和环境变量自动生成带有动态内容的 HTML 文件,适用于 SEO、社交分享和其他需要动态设置 HTML 元素的场景。

元数据是什么

元数据(Metadata)是描述数据的数据,通常用于提供关于其他数据的详细信息。它并不是实际的内容本身,而是帮助解释、管理和分类这些内容的信息。在 Web 开发中,元数据通常指的是在 HTML 文档的 部分使用的标签,来描述网页内容的性质、提供网页的附加信息,或者优化搜索引擎等。

常见的元数据标签

  1. 标签:这是最常见的元数据标签,用于提供关于网页的描述、关键词、作者等信息。

示例:

<meta name="description" content="这是一个示例网站,用于展示元数据的使用。">
<meta name="author" content="John Doe">
<meta name="keywords" content="HTML, 元数据, 网站">
  1. 标签:用来设置网页的标题,这个标题会在浏览器的标签栏显示。

示例:

<title>我的网站</title>
  1. 标签:常用于引入外部资源,如样式表(CSS)、图标等。也可以提供网页与其他文档或网站的关系信息。

示例:

<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
  1. 标签与 Open Graph(OG)协议:用于社交媒体分享时提供更丰富的内容(如 Facebook、Twitter)。

示例:

<meta property="og:title" content="分享标题">
<meta property="og:description" content="分享描述内容">
<meta property="og:image" content="分享图片链接">
  1. 标签与 Twitter 卡片(Twitter Cards):用于在 Twitter 上分享时展示更多的格式化内容。

示例:

<meta name="twitter:title" content="Twitter 标题">
<meta name="twitter:description" content="Twitter 描述内容">
<meta name="twitter:image" content="Twitter 图片链接">

元数据的作用

  • 搜索引擎优化(SEO):通过设置正确的 标签,可以帮助搜索引擎更好地理解网页内容,提高网页的可见性。
  • 社交媒体分享:使用 Open Graph 和 Twitter Card 等协议,能让网页在社交媒体上分享时呈现更好的视觉效果和丰富的信息。
  • 浏览器和设备兼容性:元数据可以设置网页如何在不同设备上显示(例如,设置视口宽度)。
  • 提升用户体验:元数据可以让页面在用户访问时提供更多的描述信息,比如网页的语言、作者等。

为什么需要 vite-plugin-html?

在使用 Vite 进行项目开发时,很多时候需要根据不同的环境(如开发环境和生产环境)动态调整 HTML 文件中的内容。例如:

  • 根据环境变量设置页面标题、描述或其他 meta 信息;
  • 自动注入一些全局的 JavaScript 变量;
  • 使用外部脚本或样式文件链接;
  • 动态加载一些根据构建环境调整的内容。

1. 安装 vite-plugin-html

首先,你需要安装 vite-plugin-html 插件:

npm install vite-plugin-html --save-dev

或者使用 yarn:

yarn add vite-plugin-html --dev

2. 使用 vite-plugin-html

在 vite.config.js 或 vite.config.ts 配置文件中,你可以按如下方式使用插件:

import { defineConfig } from 'vite';
import createHtmlPlugin from 'vite-plugin-html';export default defineConfig({plugins: [createHtmlPlugin({inject: {// 动态注入的内容data: {title: 'My Awesome Project',  // 设置页面标题description: 'This is an awesome project built with Vite.',  // 设置页面描述customVar: process.env.NODE_ENV === 'production' ? 'prod' : 'dev',  // 基于环境设置的自定义变量},},}),],
});

3. 插件功能和配置

  • **inject:**用于注入动态内容到 HTML 文件中。你可以将动态数据(如环境变量、标题、描述等)通过 data 对象注入。

  • title: 设置 HTML 页面 标签的内容。

  • description: 可以设置页面的 标签内容。

  • customVar: 你还可以注入任意的变量,甚至是来自环境变量的数据,进行更复杂的动态注入。

**动态注入内容:**你可以使用 env 变量或者其他配置数据来动态修改 HTML 中的内容。例如,可以通过 process.env 来获取当前的构建环境,或者根据不同的需求设置不同的元数据。

  1. 高级用法
    使用模板
    你还可以将 HTML 文件模板作为输入,将内容插入到指定的位置。比如,下面的配置演示了如何使用模板文件:
import { defineConfig } from 'vite';
import createHtmlPlugin from 'vite-plugin-html';export default defineConfig({plugins: [createHtmlPlugin({inject: {data: {title: 'Dynamic Title',description: 'Dynamic description from environment variables',},},minify: true, // 可以启用 HTML 最小化injectData: {customVar: process.env.NODE_ENV === 'production' ? 'production' : 'development',},}),],
});

自定义模板
如果你需要自定义 HTML 模板,可以使用一个指定的模板文件:

import { defineConfig } from 'vite';
import createHtmlPlugin from 'vite-plugin-html';export default defineConfig({plugins: [createHtmlPlugin({inject: {data: {title: 'My Custom Template',description: 'Description of my custom template',},},template: 'src/index.template.html', // 指定自定义模板路径}),],
});

4 示例:基于环境变量注入

你可以使用环境变量来控制 HTML 中的内容,比如:

 plugins: [createHtmlPlugin({inject: {data: {title: env.DOMAIN_NAME,  // 基于环境的动态页面标题imageMeta: `https://www.${env.DOMAIN_NAME}.com/img/${env.DOMAIN_NAME}/img/ic_launcher.webp`,  // 动态图片 URLlocaleMeta: env.CURRENT_LANGUAGE,  // 当前网站的语言titleMeta: env.DOMAIN_NAME + ' ' + ruleMap[env.RULE_TYPE].meta.title,  // 自定义标题,基于规则descriptionMeta: ruleMap[env.RULE_TYPE].meta.description,  // 来自 ruleMap 的描述},},}),],<title><%- title %></title><meta property="og:type" content="website"><meta property="og:image" content="<%- imageMeta %>"><meta property="og:locale" content="<%- localeMeta %>"><meta property="og:title" content="<%- titleMeta %>"><meta property="og:description" content="<%- descriptionMeta %>">

在这里插入图片描述

5 总结

vite-plugin-html 是一个非常有用的插件,能够让你在 Vite 构建时动态注入 HTML 内容,适用于 SEO 优化、社交分享和根据不同环境(如开发、生产环境)调整页面内容等场景。通过这种方式,你可以确保页面在不同环境下有正确的元数据,提升网站的可见性和用户体验。

相关文章:

使用vite-plugin-html在 HTML 文件中动态注入数据,如元数据、环境变量、标题

vite-plugin-html 是一个用于 Vite 构建工具的插件&#xff0c;它可以帮助你在构建过程中动态注入一些 HTML 内容&#xff0c;比如标题、元数据、环境变量等。通过使用这个插件&#xff0c;你可以根据项目的配置和环境变量自动生成带有动态内容的 HTML 文件&#xff0c;适用于 …...

Kinova机械臂在Atlas手术导航系统中的核心作用

Kinova机械臂凭借其高精度运动控制和智能交互功能&#xff0c;成为Atlas手术导航系统的重要组成部分。该系统通过实时跟踪患者位置和精确规划手术路径&#xff0c;提高了医疗过程的精准性与效率。灵活的设计使外科医生能够更轻松地操作复杂的手术工具&#xff0c;从而提升患者安…...

C++——智能指针 auto_ptr

一、RAII思想的引入 #include <iostream> using namespace std;#if 0 // C中动态申请的资源需要用户自己手动释放 // 如果操作不当&#xff0c;容易造成内存泄漏 // 能否做到让资源自动被释放&#xff1a;RAII // RAII : 将资源交给对象管理&#xff0c;对象被销毁时自动…...

.Net Framework 4/C# System.IO 命名空间(文件的输入输出)

一、Path 类 Path 类是一个静态类,只能通过类名访问它的静态成员。 获得文件的名字,可以用 GetFileName,返回的是具有扩展名的指定路径字符串的文件名,也可以用 GetFileNameWithoutExtension,返回的是不具有扩展名的指定路径字符串的文件名。 获得文件夹的名字,可以用 G…...

图像分类进阶:从基础到专业 (superior哥AI系列第10期)

图像分类进阶&#xff1a;从基础到专业 &#x1f680; 前言 &#x1f44b; 哈喽&#xff0c;各位深度学习的探索者们&#xff01;我是你们的老朋友superior哥 &#x1f60e; 经过前面九篇文章的学习&#xff0c;相信大家对深度学习的基础概念、神经网络架构、以及训练部署都…...

性能优化之SSR、SSG

一、SSR和SSG介绍 SSR&#xff08;Server-Side Rendering&#xff0c;服务端渲染&#xff09;和 SSG&#xff08;Static Site Generation&#xff0c;静态站点生成&#xff09;是现代前端框架&#xff08;如 Next.js、Nuxt.js、Gatsby&#xff09;的核心渲染策略&#xff0c;用…...

【C语言】字符与字符串

在 C 语言中&#xff0c;字符&#xff08;Character&#xff09; 和 字符串&#xff08;String&#xff09; 是两个不同但相关的概念。下面详细介绍它们的定义、存储方式和使用方法&#xff1a; 一、字符&#xff08;Character&#xff09; 1. 定义与存储 基本类型&#xff…...

经典算法:回文链表

题目&#xff1a;234. 回文链表 给你一个单链表的头节点 head&#xff0c;请你判断该链表是否为 回文链表。如果是&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#x…...

uboot移植之GPIO上电初始状态的调整

开发板在上电之后&#xff0c;GPIO都有一个默认初始状态&#xff0c;这个状态可能是高电平也可能是低电平。而我们的应用程序在正式接管控制这些GPIO&#xff0c;是在内核起来并成功加载根文件系统之后。所以在内核启动的这段时间内&#xff0c;这些GPIO保持在一种不受控的状态…...

PasteForm(ABP)框架之实现更加灵活的类似多租户的归属过滤功能,比如只能查看自己的相关数据

需求说明 在开发中,我们常会遇到一个问题,就是归属查询问题,比如只能查看我自己的,往往这个时候还附带了一个规则,比如有人是在这个规则之外的! 1.只能查看创建者自己创建的资料 2.只能查看我店铺的相关内容,不能查看别人店铺的 3.只能查看我部门的相关信息等 可能你会…...

本地id_rsa.pub输入到服务器~/.ssh/authorized_keys后,依然需要输入密码的解决办法

首先检查服务器&#xff1a; sudo vim /etc/ssh/sshd_config 然后把这两个修改为&#xff1a; 如果依然需要输入密码&#xff0c;在本地终端&#xff1a; ssh -v userserver 查看认证过程&#xff0c;例如我这里提示说明客户端已成功尝试使用密钥认证&#xff1a; 进一步…...

【设计模式-3.7】结构型——组合模式

说明&#xff1a;本文介绍结构型设计模式之一的组合模式 定义 组合模式&#xff08;Composite Pattern&#xff09;又叫作整体-部分&#xff08;Part-Whole&#xff09;模式&#xff0c;它的宗旨是通过将单个对象&#xff08;叶子节点&#xff09;和组合对象&#xff08;树枝…...

Unity Mac 笔记本操作入门

在 macOS 笔记本电脑上使用 Unity Editor 的场景视图 (Scene View) 旋转视角&#xff0c;主要依赖于触摸板手势和键盘修饰键的组合。由于没有物理中键&#xff0c;操作方式会与 Windows 鼠标略有不同。 以下是具体的旋转视角操作&#xff1a; 1. 基本旋转视角 (Orbit) 这是最…...

实时数据仓库是什么?数据仓库设计怎么做?

目录 一、实时数据仓库是什么 &#xff08;一&#xff09;实时数据仓库的定义 &#xff08;二&#xff09;实时数据仓库的特点 二、实时数据仓库的应用场景 &#xff08;一&#xff09;金融行业 &#xff08;二&#xff09;电商行业 &#xff08;三&#xff09;物联网行…...

Linux(12)——基础IO(下)

目录 六、重定向 &#x1f4c4;输出重定向 &#x1f4c4;输入重定向 &#x1f4c4;追加重定向 &#x1f4c4;dup2 七、理解一切皆文件 八、缓冲区 &#x1f9e0;什么是缓冲区 &#x1f9e0;为什么要引入缓冲区 &#x1f4c4;缓冲区类型 九、FILE 六、重定向 我们这…...

WPF可拖拽ListView

1.控件描述 WPF实现一个ListView控件Item子项可删除也可拖拽排序&#xff0c;效果如下图所示 2.实现代码 配合 WrapPanel 实现水平自动换行&#xff0c;并开启拖拽 <ListViewx:Name"listView"Grid.Row"1"Width"300"AllowDrop"True&…...

rocketmq索引

索引的理解 索引是什么, 索引实质是 相同数据的另一种存储结构 我们都知道读和写天然是存在矛盾的, 我们希望写的快,当然是顺序写的性能最高, 顺序写造成数据杂乱无章,没法按照一定的规律去找数。 如果想要找数的效率高, 必须要有结构组织的存放数据, 这样方便按规律找…...

[蓝桥杯]倍数问题

倍数问题 题目描述 众所周知&#xff0c;小葱同学擅长计算&#xff0c;尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况&#xff0c;当有很多个数之后就会比较苦恼。现在小葱给了你 nn 个数&#xff0c;希望你从这 nn 个数中找到三个数&#xff0c;使得…...

定时任务的 cron 表达式

定时任务的 cron 表达式 一、什么时 cron 表达式 Cron表达式是一种广泛应用于Linux系统的时间表示格式&#xff0c;常用于定时任务的调度。Cron表达式可以通过指定不同的时间参数&#xff0c;描述一个在 未来某个时间点执行的任务。 二、Cron表达式语法 秒 分 时 日 月 周几…...

【MySQL】 约束

一、约束的定义 MySQL 约束是用于限制表中数据的规则&#xff0c;确保数据的 准确性 和 一致性 。约束可以在创建表时定义&#xff0c;也可以在表创建后通过修改表结构添加。 二、常见的约束类型 2.1 NOT NULL 非空约束 加了非空约束的列不能为 NULL 值&#xff0c;如果可以…...

MySQL 的 redo log 和 binlog 区别?

MySQL 的 redo log 和 binlog 区别? 1. 核心概念对比 1.1 redo log(重做日志) go专栏:https://duoke360.com/tutorial/path/golang 定位:InnoDB引擎层的物理日志作用:实现事务的持久性(ACID中的Durability)记录内容:物理页级别的修改(如"在page 5的offset 10…...

前端vue打开多个窗口,关闭窗口后才继续执行后续逻辑

1.打开第一个弹窗 弹窗的按钮代码 2.点击窗口1中按钮&#xff0c;打开新的窗口 // 请领单按钮点击 async cb_6_delClick() {let ls_yfbm this.st_3Value.BMBMlet pstring {}pstring.a ls_yfbmpstring.b this.queryFormDialog.outDepotDeptCodeawait this.openwithparm_w_md…...

「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化

什么是MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropic公司于2024年11月推出的开放标准协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具及系统提供统一的交互接口&#xff0c;被…...

如何避免在前端项目中出现重复的第三方依赖包?

在现代前端开发中&#xff0c;**重复的第三方依赖包&#xff08;Duplicate Dependencies&#xff09;**是导致项目体积膨胀、加载速度变慢、构建时间延长的常见问题。尤其在使用模块打包工具&#xff08;如 Webpack、Vite、Rollup&#xff09;时&#xff0c;若项目或其依赖的库…...

Java开发中复用公共SQL的方法

在一次Java后端开发的面试中&#xff0c;面试官问了我一个问题&#xff1a;“你在写代码时会复用公共SQL吗&#xff1f;如果会的话&#xff0c;能详细介绍一下你是如何实现的吗&#xff1f;”这个问题让我眼前一亮&#xff0c;因为在实际项目中&#xff0c;SQL复用确实是一个非…...

【西门子杯工业嵌入式-2-点亮一颗LED】

西门子杯工业嵌入式-2-点亮一颗LED 一、课程回顾与目标1.上节课内容回顾2.本节课目标 二、硬件连接与原理1. 硬件连接方式2. 连接实例 三、GPIO原理知识1. GPIO结构2. 推挽输出模式原理 四、软件实现步骤1. 项目结构设置2. 函数定义3. led.c 文件编写初始化函数 led_init交替闪…...

代码随想录算法训练营第60期第五十五天打卡

大家好&#xff0c;我们今天继续我们图论的部分&#xff0c;其实我们昨天是主要讲解了深搜与广搜的理论基础&#xff0c;我们大体上了解了两种算法的差异与适用情景&#xff0c;今天我们就继续我们的图论的章节&#xff0c;以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…...

重磅更新! 基于Gemini 2.5 Pro打造的AI智能体PlantUML-X上线!

目录 图表绘制AI智能体PlantUML-X上线通过简单的提示词创建各种UML图&#xff1a;轻松搞定其它类型的技术图表&#xff1a; AI智能体PlantUML-X功能实测画一个在Java中的一个简单的用户登录功能的时序图效果展示&#xff1a;根据详细内容生成系统架构图效果展示&#xff1a;效果…...

[5-02-04].第01节:Jmeter环境搭建:

JMeter笔记大纲 Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量 一、JMeter概述&#xff1a; 1.1.JMeter是什么&#xff1a; JMeter是Appache组织使用java开发的一款测试工具 可以用于对服务器、网络或对象模拟巨大的负载…...

AI智能推荐实战之RunnableParallel并行链

导读&#xff1a;在现代AI应用开发中&#xff0c;如何高效处理多维度数据分析始终是开发者面临的核心挑战。当您需要同时进行情感分析、关键词提取和实体识别&#xff0c;或者要对比多个AI模型的输出结果时&#xff0c;传统的串行处理方式往往效率低下。 本文将深入解析LangCha…...