vite 4.0 vite.config 配置 部分翻译

1,133 阅读4分钟

本文记录下vite4 文档中的vite.config部分参数翻译与实践。

使用vite4.0 创建react项目

创建项目先

npm create vite@latest tempApp -- --template react-ts

目录格式

.
├── index.html           项目入口
├── package.json
├── public
├── src
│   ├── App.tsx          
│   ├── main.tsx         
│   ├── index.scss       
│   ├── app.module.css
│   ├── assets           资源目录(图片、less、css等)
│   ├── components       项目组件
│   └── vite-env.d.ts    全局声明
│ 
├── tsconfig.json        ts配置
├── .gitignore           git忽略配置
├── vite.config.ts       vite配置
├── .env.development     development环境变量
├── .env.production     production环境变量

生成的package.json文件

{
  "name": "tempapp",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "sass": "^1.58.0"
  },
  "devDependencies": {
    "@types/node": "^18.13.0",
    "@types/react": "^18.0.27",
    "@types/react-dom": "^18.0.10",
    "@vitejs/plugin-react": "^3.1.0",
    "typescript": "^4.9.3",
    "vite": "^4.1.0"
  }
}

配置vite.config.ts

配置与作用见下列行内注释,部分翻译可能有误。

import { defineConfig, loadEnv } from 'vite';
import react from "@vitejs/plugin-react";
import * as path from "path";

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  console.log('mode:',mode);// 开发模式'development',生产模式"production";
  // 加载自定义环境文件,
  const customEnv = loadEnv(mode, process.cwd(), ''); // 项目根目录下新建文件.env.development;便可加载自定义环境文件,
    // console.log('env:',env);

  const baseConfig = {
    // root: process.cwd(),// 入口index.html的位置,默认为process.cwd(),可以不填; 
    base: '/',// 基础公共路径 默认/,用于定义开发和线上环境资源访问路径,线上模式需自行配置绝对路径
    plugins: [react()],// 插件数组,react()配置后不需要每页再import React from 'react'
    // publicDir: "public", // 静态资源入口,默认"public",可不填,该文件夹下的内容会全部复制到输出dist文件夹内
    // cacheDir: "node_modules/.vite", // 指定缓存目录 ,默认"node_modules/.vite",可不填,该路径下的文件会预先打包,用于提升性能,
    css: {
      // CSS Modules 用于样式隔离,需要将.css文件改为.module.css类型才能生效
      modules: {
        scopeBehaviour: "local",// 可选 'global' | 'local',
        globalModulePaths: [/.index.css$/],
        // 配置css编译后在浏览器中的类名
        generateScopedName: mode === "development" ? "[path][hash]__[local]" : "[hash]__[local]",
        hashPrefix: 'string',
        localsConvention : "camelCase",
      },
      // 同postcss 配置
      postcss:{
        plugins: []
      },
      // css预处理器配置
      preprocessorOptions: {
        scss: {
          additionalData: `$injectedColor: orange;`,// 注入全局变量,可在.scss中直接使用$injectedColor
        },
        styl: {
          additionalData: `$injectedColor ?= orange`,
        },
      },
      devSourcemap:false,
      
    },
    json: {
      namedExports:true,// 支持导出.json文件,默认true
      stringify:false,// 导出时自动调用JSON.parse(),默认false
    },
    esbuild: {
      jsxFactory: 'h',
      jsxFragment: 'Fragment',
    },
    // assetsInclude:['**/*.gltf'],// 指定要被视为静态资源,当从 HTML 引用或通过 fetch 或 XHR 直接请求时,它们将被排除在插件转换管道之外。
    // 从JS导入它们将返回它们解析的URL字符串(如果设置enforce: 'pre',该设置可以被覆盖,插件以不同的方式处理资源)。
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "src"), // 别名配置后,在tsconfig中也需要配置相应的别名
      },
      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json"], // 默认值,这些文件引入时不需要写后缀
      // dedupe:["react","react-dom"],// 同一个依赖存在多份时,强制使用根路径下的node_modules中的。可不填
      // conditions: ['import','module','default'],// 允许的额外的exports方式,可不填,
      // mainFields: ['module', 'jsnext:main', 'jsnext'], //解析包的入口点时要尝试字段列表。可不填,没看懂具体啥意思
      // preserveSymlinks:false, // 资源是否强制使用原始路径,既是否允许重定向,默认值false,为允许
    },
    server: {
      host: "127.0.0.1",  // default 为localhost
      port: 3001,  // default 5173
      strictPort: true, // 设为TRUE时若端口被占用会直接退出,FALSE会尝试下一个可用端口
      open: true, // 自动打开浏览器;当此值为字符串时,会被用作 URL 的路径名
      // https: true, // Type: boolean | https.ServerOptions 升级为TLS+HTTP/2,尽在proxy存在是生效
      // proxy: {
      //   // string shorthand: http://localhost:5173/foo -> http://localhost:4567/foo
      //   '/foo': 'http://localhost:4567',
      //   // with options: http://localhost:5173/api/bar-> http://jsonplaceholder.typicode.com/bar
      //   '/api': {
      //     target: 'http://jsonplaceholder.typicode.com',
      //     changeOrigin: true,
      //     rewrite: (path) => path.replace(/^\/api/, ''),
      //   },
      // } // 配置代理示例
      // cors: true,// Type: boolean | CorsOptions,跨域默认全部允许
      // fs:{
      //   strict:true,// 默认true,只能访问工作区内的文件
      //   allow:['./src'],// 允许访问的工作区内的入口,当strict为true时,访问allow列表以外的工作区外路径会403
      //   deny:['.env', '.env.*', '*.{crt,pem}'],// 限制访问的文件,这些提供给vite dev serve敏感文件
      // }
    },
    build: {
      target:'modules',// 编译目标
      modulePreload:{ polyfill: true }, // 自动注入polyfill
      outDir:'dist',
      assetsDir:'assets',
      assetsInlineLimit:4096,// 小于4kb的转化为base64编码
      cssCodeSplit:true, // css 分包
      // cssTarget:'modules', // 默认与build.target一样,使用wechat webview时设置为‘chrome61’,阻止转换rgba为#RGBA 16进制
      sourcemap:false,
      manifest:false, // 为true时生成json文件包含asset文件的hash版本和非hash的映射
      minify:'esbuild', //压缩
      write: true, // bundle 写入磁盘
      emptyOutDir: true, // 如果输出路径再工作区内的话,每次build会清空路径下已存在的文件。
      copyPublicDir: true, // 复制publicDir下文件到outDir
      reportCompressedSize: true, // 是否报告gzip压缩的信息
      chunkSizeWarningLimit:500, // chunk过大的报警阈值,单位kbs
      optimizeDeps: {
        entries:[],// vite默认会从所有html文件去收集依赖用于预构建,如果指定build.rollupOptions.input,vite这些指定的入口收集
        exclude: [],// 预构建排除的依赖
        include: [], // 默认的不在node_modules 下的关联的包不会参与预构建,
        esbuildOptions:{
          external:[],
          plugins:[]
        },
        force:true,// 开启依赖预构建,忽略之前缓存的依赖
      }
    },
    // 注入js中的全局变量
    define:{
      __ENV__:JSON.stringify(process.env.NODE_ENV),// 可以直接访问process.env
      __APP_VERSION__ : JSON.stringify(customEnv.__APP_VERSION__), // 也可以取自定义env文件中的变量
    }
  };
  
  console.log('command: ',command);// 开发模式会是为serve,vite build 后command为build
  // 可以根据command返回不同的config,build指令下即使server存在也不影响
  if(command ==='build'){
    
    return {...baseConfig};
  }else{
    
    return {...baseConfig};
  }
  
});