mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-26 19:09:52 +00:00
## Summary This code is entirely excluded from open-source, local, and desktop builds. During minification and dead-code elimination, the Mixpanel library is fully tree-shaken -- meaning no telemetry code is ever included or downloaded in those builds. Even the inline callsites are removed during the build (because `isCloud` becomes false and the entire block becomes dead code and is removed). The code not only has no effect, is not even distributed in the first place. We’ve gone to great lengths to ensure this behavior. Verification proof: https://github.com/user-attachments/assets/b66c35f7-e233-447f-93da-4d70c433908d Telemetry is *enabled only in the ComfyUI Cloud environment*. Its goal is to help us understand and improve onboarding and new-user adoption. ComfyUI aims to be accessible to everyone, but we know the learning curve can be steep. Anonymous usage insights will help us identify where users struggle and guide us toward making the experience more intuitive and welcoming. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6154-add-telemetry-provider-for-cloud-distribution-2926d73d3650813cb9ccfb3a2733848b) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude <noreply@anthropic.com>
293 lines
7.6 KiB
TypeScript
293 lines
7.6 KiB
TypeScript
import tailwindcss from '@tailwindcss/vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
import dotenv from 'dotenv'
|
|
import { visualizer } from 'rollup-plugin-visualizer'
|
|
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
|
|
import IconsResolver from 'unplugin-icons/resolver'
|
|
import Icons from 'unplugin-icons/vite'
|
|
import Components from 'unplugin-vue-components/vite'
|
|
import { defineConfig } from 'vite'
|
|
import type { UserConfig } from 'vite'
|
|
import { createHtmlPlugin } from 'vite-plugin-html'
|
|
import vueDevTools from 'vite-plugin-vue-devtools'
|
|
|
|
import { comfyAPIPlugin, generateImportMapPlugin } from './build/plugins'
|
|
|
|
dotenv.config()
|
|
|
|
const IS_DEV = process.env.NODE_ENV === 'development'
|
|
const SHOULD_MINIFY = process.env.ENABLE_MINIFY === 'true'
|
|
const ANALYZE_BUNDLE = process.env.ANALYZE_BUNDLE === 'true'
|
|
// vite dev server will listen on all addresses, including LAN and public addresses
|
|
const VITE_REMOTE_DEV = process.env.VITE_REMOTE_DEV === 'true'
|
|
const DISABLE_TEMPLATES_PROXY = process.env.DISABLE_TEMPLATES_PROXY === 'true'
|
|
const DISABLE_VUE_PLUGINS = process.env.DISABLE_VUE_PLUGINS === 'true'
|
|
const GENERATE_SOURCEMAP = process.env.GENERATE_SOURCEMAP !== 'false'
|
|
|
|
const DEV_SERVER_COMFYUI_URL =
|
|
process.env.DEV_SERVER_COMFYUI_URL || 'http://127.0.0.1:8188'
|
|
|
|
const DISTRIBUTION = (process.env.DISTRIBUTION || 'localhost') as
|
|
| 'desktop'
|
|
| 'localhost'
|
|
| 'cloud'
|
|
|
|
const BUILD_FLAGS = {
|
|
REQUIRE_SUBSCRIPTION: process.env.REQUIRE_SUBSCRIPTION === 'true'
|
|
}
|
|
|
|
export default defineConfig({
|
|
base: '',
|
|
server: {
|
|
host: VITE_REMOTE_DEV ? '0.0.0.0' : undefined,
|
|
watch: {
|
|
ignored: [
|
|
'./browser_tests/**',
|
|
'./node_modules/**',
|
|
'./tests-ui/**',
|
|
'.eslintcache',
|
|
'*.config.{ts,mts}',
|
|
'**/.git/**',
|
|
'**/.github/**',
|
|
'**/.nx/**',
|
|
'**/*.{test,spec}.ts',
|
|
'**/coverage/**',
|
|
'**/dist/**',
|
|
'**/playwright-report/**',
|
|
'**/test-results/**'
|
|
]
|
|
},
|
|
proxy: {
|
|
'/internal': {
|
|
target: DEV_SERVER_COMFYUI_URL
|
|
},
|
|
|
|
'/api': {
|
|
target: DEV_SERVER_COMFYUI_URL,
|
|
// Return empty array for extensions API as these modules
|
|
// are not on vite's dev server.
|
|
bypass: (req, res, _options) => {
|
|
if (req.url === '/api/extensions') {
|
|
res.end(JSON.stringify([]))
|
|
}
|
|
return null
|
|
}
|
|
},
|
|
|
|
'/ws': {
|
|
target: DEV_SERVER_COMFYUI_URL,
|
|
ws: true
|
|
},
|
|
|
|
'/workflow_templates': {
|
|
target: DEV_SERVER_COMFYUI_URL
|
|
},
|
|
|
|
// Proxy extension assets (images/videos) under /extensions to the ComfyUI backend
|
|
'/extensions': {
|
|
target: DEV_SERVER_COMFYUI_URL,
|
|
changeOrigin: true
|
|
},
|
|
|
|
// Proxy docs markdown from backend
|
|
'/docs': {
|
|
target: DEV_SERVER_COMFYUI_URL,
|
|
changeOrigin: true
|
|
},
|
|
|
|
...(!DISABLE_TEMPLATES_PROXY
|
|
? {
|
|
'/templates': {
|
|
target: DEV_SERVER_COMFYUI_URL
|
|
}
|
|
}
|
|
: {}),
|
|
|
|
'/testsubrouteindex': {
|
|
target: 'http://localhost:5173',
|
|
rewrite: (path) => path.substring('/testsubrouteindex'.length)
|
|
}
|
|
}
|
|
},
|
|
|
|
plugins: [
|
|
...(!DISABLE_VUE_PLUGINS
|
|
? [vueDevTools(), vue(), createHtmlPlugin({})]
|
|
: [vue()]),
|
|
tailwindcss(),
|
|
comfyAPIPlugin(IS_DEV),
|
|
generateImportMapPlugin([
|
|
{
|
|
name: 'vue',
|
|
pattern: 'vue',
|
|
entry: './dist/vue.esm-browser.prod.js'
|
|
},
|
|
{
|
|
name: 'vue-i18n',
|
|
pattern: 'vue-i18n',
|
|
entry: './dist/vue-i18n.esm-browser.prod.js'
|
|
},
|
|
{
|
|
name: 'primevue',
|
|
pattern: /^primevue\/?.*/,
|
|
entry: './index.mjs',
|
|
recursiveDependence: true
|
|
},
|
|
{
|
|
name: '@primevue/themes',
|
|
pattern: /^@primevue\/themes\/?.*/,
|
|
entry: './index.mjs',
|
|
recursiveDependence: true
|
|
},
|
|
{
|
|
name: '@primevue/forms',
|
|
pattern: /^@primevue\/forms\/?.*/,
|
|
entry: './index.mjs',
|
|
recursiveDependence: true,
|
|
override: {
|
|
'@primeuix/forms': {
|
|
entry: ''
|
|
}
|
|
}
|
|
}
|
|
]),
|
|
|
|
Icons({
|
|
compiler: 'vue3',
|
|
customCollections: {
|
|
comfy: FileSystemIconLoader('packages/design-system/src/icons')
|
|
}
|
|
}),
|
|
|
|
Components({
|
|
dts: true,
|
|
resolvers: [
|
|
IconsResolver({
|
|
customCollections: ['comfy']
|
|
})
|
|
],
|
|
dirs: ['src/components', 'src/layout', 'src/views'],
|
|
deep: true,
|
|
extensions: ['vue'],
|
|
directoryAsNamespace: true
|
|
}),
|
|
|
|
// Bundle analyzer - generates dist/stats.html after build
|
|
// Only enabled when ANALYZE_BUNDLE=true
|
|
...(ANALYZE_BUNDLE
|
|
? [
|
|
visualizer({
|
|
filename: 'dist/stats.html',
|
|
open: false,
|
|
gzipSize: true,
|
|
brotliSize: true,
|
|
template: 'treemap' // or 'sunburst', 'network'
|
|
})
|
|
]
|
|
: [])
|
|
],
|
|
|
|
build: {
|
|
minify: SHOULD_MINIFY ? 'esbuild' : false,
|
|
target: 'es2022',
|
|
sourcemap: GENERATE_SOURCEMAP,
|
|
rollupOptions: {
|
|
treeshake: true,
|
|
output: {
|
|
manualChunks: (id) => {
|
|
if (!id.includes('node_modules')) {
|
|
return undefined
|
|
}
|
|
|
|
if (id.includes('primevue') || id.includes('@primeuix')) {
|
|
return 'vendor-primevue'
|
|
}
|
|
|
|
if (id.includes('@tiptap')) {
|
|
return 'vendor-tiptap'
|
|
}
|
|
|
|
if (id.includes('chart.js')) {
|
|
return 'vendor-chart'
|
|
}
|
|
|
|
if (id.includes('three') || id.includes('@xterm')) {
|
|
return 'vendor-visualization'
|
|
}
|
|
|
|
if (id.includes('/vue') || id.includes('pinia')) {
|
|
return 'vendor-vue'
|
|
}
|
|
|
|
return 'vendor-other'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
esbuild: {
|
|
minifyIdentifiers: SHOULD_MINIFY,
|
|
keepNames: true,
|
|
minifySyntax: SHOULD_MINIFY,
|
|
minifyWhitespace: SHOULD_MINIFY,
|
|
pure: SHOULD_MINIFY
|
|
? [
|
|
'console.log',
|
|
'console.debug',
|
|
'console.info',
|
|
'console.trace',
|
|
'console.dir',
|
|
'console.dirxml',
|
|
'console.group',
|
|
'console.groupCollapsed',
|
|
'console.groupEnd',
|
|
'console.table',
|
|
'console.time',
|
|
'console.timeEnd',
|
|
'console.timeLog',
|
|
'console.count',
|
|
'console.countReset',
|
|
'console.profile',
|
|
'console.profileEnd',
|
|
'console.clear'
|
|
]
|
|
: []
|
|
},
|
|
|
|
test: {
|
|
globals: true,
|
|
environment: 'happy-dom',
|
|
setupFiles: ['./vitest.setup.ts']
|
|
},
|
|
|
|
define: {
|
|
__COMFYUI_FRONTEND_VERSION__: JSON.stringify(
|
|
process.env.npm_package_version
|
|
),
|
|
__SENTRY_ENABLED__: JSON.stringify(
|
|
!(process.env.NODE_ENV === 'development' || !process.env.SENTRY_DSN)
|
|
),
|
|
__SENTRY_DSN__: JSON.stringify(process.env.SENTRY_DSN || ''),
|
|
__ALGOLIA_APP_ID__: JSON.stringify(process.env.ALGOLIA_APP_ID || ''),
|
|
__ALGOLIA_API_KEY__: JSON.stringify(process.env.ALGOLIA_API_KEY || ''),
|
|
__USE_PROD_CONFIG__: process.env.USE_PROD_CONFIG === 'true',
|
|
__DISTRIBUTION__: JSON.stringify(DISTRIBUTION),
|
|
__BUILD_FLAGS__: JSON.stringify(BUILD_FLAGS),
|
|
__MIXPANEL_TOKEN__: JSON.stringify(process.env.MIXPANEL_TOKEN || '')
|
|
},
|
|
|
|
resolve: {
|
|
alias: {
|
|
'@/utils/formatUtil': '/packages/shared-frontend-utils/src/formatUtil.ts',
|
|
'@/utils/networkUtil':
|
|
'/packages/shared-frontend-utils/src/networkUtil.ts',
|
|
'@': '/src'
|
|
}
|
|
},
|
|
|
|
optimizeDeps: {
|
|
exclude: ['@comfyorg/comfyui-electron-types'],
|
|
entries: ['index.html']
|
|
}
|
|
}) satisfies UserConfig as UserConfig
|