ddd1020a3a
Решение «Vite не трогать» пересмотрено по данным, а не по желанию обновиться.
`pnpm audit --prod` (то, на что смотрит gate сборки) был чист, но полный audit
показывал в build-цепочке два critical и rollup GHSA DOM clobbering — а он
затрагивает ГЕНЕРИРУЕМЫЙ bundle, то есть уезжает в production. Vite 4.3.1 тянул
rollup 3 без исправления.
Взята 7.3.6 — последняя линия до Rolldown. Vite 8 по-прежнему не берётся: это
смена бандлера, отдельная работа с собственной приёмкой.
Вместе с Vite обновлена цепочка плагинов (@vitejs/plugin-vue 4 -> 6,
unplugin-* и unocss с версий 2022-2023 годов) и линтеры (@typescript-eslint
5 -> 8, prettier 2 -> 3, stylelint 15 -> 17). Новый @typescript-eslint нашёл 7
настоящих замечаний — исправлены по существу, а не подавлением правил; среди
них подавление несуществующего правила ban-types и `{}` вместо `object`.
Отдельно — три мёртвых редактора. Outbounds уже был разобран, здесь то же
самое для ImputMultiple (ACME-домены, inline ACL) и MapAdd (параметры ACME DNS,
заголовки masquerade): оба редактировали конфиг Hysteria в форме с
:disabled="true", получали значения без v-model и эмитили события, которых
никто не слушает, на странице без единого маршрута записи.
Цена ImputMultiple была измеримой. vuedraggable поставляется UMD-сборкой,
поэтому её require("vue") разрешался в vue/dist/vue.cjs.prod.js — полную сборку
Vue с рантайм-компилятором шаблонов. В бандл уезжало ~500 КБ исходников
(vuedraggable + sortablejs + compiler-core + compiler-dom) ради перетаскивания
тегов в недоступной для редактирования форме.
Разбор bundle через sourcemap нашёл и вторую потерю: @vueuse/core собирался
дважды — наш 13.9.0 и 14.4.0 из element-plus. Версии сведены.
bundle: 2 813 525 против 2 404 202 на исходной базовой линии (+17% за Vue 3.5,
Element Plus 2.14, echarts 6 и rollup 4). Промежуточное состояние без этих двух
исправлений было 3 046 172.
pnpm audit --prod: чисто. typecheck/eslint/stylelint: 0. go build с dist: OK.
50 lines
1.8 KiB
JavaScript
50 lines
1.8 KiB
JavaScript
module.exports = {
|
|
// Extend recommended configs
|
|
extends: [
|
|
"stylelint-config-standard",
|
|
"stylelint-config-recommended-scss",
|
|
"stylelint-config-recommended-vue/scss",
|
|
"stylelint-config-html/vue",
|
|
"stylelint-config-recess-order",
|
|
],
|
|
// Parsers for different file types
|
|
overrides: [
|
|
{
|
|
files: ["**/*.{vue,html}"],
|
|
customSyntax: "postcss-html",
|
|
},
|
|
{
|
|
files: ["**/*.{css,scss}"],
|
|
customSyntax: "postcss-scss",
|
|
},
|
|
],
|
|
// Custom rules
|
|
rules: {
|
|
"import-notation": "string", // CSS import notation: "string" | "url"
|
|
"selector-class-pattern": null, // Selector class naming rule
|
|
"custom-property-pattern": null, // Custom property naming rule
|
|
"keyframes-name-pattern": null, // Keyframe naming rule
|
|
"no-descending-specificity": null, // Allow non-descending specificity
|
|
// Пустая строка `//` внутри блока комментария — абзацный разделитель, а не
|
|
// забытый комментарий. Правило появилось в stylelint-config-recommended-scss
|
|
// 17 и требует либо склеивать абзацы, либо разрывать блок пустой строкой;
|
|
// и то и другое ухудшает читаемость объяснений, ради которых эти
|
|
// комментарии написаны.
|
|
"scss/comment-no-empty": null,
|
|
// Allow global, export and deep pseudo classes
|
|
"selector-pseudo-class-no-unknown": [
|
|
true,
|
|
{
|
|
ignorePseudoClasses: ["global", "export", "deep"],
|
|
},
|
|
],
|
|
// Allow unknown properties
|
|
"property-no-unknown": [
|
|
true,
|
|
{
|
|
ignoreProperties: ["menuBg", "menuText", "menuActiveText"],
|
|
},
|
|
],
|
|
},
|
|
};
|