Skip to content

Vite中配置项TS类型提示

vite 的默认配置文件是 vite.config.ts,最基础的配置文件格式如下:

ts
export default {
  // 配置选项
};

我们也可以通过 –-config 命令行选项指定一个配置文件,命令行输入: vite --config configFile.js

采用 vscode 编译器增添 vite 配置时,编译器是没有任何提示的,这对我们很不友好!(下图的提示并不是 vite 的可选配置提示,是插件对JS语法的通用提示)

WebStorm 有很好的语法补全功能,而 vscode 却没有。因此若想让编译器给予智能提示,可以通过以下两种方式来进行特殊处理。

defineConfig

使用官方提供的 defineConfig,可以发现存在配置项提示。

通过查看源码:

ts
export type UserConfigFn = (
  env: ConfigEnv
) => UserConfig | Promise<UserConfig>;
export type UserConfigExport =
  | UserConfig
  | Promise<UserConfig>
  | UserConfigFn;

/**
 * Type helper to make it easier to use vite.config.ts
 * accepts a direct {@link UserConfig} object, or a function that returns it.
 * The function receives a {@link ConfigEnv} object that exposes two properties:
 * `command` (either `'build'` or `'serve'`), and `mode`.
 */
export function defineConfig(config: UserConfigExport): UserConfigExport {
  return config;
}

就可以发现本质上就是使用 TypeScript 来做类型提示。

jsdoc 注释法

jsDoc 是一个用于 JavaScriptAPI 文档生成器,官网

通过注释的方式使引用的对象存在类型提示:

ts
/** @type import("vite").UserConfig  */

环境模式配置

webpack 时代,基于不同的环境,开发者通常会设置不同的配置文件,如:webpack.dev.configwebpack.prod.configwebpack.base.config...

vite 中,基于不同环境设置不同配置,只需要导出这样一个函数:

ts
export default defineConfig(({ command, mode, ssrBuild }) => {
  if (command === 'serve') {
    return {
      // dev 独有配置
    };
  } else {
    // command === 'build'
    return {
      // build 独有配置
    };
  }
});

优化一下写法:

ts
import { defineConfig } from 'vite';
import viteBaseConfig from './vite.base.config';
import viteDevConfig from './vite.dev.config';
import viteProdConfig from './vite.prod.config';

const envResolver = {
  // build: () => ({...viteBaseConfig,viteProdConfig}) 这种方式也可以
  // Object.assign 中的 {} 是为了防止 viteBaseConfig 被修改。
  build: () => ({ ...viteBaseConfig, ...viteProdConfig }),
  serve: () => ({ ...viteBaseConfig, ...viteDevConfig })
};
export default defineConfig(({ command, mode, ssrBuild }) => {
  return envResolver[command]();
});

同时 defineConfig 也支持异步配置。如果配置需要调用一个异步函数,也可以转而导出一个异步函数:

ts
export default defineConfig(async ({ command, mode }) => {
  const data = await asyncFunction();
  return {
    // vite 配置
  };
});

Contributors

Changelog

Discuss

Released under the CC BY-SA 4.0 License. (2619af4)