English | 中文
A Vite plugin for handling HTML files, providing compression, loading, and CDN functionality.
With pnpm
pnpm add @tomjs/vite-plugin-html -D
With yarn
yarn add @tomjs/vite-plugin-html -D
With npm
npm add @tomjs/vite-plugin-html -D
Taking Vue/React projects as examples:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import html from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
vue(),
html({
minify: true,
loading: {
// selector: '#app',
after: `<div style="color:#888">loading...</div>`,
},
cdn: {
modules: ['vue', 'vue-router', 'pinia', 'ant-design-vue'],
},
}),
],
});
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import html from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
react(),
html({
minify: true,
loading: {
selector: '#root',
after: `<div style="color:#888">loading...</div>`,
},
cdn: {
modules: ['react', 'react-dom', 'react-router-dom', 'antd'],
},
}),
],
});
- index.d.ts provided by unpkg.com.
Parameter | Type | Default | Description |
---|---|---|---|
minify | boolean | HtmlMinifyOptions |
true | Configuration for compression plugin |
loading | boolean | HtmlLoadingOptions |
false | Configuration for loading plugin |
cdn | false | HtmlCdnOptions |
false | Configuration for CDN plugin |
Compresses HTML code.
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { useHtmlMinifyPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [vue(), useHtmlMinifyPlugin()],
});
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import { useHtmlMinifyPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [react(), useHtmlMinifyPlugin()],
});
boolean
or HtmlMinifyOptions, default is true
.
Same as the Options
parameter of html-minifier-terser. When the plugin parameter is boolean
, the default configuration is as follows. Otherwise, it uses the default configuration of html-minifier-terser
.
Parameter | Type | Default | Description |
---|---|---|---|
collapseWhitespace | boolean |
true | Collapse white space that contributes to text nodes |
keepClosingSlash | boolean |
true | Keep the trailing slash on singleton elements |
removeComments | boolean |
true | Remove HTML comments |
removeRedundantAttributes | boolean |
true | Remove attributes when value matches default |
removeScriptTypeAttributes | boolean |
true | Remove type="text/javascript" from script tags |
removeStyleLinkTypeAttributes | boolean |
true | Remove type="text/css" from style and link tags |
useShortDoctype | boolean |
true | Replace doctype with short (HTML5) doctype |
minifyCSS | boolean |
true | Minify CSS in style elements and style attributes (using clean-css) |
Adds loading code to the root node of the application to prevent white screens caused by network issues.
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { useHtmlLoadingPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
vue(),
useHtmlLoadingPlugin({
// selector: '#app',
after: `<div style="color:#888">loading...</div>`,
}),
],
});
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import { useHtmlLoadingPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
react(),
useHtmlLoadingPlugin({
selector: '#root',
after: `<div style="color:#888">loading...</div>`,
}),
],
});
boolean
or HtmlLoadingOptions, default is true
.
Parameter | Type | Default | Description |
---|---|---|---|
selector | string |
#app | Selector for loading node |
style | string |
undefined | Custom style code |
before | string |
undefined | Code to add before loading |
after | string |
undefined | Code to add after loading |
Changes module configuration to use CDN for vite build
, improving build speed and reducing bundle size.
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { useHtmlCdnPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
vue(),
useHtmlCdnPlugin({
modules: ['vue', 'vue-router', 'pinia', 'ant-design-vue'],
}),
],
});
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import { useHtmlCdnPlugin } from '@tomjs/vite-plugin-html';
export default defineConfig({
plugins: [
react(),
useHtmlCdnPlugin({
modules: ['react', 'react-dom', 'react-router-dom', 'antd'],
}),
],
});
Parameter | Type | Default | Description |
---|---|---|---|
modules | (NpmModule | PresetNpmModule | HtmlInjectCode)[] | [] | Modules to import |
type | 'npmmirror' | 'unpkg' | 'jsdelivr' | 'custom' |
'jsdelivr' | CDN source type, parameters name /version /file are taken from the modules configuration. When the OS language is zh_CN , the default value is npmmirror , otherwise it is jsdelivr . |
url | string |
'' | Custom URL (used with type ) |
local | 'boolean' | 'string[]' | HtmlCdnLocal | false | Local mode or specific modules |
CDN type:
- npmmirror: url defaults to https://registry.npmmirror.com/{name}/{version}/files/{file}
- jsdelivr: url defaults to https://cdn.jsdelivr.net/npm/{name}@{version}/{file}
- unpkg: url defaults to https://unpkg.com/{name}@{version}/{file}
- custom: custom url can be defined
Configuration for CDN modules.
Parameter | Type | Default | Description |
---|---|---|---|
name | string |
undefined | Name of the package |
var | string |
undefined | Global variable name (defaults to PascalCase name) |
version | string |
undefined | Package version (defaults to version in node_modules) |
file | string | string[] |
undefined | Path to the resource JS/CSS file |
modulePath | string |
undefined | Set npm module path |
deps | string[] |
undefined | Dependent modules |
local | boolean |
false | Whether it is a local module |
injectBefore | string | string[] |
undefined | These codes will be inserted before the script/link tag of the current module.The {url} keyword in the code will be replaced with relevant information about the current module. |
injectAfter | string | string[] |
undefined | These codes will be inserted after the script/link tag of the current module.The {url} keyword in the code will be replaced with relevant information about the current module. |
Example:
const modules = [
{
name: 'lodash',
var: '_',
file: 'lodash.min.js',
},
{
name: 'vue',
var: 'Vue',
},
{
name: 'vue-router',
deps: ['vue'],
},
{
name: 'ant-design-vue',
deps: ['vue', 'vue-router'],
file: ['dist/antd.min.js'],
},
];
Default supported types, internally mapped to corresponding NpmModule configurations:
- dayjs
- axios
- lodash
- vue
- vue-router
- vue-demi
- pinia
- ant-design-vue
- ant-design-vue3
- @vueuse/core
- @vueuse/shared
- element-plus
- react
- react-dom
- react-router-dom
- antd
- ahooks
- @ant-design/charts
WARNING
Some modules are introduced using CDN
, and other dependencies must be introduced first. When using package management tools such as pnpm
, if the module's dependencies are not explicitly installed, the module's dependency information may not be obtained in node_modules
, and the following exceptions may occur:
- The URL of
CDN
has no version number - In
local
mode, dependencies are thrown in the form ofCDN
URL
You can try to proactively install related dependencies to solve them. The following are some module dependencies:
- antd
- dayjs
- ant-design-vue
- dayjs
- pinia
- vue-demi
- @vueuse/core
- @vueuse/shared
Currently, this library uses pnpm list
to read dependencies to solve this problem. If you encounter this problem with other npm
tools, please contact the author to add relevant support. Thanks.
Injected HTML page code.
Parameter | Type | Default | Description |
---|---|---|---|
code | string |
undefined | HTML page code to inject |
Local configuration for CDN.
Parameter | Type | Default | Description |
---|---|---|---|
modules | 'boolean' | string[] |
false | Local mode or specific modules |
base | 'string' | '/' | Same as Vite's base option |
outDir | 'string' | 'dist' | Local output directory, defaults to Vite's build.outDir |
path | 'string' | 'npm/{name}@{version}' | Local output path, module URLs will also be replaced with this path |
copy | 'boolean' | true | Whether to copy to local directory |
-
Development requirements:
- git
- node>=18
- pnpm>=8
-
For first-time use, install dependencies by running the following commands:
# Install dependencies
pnpm i
# build library
pnpm build
- To debug the
vue
project, execute the following commands:
cd examples/vue
pnpm build
pnpm preview
- To debug the
react
project, execute the following commands:
cd examples/react
pnpm build
pnpm preview