React + TypeScript + Vite + TailwindCSS项目

作者:user 发布日期: 浏览量:303

1、项目初始化

1-1、使用npm创建项目

  • 创建项目
npm create vite@latest project-name --template react-ts
// 使用 pnpm 创建项目
// pnpm create vite@latest project-name --template react-ts
  • 进入项目目录
cd project-name
  • 安装依赖
npm install
  • 启动项目
npm run dev

1-2、安装 TailwindCSS

  • 安装 TailwindCSS
npm install tailwindcss @tailwindcss/vite
  • 配置 Vite 插件
// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  plugins: [
    react(),
    tailwindcss(),
  ],
})
  • 导入 TailwindCSS 样式
// src/index.css
// 需要在 src/index.css 中顶部导入 TailwindCSS 样式
@tailwind "tailwindcss";

1-3、配置路径别名

  • 安装 @types/node
npm install @types/node --save-dev
  • 配置路径别名
// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
import path from 'path'

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    react(),
    tailwindcss()
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  }
})
// tsconfig.json
// 或者 tsconfig.node.json
{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@/*": ["*"]
    }
  }
}

1-4、配置环境变量

  • 配置环境变量类型声明
// src/vite-env.d.ts
/// <reference types="vite/client" />

interface ImportMetaEnv {
    readonly VITE_API_BASE_URL: string;
    readonly VITE_APP_TITLE: string;
    readonly VITE_MODE: 'development' | 'production';
}

interface ImportMeta {
    readonly env: ImportMetaEnv;
}
  • 配置开发环境变量
// .env.development
VITE_API_BASE_URL=http://localhost:3000/api
VITE_APP_TITLE=GroKay (Dev)
VITE_MODE=development
  • 配置生产环境变量
// .env.production
VITE_API_BASE_URL=https://shop.lgk.com:3000/api
VITE_APP_TITLE=GroKay (Prod)
VITE_MODE=production
  • 修改vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
import path from 'path'

// https://vite.dev/config/
export default defineConfig(({ mode }) => {
  const isProd = mode === 'production'
  return {
    base: isProd ? './' : '/', // 生产环境用相对路径,开发环境用根路径
    plugins: [
      react(),
      tailwindcss()
    ],
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    }
  }
})

1-5、封装axios

  • 安装axios
npm install axios
  • 封装axios
// src/utils/request.ts
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';

// 创建axios实例
const instance: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在这里可以添加token等全局请求头
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    return response.data;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 核心请求方法
function request(config: AxiosRequestConfig) {
  return instance(config);
}

// 扩展GET方法
request.get = function(url: string, config?: Omit<AxiosRequestConfig, 'url' | 'method'>) {
  return instance.get(url, config);
};

// 扩展POST方法
request.post = function(url: string, data?: any, config?: Omit<AxiosRequestConfig, 'url' | 'method' | 'data'>) {
  return instance.post(url, data, config);
};

// 扩展PUT方法
request.put = function(url: string, data?: any, config?: Omit<AxiosRequestConfig, 'url' | 'method' | 'data'>) {
  return instance.put(url, data, config);
};

// 扩展DELETE方法
request.delete = function(url: string, config?: Omit<AxiosRequestConfig, 'url' | 'method'>) {
  return instance.delete(url, config);
};

export default request;

1-6、打包项目

npm run build

2、项目配置