You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Playground CLI实现跨包加载配置并启动Vite应用?

实现跨包Vite驱动的Playground CLI工具配置方案

1. CLI核心逻辑:检测并加载项目中的play.config.ts

在cli.js中实现配置文件定位、加载与函数提取逻辑,Node环境下需处理TS配置文件的转译:

#!/usr/bin/env node
const { resolve } = require('path');
const { findUp } = require('find-up');
const { register } = require('ts-node');

// 注册TS解析能力,支持直接加载TS配置文件
register({ transpileOnly: true });

async function loadPlayConfig() {
  // 从当前工作目录向上查找play.config.ts
  const configPath = await findUp('play.config.ts');
  if (!configPath) {
    throw new Error('未找到play.config.ts配置文件');
  }

  // 加载配置模块并导出指定函数
  const configModule = require(configPath);
  return {
    setupComponents: configModule.setupComponents,
    defineStories: configModule.defineStories
    // 可根据需求扩展其他配置函数
  };
}

async function runPlayCommand() {
  const playConfig = await loadPlayConfig();
  
  // 将配置函数传递给playground核心入口
  const { startViteServer } = require('playground/dist/index');
  await startViteServer(playConfig);
}

runPlayCommand().catch(err => {
  console.error(err);
  process.exit(1);
});

2. 项目侧play.config.ts示例

在foo-products项目中定义配置文件,导出需要传递给playground的逻辑函数:

// foo-products/play.config.ts
import { FooButton, FooDialog } from './src/components';
import ButtonStory from './src/stories/Button.story';
import DialogStory from './src/stories/Dialog.story';

export function setupComponents(register) {
  // 注册项目自身组件到playground
  register('FooButton', FooButton);
  register('FooDialog', FooDialog);
}

export function defineStories(addStory) {
  // 定义项目组件的预览故事
  addStory('基础按钮', ButtonStory);
  addStory('模态弹窗', DialogStory);
}

3. Playground核心入口(index.ts)接收并使用配置函数

在playground的index.ts中,接收CLI传递的配置函数,整合到Vite应用逻辑:

// playground/src/index.ts
import { createServer, mergeConfig } from 'vite';
import { baseViteConfig } from './vite.config';
import { ComponentRegistry, StoryManager } from './core';

export async function startViteServer(playConfig) {
  // 执行项目组件注册逻辑
  const registry = new ComponentRegistry();
  playConfig.setupComponents(registry.register);

  // 执行故事定义逻辑
  const storyManager = new StoryManager();
  playConfig.defineStories(storyManager.add);

  // 合并基础Vite配置与跨包解析规则
  const finalViteConfig = mergeConfig(baseViteConfig, {
    resolve: {
      alias: {
        'foo-products': resolve(process.cwd(), 'src'),
        'playground': resolve(__dirname, '../src')
      }
    },
    optimizeDeps: {
      include: ['foo-products/src/components']
    }
  });

  // 启动Vite开发服务器
  const server = await createServer(finalViteConfig);
  await server.listen();
  console.log('Playground已启动:', server.config.server.origin);
}

4. 关键细节说明

  • TS配置兼容:使用ts-node快速处理TS配置文件,也可通过esbuild预转译生成JS配置,提升生产环境性能
  • 跨包模块解析:通过Vite的resolve.alias将项目源码目录映射为可直接导入的别名,配合optimizeDeps提前预构建项目组件,避免运行时解析错误
  • 函数式扩展:以函数形式传递项目配置逻辑,保持playground工具与业务项目的解耦,支持灵活扩展

内容的提问来源于stack exchange,提问作者CMTV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:25:06