Vite 集成
Vite 集成的安装方式、公开接口、使用示例与当前约束。
Comprehensive Vite plugin for QuaEngine projects that provides a complete build pipeline with zero configuration.
Features
- 🎯 QuaScript Compilation: Transform
qstemplate literals and TypeScript-first standalone.qsfiles with plugin support - 🔧 Plugin Discovery: Automatically discover and bundle QuaJS plugins
- 📦 Asset Bundling: Process game assets using Quack bundler
- 🔥 Development Server: Enhanced HMR for scripts and assets
- 🧩 Feature Plugin Slots: Compose external Vite plugins for animation, sprite, character, story graph, inventory, or other feature-specific HMR
- 🚀 Zero Configuration: Works out of the box with sensible defaults
Installation
Bashpnpm add -D @quajs/vite-plugin
Basic Usage
JAVASCRIPT// vite.config.jsimport { quaEngine } from '@quajs/vite-plugin'export default { plugins: [ ...quaEngine({ vitePlugins: [ createMyFeatureVitePlugin(), ], }), ]}
Configuration
JAVASCRIPT// vite.config.jsimport { quaEngine } from '@quajs/vite-plugin'export default { plugins: [ quaEngine({ // Script compilation options scriptCompiler: { autoCollectDecorators: true, enabled: true, include: /\.(qs|ts|tsx|js|jsx)$/, exclude: /node_modules/, projectRoot: process.cwd() }, // Plugin discovery options pluginDiscovery: { enabled: true, generateVirtualRegistry: true, autoBundlePlugins: true }, // Asset bundling options assetBundling: { enabled: true, source: 'assets', output: 'dist/assets', format: 'auto', // 'qpk' | 'zip' | 'auto' compression: { algorithm: 'deflate', // 'none' | 'deflate' | 'lzma' level: 6 }, encryption: { enabled: false, algorithm: 'xor', // 'xor' | 'aes256' key: 'your-encryption-key' } }, // Development server options devServer: { hotReloadScripts: true, watchAssets: true }, // Feature-specific Vite plugins vitePlugins: [ createMyFeatureVitePlugin(), ] }) ]}
Individual Plugins
You can also use individual plugins for more control:
JAVASCRIPTimport { quackPlugin, quaEnginePlugin, quaScriptCompilerPlugin} from '@quajs/vite-plugin'export default { plugins: [ quaScriptCompilerPlugin({ projectRoot: './src' }), quaEnginePlugin({ generateVirtualRegistry: true }), quackPlugin({ format: 'qpk', source: './game-assets' }) ]}
Plugin Discovery
The plugin automatically discovers QuaJS plugins from:
- Package dependencies: Dependencies with explicit
quajsmetadata in package.json - Custom registry: Plugins defined in
qua.plugins.json
Virtual Plugin Registry
When generateVirtualRegistry is enabled, you can import discovered plugins:
TYPESCRIPT// Access the virtual plugin registryimport { hasPlugins, pluginMeta, plugins } from 'virtual:qua-plugins'// Use discovered pluginsif (hasPlugins) { const audioPlugin = plugins['@quajs/plugin-audio'] // Initialize plugin...}
Asset Processing
The Quack integration provides:
- Asset Discovery: Automatically finds game assets
- Bundle Creation: Creates optimized asset bundles
- Manifest Generation: Provides asset metadata
- Development Watching: Hot reload for asset changes
Development Features
Hot Module Replacement
- Script HMR: Automatic reload for QuaScript changes
- Asset HMR: Live updates for game assets
- Plugin HMR: Reload when plugins change
- Feature HMR: External plugins can own their own hot-update rules through
vitePlugins
Development Events
Listen for custom events in your client code:
JAVASCRIPTif (import.meta.hot) { import.meta.hot.on('qua-assets:update', (data) => { console.warn('Asset changed:', data.file) // Reload asset... }) import.meta.hot.on('qua-script-update', (data) => { console.warn('Script updated:', data.file) // Recompile script... })}
Feature-specific modules such as animation, sprite, character, story graph, inventory, gallery, or achievement should keep their HMR/build logic inside separate Vite plugins or package metadata and pass host-level Vite behavior through vitePlugins, so the host stays a composer instead of a monolith.
Build Pipeline
The plugin creates an integrated build pipeline:
- Plugin Discovery: Scan for QuaJS plugins
- Script Compilation: Transform QuaScript templates
- Asset Bundling: Process game assets with Quack
- Bundle Generation: Create optimized bundles
- Manifest Creation: Generate asset manifests
TypeScript Support
Full TypeScript support with proper type definitions:
TYPESCRIPTimport type { QuaEngineVitePluginOptions } from '@quajs/vite-plugin'const config: QuaEngineVitePluginOptions = { scriptCompiler: { autoCollectDecorators: true, enabled: true, projectRoot: './src' }}
When scriptCompiler.autoCollectDecorators or scriptCompiler.decoratorMappings are omitted, the Vite integration falls back to QuaScript tooling config from quascript.config.json, qua.config.json#quascript, or package.json#quascript. Set scriptCompiler.autoCollectDecorators: false when you want the Vite config to override that and force decorators to come only from explicit decoratorMappings or from imports inside the current .qs / host module.
Standalone .qs files compile through the core QuaScript compiler as TypeScript, then the Vite adapter passes that output through Vite's Oxc transform for browser-ready JavaScript. Package-local decorators such as @ChapterSelect, @GrantInventoryItem, @SetBackground, and @PlayBGM are resolved through the shared QuaScript decorator discovery path. Inside .qs, use <script lang="ts"> for imports/types and <script setup lang="ts"> for factory-local bindings:
QuaScript<script lang="ts">import { formatName } from './logic.ts'export interface Scope { playerName: string}</script><script setup lang="ts">const displayName = formatName(scope.playerName)</script>Yuki: Hello ${displayName}!
Advanced Configuration
Custom Plugin Discovery
JSON// qua.plugins.json{ "version": "1.0", "plugins": [ { "name": "custom-plugin", "entry": "./plugins/custom.js", "enabled": true } ]}
Environment-Specific Config
JAVASCRIPTexport default { plugins: [ quaEngine({ assetBundling: { format: process.env.NODE_ENV === 'production' ? 'qpk' : 'zip', compression: { algorithm: process.env.NODE_ENV === 'production' ? 'lzma' : 'deflate' } } }) ]}
License
Apache-2.0