Comments 5
Слишком сложно для индустрии, где через пару лет появится новый сборщик (ну или Хромиум научится сам собирать) ;)
Я правильно понимаю, что хук получает содержимое index.html
в виде сплошной строки, которую предлагается вручную расковыривать регулярками? То есть какого-то осмысленного разбора HTML или, скажем, модификации узлов по селекторам не предусмотрено. Как-то эта апишка ни о чём.
Хороший вопрос
На вход хуку поступает действительно всего лишь строка и разбора её средствами Vite не предусмотрено и не может быть, потому как данный разбор, скажем так, не может быть универсальным/"стандартным" (нет стандартной библиотека парсинга HTML, непонятно как парсить невалидный html и т.п.). Поэтому "эта апишка" не про парсинг HTML. Подключить свою библиотеку и отпарсить самому при желании - 5 строк кода
Однако возвращать хук может намного больше, чем строку. Вот сигнатура хука:
IndexHtmlTransformHook
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 | boolean>
children?: string | HtmlTagDescriptor[]
/**
* default: 'head-prepend'
*/
injectTo?: 'head' | 'body' | 'head-prepend' | 'body-prepend'
}
Другими словам, можно вернуть массив объектов HtmlTagDescriptor
, каждый из которых говорит какой тэг, с каким содержимым и куда надо вставить, что может быть иногда удобней. В моем случае это не подходит, так как фрагмент кода может быть чем угодно, в частности, массивом тэгов - как в случае с GA фрагментом, и пришлось бы его парсить на тэги, чтобы добавить.
Очень странно, что хук не получает AST, как например это в бабеле или вебпаке, или в ТС
Написание Vite плагина