Pull to refresh

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 фрагментом, и пришлось бы его парсить на тэги, чтобы добавить.

Я просто подумал поначалу, что продукт такой важности и известности, вероятно, поступает по аналогии с PostCSS. Там система делает парсинг/токенизацию стилей — плагин получает всё разобранное по полочкам, ему остается сосредоточиться на смысловой части. Ну нет, значит нет.

Очень странно, что хук не получает AST, как например это в бабеле или вебпаке, или в ТС

Sign up to leave a comment.

Articles