vite-plugin-html的使用及实现

简介: 【8月更文挑战第4天】vite-plugin-html的使用及实现(实现一个简易版的插件)

vite-plugin-html

https://github.com/vbenjs/vite-plugin-html

插件作用

  • HTML 压缩能力
  • EJS模板能力
  • 多页面应用支持
  • 支持定制entry
  • 支持定制index.html的模板内容

    安装

    yarn add vite-plugin-html -D
    

    npm i vite-plugin-html -D
    

    用法

  • 添加 EJS 标签index.html,例如

    <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title><%- title %></title>
    <%- injectScript %>
    </head>
    

    配置vite.config.ts,根据需要引入需要的功能
    ```javascript
    import { defineConfig, Plugin } from 'vite'
    import vue from '@vitejs/plugin-vue'

import { createHtmlPlugin } from 'vite-plugin-html'

export default defineConfig({
plugins: [
vue(),
createHtmlPlugin({
// 是否压缩html
minify: true,
//在这里写完条目后,你不需要在' index.html '中添加脚本标签,原来的标签需要删除
entry: 'src/main.ts',
//更改index.html位置
template: 'public/index.html',
//需要注入index.html ejs模板的数据
inject: {
data: {
title: '自定义网站标题',
injectScript: <script src="./inject.js"></script>,
},
},
}),
],
})

基础配置表说明

| 参数名 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| entry | string | src/main.ts | 入口文件路径 |
| template | string | index.html | index.html模板路劲 |
| inject | InjectOptions | - | 需要注入index.html的数值 |
| minify | boolean|MinifyOptions | - | 是否压缩html |

这个插件需要更改index.hmtl模板,因此,我们需要了解transformIndexHtml钩子
## transformIndexHtml

- **类型:** IndexHtmlTransformHook | { enforce?: 'pre' | 'post', transform: IndexHtmlTransformHook }
- **种类:** 转换 index.html 的专用钩子。钩子接收当前的 HTML 字符串和转换上下文。上下文在开发期间暴露[ViteDevServer](https://vitejs.cn/vite3-cn/guide/api-javascript.html#vitedevserver)实例,在构建期间暴露 Rollup 输出的包。这个钩子可以是异步的,并且可以返回以下其中之一:
   - 经过转换的 HTML 字符串
   - 注入到现有 HTML 中的标签描述符对象数组({ tag, attrs, children })。每个标签也可以指定它应该被注入到哪里(默认是在 <head> 之前)
   - 一个包含 { html, tags } 的对象

基础示例:
```javascript
const htmlPlugin = () => {
  return {
    name: 'html-transform',
    transformIndexHtml(html) {
      return html.replace(
        /<title>(.*?)<\/title>/,
        `<title>Title replaced!</title>`
      )
    }
  }
}

完整钩子签名:

type IndexHtmlTransformHook = (
  html: string,
  ctx: {
   
    path: string
    filename: string
    server?: ViteDevServer
    bundle?: import('rollup').OutputBundle
    chunk?: import('rollup').OutputChunk
  }
) =>
  | IndexHtmlTransformResult
  | void
  | Promise<IndexHtmlTransformResult | void>

type IndexHtmlTransformResult =
  | string
  | HtmlTagDescriptor[]
  | {
   
      html: string
      tags: HtmlTagDescriptor[]
    }

interface HtmlTagDescriptor {
   
  tag: string
  attrs?: Record<string, string>
  children?: string | HtmlTagDescriptor[]
  /**
   * 默认: 'head-prepend'
   */
  injectTo?: 'head' | 'body' | 'head-prepend' | 'body-prepend'
}

简易版实现

module.exports = (options) => {
   
  return {
   
    // 转换html的

    transformIndexHtml: {
   
      // 将我们插件的一个执行时机提前
      enforce: "pre",
      transform: (html, ctx) => {
   
        return html.replace(/<%= title %>/g, options.inject.data.title);
      }
    }
  };
};

这里的html就是模板内的html内容字符串
此时,项目内即可使用
index.html模板内

<title><%= title %></title>

vite.config.js中

// vite.config.js
import CreateHtmlPlugin from "./plugin/CreateHtmlPlugin";
import {
    defineConfig } from "vite";
export default defineConfig({
   
  plugins: [
    CreateHtmlPlugin({
   
      inject: {
   
        data: {
   
          title: "好好学习,天天向上"
        }
      }
    })
  ]
});
相关文章
vite环境引入web worker方法
在 vite 环境中使用 web worker 时,如果遇到生产环境中 worker.js 文件的 MIME 类型被识别为 text/html,导致报错无法运行的情况时,可以参考以下两种方法,原理都是避免编译时产出单独的 worker.js 文件。方法一worker文件不需要包装,引入时后缀增加 ?worker&inline,使用时直接 new ImportedWorker();self.
1984 1
|
1月前
|
Rust 前端开发 JavaScript
Vite 8 背后的秘密:为什么尤雨溪选择了 Oxc
Oxc(The Oxidation Compiler)是用Rust打造的高性能JS/TS工具链,含解析、Lint、格式化、转换、压缩等核心组件。内存零GC、零拷贝解析、共享AST架构,使Oxlint比ESLint快100倍、Oxfmt比Prettier快30倍。已集成Vite 8,5分钟即可升级开发体验!
433 1
Vite 8 背后的秘密:为什么尤雨溪选择了 Oxc
|
存储 JavaScript
这一定是最有用的vite插件入门教程了!
【8月更文挑战第3天】 vite插件核心在于几个钩子函数的理解与使用,想开发vite插件,掌握这几个插件即可。本文中探讨了**config钩子**和**transformIndexHtml钩子**,相信大家看完对插件开发一定有了最基本的认识与方向!
1092 3
|
自然语言处理 JavaScript 前端开发
vue3-ts-vite:vue 项目 配置 多页面应用
vue3-ts-vite:vue 项目 配置 多页面应用
3465 0
|
API
Vite 中环境变量的配置方法
【10月更文挑战第10天】 Vite 中环境变量的配置方法
1726 2
|
前端开发 JavaScript
vite中如何更优雅的使用css
【8月更文挑战第2天】webpack中,我们需要在项目中安装css-loader才能让webpack识别css文件。vue-cli基于webpack,内置了这个loader ,Vite天生就是支持对CSS文件的直接处理的。
886 5
vite中如何更优雅的使用css
|
JavaScript
rollup的input配置和output配置详解
【8月更文挑战第5天】rollup的input配置和output配置详解
644 4
rollup的input配置和output配置详解
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
3170 0
|
JavaScript 前端开发 容器
微应用框架-----乾坤
微应用框架-----乾坤