第九章:Vite API 参考手册

第九章:Vite API 参考手册

9.1 核心 API

createServer

创建 Vite 开发服务器

javascript 复制代码
import { createServer } from 'vite'

const server = await createServer({
  configFile: false,
  root: __dirname,
  server: { port: 3000 }
})

await server.listen()
console.log('服务器启动在', server.config.server.port)

build

以编程方式构建

javascript 复制代码
import { build } from 'vite'

await build({
  root: './',
  build: {
    outDir: 'dist',
    rollupOptions: {
      input: 'index.html'
    }
  }
})

resolveConfig

解析配置

javascript 复制代码
import { resolveConfig } from 'vite'

const config = await resolveConfig({}, 'build', 'production')
console.log(config.base)

9.2 插件 API

Plugin 接口

typescript 复制代码
interface Plugin {
  name: string
  
  // 钩子
  buildStart?: (options: InputOptions) => void
  resolveId?: (source: string, importer: string | undefined) => string | null
  load?: (id: string) => string | null
  transform?: (code: string, id: string) => TransformResult
  buildEnd?: () => void
  generateBundle?: (options: OutputOptions, bundle: { [fileName: string]: OutputAsset | OutputChunk }) => void
  
  // Vite 特有
  config?: (config: UserConfig, env: { command: string, mode: string }) => UserConfig | null
  configResolved?: (config: ResolvedConfig) => void
  configureServer?: (server: ViteDevServer) => void
  transformIndexHtml?: (html: string, ctx: TransformIndexHtmlContext) => string | HtmlTagDescriptor[]
  handleHotUpdate?: (ctx: HmrContext) => ModuleNode[] | void
}

TransformResult

typescript 复制代码
interface TransformResult {
  code: string
  map?: SourceMap | null
  deps?: string[]
}

9.3 配置 API

defineConfig

javascript 复制代码
import { defineConfig } from 'vite'

export default defineConfig({
  // 配置项
})

// 异步配置
export default defineConfig(async ({ command, mode }) => {
  const plugins = await import('./plugins')
  return {
    plugins: [plugins.default()]
  }
})

loadConfigFromFile

javascript 复制代码
import { loadConfigFromFile } from 'vite'

const { config, deps } = await loadConfigFromFile({
  command: 'serve',
  mode: 'development'
}, './vite.config.js')

9.4 开发服务器 API

ViteDevServer 接口

typescript 复制代码
interface ViteDevServer {
  config: ResolvedConfig
  middlewares: Connect.Server
  
  listen(port?: number, isRestart?: boolean): Promise<ViteDevServer>
  close(): Promise<void>
  
  transformRequest(url: string, options?: TransformOptions): Promise<ModuleNode | null>
  
  ws: WebSocketServer
  
  moduleGraph: ModuleGraph
  pluginContainer: PluginContainer
  
  hotUpdate(module: ModuleNode): Promise<void>
}

使用示例

javascript 复制代码
const server = await createServer()

// 添加自定义中间件
server.middlewares.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`)
  next()
})

// 监听 WebSocket 消息
server.ws.on('connection', (socket) => {
  console.log('客户端连接')
})

await server.listen()

9.5 模块图 API

ModuleNode

typescript 复制代码
interface ModuleNode {
  id: string
  file: string
  url: string
  
  importers: Set<ModuleNode>
  importedModules: Set<ModuleNode>
  
  transformResult: TransformResult | null
  ssrTransformResult: TransformResult | null
  
  lastHMRTimestamp: number
  
  acceptHmrDeps: Set<ModuleNode>
  acceptedHmrDeps: Set<ModuleNode>
}

访问模块图

javascript 复制代码
const modules = server.moduleGraph.getModules()
for (const module of modules) {
  console.log(module.id, module.importedModules.size)
}

9.6 插件容器 API

typescript 复制代码
interface PluginContainer {
  resolveId(id: string, importer?: string): Promise<string | null>
  load(id: string): Promise<LoadResult | null>
  transform(code: string, id: string): Promise<TransformResult | null>
  
  buildStart(options: InputOptions): Promise<void>
  buildEnd(): Promise<void>
}

9.7 工具函数

normalizePath

路径规范化

javascript 复制代码
import { normalizePath } from 'vite'

const path = normalizePath('src\\components\\Button.vue')
// 'src/components/Button.vue'

createLogger

创建日志器

javascript 复制代码
import { createLogger } from 'vite'

const logger = createLogger('info')
logger.info('信息消息')
logger.warn('警告消息')
logger.error('错误消息')

isCSSRequest

检查是否为 CSS 请求

javascript 复制代码
import { isCSSRequest } from 'vite'

if (isCSSRequest(id)) {
  console.log('这是 CSS 文件')
}

9.8 环境变量 API

loadEnv

加载环境变量

javascript 复制代码
import { loadEnv } from 'vite'

const env = loadEnv('development', process.cwd(), 'VITE')
console.log(env.VITE_API_URL)

envPrefix

typescript 复制代码
envPrefix: 'VITE_'  // 默认,只有 VITE_ 开头的变量暴露

9.9 预构建 API

optimizeDeps

javascript 复制代码
import { optimizeDeps } from 'vite'

await optimizeDeps({
  config: {
    root: process.cwd(),
    optimizeDeps: {
      include: ['vue', 'vue-router']
    }
  }
})

9.10 热更新 API

HmrContext

typescript 复制代码
interface HmrContext {
  file: string
  timestamp: number
  modules: ModuleNode[]
  read: () => string | Promise<string>
  server: ViteDevServer
}

自定义 HMR

javascript 复制代码
handleHotUpdate({ file, server, modules }) {
  if (file.endsWith('.custom')) {
    server.ws.send({
      type: 'custom',
      event: 'custom-update',
      data: { file }
    })
    return []
  }
  return modules
}

9.11 构建 API

build 选项

typescript 复制代码
interface BuildOptions {
  target?: 'modules' | string[]
  outDir?: string
  assetsDir?: string
  assetsInlineLimit?: number
  cssCodeSplit?: boolean
  sourcemap?: boolean | 'inline' | 'hidden'
  rollupOptions?: RollupOptions
  minify?: boolean | 'esbuild' | 'terser'
  terserOptions?: TerserOptions
  write?: boolean
  emptyOutDir?: boolean
  manifest?: boolean | string
  lib?: LibraryOptions
  ssr?: boolean | string
  ssrManifest?: boolean | string
}

9.12 服务器选项

ServerOptions

typescript 复制代码
interface ServerOptions {
  host?: string | boolean
  port?: number
  strictPort?: boolean
  https?: boolean | HttpsOptions
  open?: boolean | string
  proxy?: Record<string, string | ProxyOptions>
  cors?: CorsOptions | boolean
  headers?: Record<string, string>
  fs?: {
    strict?: boolean
    allow?: string[]
  }
  hmr?: HmrOptions | boolean
  watch?: WatchOptions
  middlewareMode?: boolean
}

9.13 预构建选项

DepOptimizationOptions

typescript 复制代码
interface DepOptimizationOptions {
  include?: string[]
  exclude?: string[]
  entries?: string[]
  esbuildOptions?: EsbuildOptions
  force?: boolean
}

9.14 完整类型定义

所有类型定义都可以从 Vite 包中导入:

typescript 复制代码
import type { 
  UserConfig, 
  ConfigEnv, 
  Plugin, 
  ViteDevServer,
  BuildOptions,
  ServerOptions,
  DepOptimizationOptions
} from 'vite'

本章小结

API 参考手册提供了 Vite 的核心 API 文档:

  • 编程方式使用 Vite
  • 插件开发接口
  • 开发服务器控制
  • 模块图操作
  • 工具函数

这些 API 可用于构建工具、插件和自动化脚本。

相关推荐
benbenAItalk5 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885725 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12346 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易8 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周8 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师9 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing989 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan9 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒10 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端