3x-ui/frontend
MHSanaei 3ca644eb3d
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.

- web/assets/js/util/index.js (927 lines, 21 classes) →
  frontend/src/utils/legacy.js + a barrel at utils/index.js. All
  classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
  from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
  SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
  import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
  composables/useMediaQuery.js — Vue 3 composable returning reactive
  `isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
  window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
  copied with `export` added on every top-level declaration. Imports
  between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
  useMediaQuery so the user can verify Phase 3 with `npm run dev`.

Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 10:47:15 +02:00
..
src refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules 2026-05-08 10:47:15 +02:00
.gitignore build(frontend): Phase 2 — scaffold Vite + Vue 3 + AD-Vue 4 2026-05-08 10:36:03 +02:00
index.html build(frontend): Phase 2 — scaffold Vite + Vue 3 + AD-Vue 4 2026-05-08 10:36:03 +02:00
package-lock.json refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules 2026-05-08 10:47:15 +02:00
package.json refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules 2026-05-08 10:47:15 +02:00
README.md build(frontend): Phase 2 — scaffold Vite + Vue 3 + AD-Vue 4 2026-05-08 10:36:03 +02:00
vite.config.js build(frontend): Phase 2 — scaffold Vite + Vue 3 + AD-Vue 4 2026-05-08 10:36:03 +02:00

3x-ui frontend

Vue 3 + Ant Design Vue 4 + Vite. Builds into ../web/dist/, which the Go binary will embed via embed.FS once the migration reaches the page handlers (Phase 4+).

This directory exists alongside the legacy web/html/ Vue 2 templates during the migration. Pages will move over one at a time on the vue3-migration branch.

Dev

cd frontend
npm install
npm run dev

The dev server runs on http://localhost:5173/ and proxies API calls to the Go panel at http://localhost:2053/ — start the Go panel first (go run main.go), then start Vite.

Production build

npm run build

Outputs to ../web/dist/. The Go binary picks it up at compile time via embed.FS.

Where things live

  • src/main.js — app entrypoint (createApp, install Antd, mount)
  • src/App.vue — root component (currently a smoke-test placeholder)
  • vite.config.js — build + dev-server config
  • index.html — Vite HTML template

Adding new pages

For each legacy page being migrated, add an entry to vite.config.js rollupOptions.input. Each entry produces its own HTML file in web/dist/, which the Go panel route handler will serve.