vite项目初始化实践

21

vite项目初始化

  • 使用官方vite模板初始化
pnpm create vite my-app --template react-swc-ts
  • 配置.vscode

    {
      "prettier.enable": false,
      "editor.formatOnSave": false,
      "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true,
        "source.fixAll.stylelint": true,
        "source.organizeImports": false
      },
      "eslint.validate": [
        "javascript",
        "javascriptreact",
        "typescript",
        "typescriptreact",
        "html",
        "markdown",
        "json",
        "jsonc",
        "yaml"
      ],
      "stylelint.validate": [
        "css",
        "less",
        "scss"
      ]
    }
    
  • 配置eslint

    pnpm i -D @antfu/eslint-config-react eslint eslint-config-standard-jsx
    
    • 配置.eslintrc.cjs

      module.exports = {
        root: true,
        extends: ['standard-jsx', '@antfu/eslint-config-react', '@unocss'],
        rules: {
          'react/prop-types': 'off',
          'unused-imports/no-unused-imports': 'error',
        },
        settings: {
          react: {
            version: 'detect',
          },
        },
      }
      
  • 配置commitlint

    pnpm i -D @commitlint/cli @commitlint/config-conventional
    
    • 配置commitlint.config.cjs

      module.exports = { extends: ['@commitlint/config-conventional'] }
      
  • 配置stylelint

    pnpm i -D stylelint stylelint-config-standard-scss stylelint-stylistic
    
    • 配置stylelint.config.cjs

      module.exports = {
        extends: ['stylelint-config-standard-scss', 'stylelint-stylistic/config'],
        rules: {
          'selector-pseudo-class-no-unknown': [true, {
            ignorePseudoClasses: ['global'],
          }],
          'color-function-notation': null,
        },
      }
      
  • 配置unocss

    • vscode安装UnoCSS插件
    pnpm i -D unocss @unocss/reset @unocss/eslint-config @iconify/utils
    

    @unocss/reset 是css原子集合,@unocss/eslint-config用于eslint格式化,在.eslintrc.cjs有引用,@iconify/utils用于实现利用unocss加载自定义icons

  • 配置unocss.config.ts

    pnpm i svgo
    

    svgo用于压缩自定义icons

    import { defineConfig, transformerDirectives, transformerVariantGroup } from 'unocss'
    import presetIcons from 'unocss/preset-icons'
    import type { Theme } from 'unocss/preset-uno'
    import presetUno from 'unocss/preset-uno'
    import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'
    import { optimize } from 'svgo'
    
    export default defineConfig<Theme>({
      presets: [
        presetUno(),    // uno预设
        presetIcons({    // icon预设与自定义icon引入
          collections: {
            icon: FileSystemIconLoader(        // FileSystemIconLoader用于加载自定义icons, 并配合svgo压缩
              'src/assets/icons',
              svg => optimize(svg, { multipass: true }).data,
            ),
          },
        }),
      ],
      transformers: [
        transformerDirectives(),
        transformerVariantGroup(),
      ],
      rules: [
        // 简化写法,如 border-border-secondary 可简化为 border-secondary
        [
          /^(text|border|b|fill|bg)-(.*)$/,
          ([, p1, p2], { theme }) => {
            if (p1 === 'b')
              p1 = 'border'
    
            const colorKey = `${p1}-${p2}`
            const colorValue = theme.colors?.[colorKey] as string
            if (!colorValue)
              return
    
            switch (p1) {
              case 'text':
                return { color: colorValue }
              case 'border':
                return { 'border-color': colorValue }
              case 'fill':
                return { fill: colorValue }
              case 'bg':
                return { 'background-color': colorValue }
            }
          },
        ],
      ],
    })
    
  • 配置vite.config.ts

    pnpm i -D @vitejs/plugin-react-swc vite-plugin-pages @vitejs/plugin-legacy
    

vite-plugin-pages用于实现约定式路由,@vitejs/plugin-legacy提供垫片,兼容低版本浏览器

import path from 'node:path'
import fs from 'node:fs/promises'
import react from '@vitejs/plugin-react-swc'
import { defineConfig } from 'vite'
import pages from 'vite-plugin-pages'
import legacy from '@vitejs/plugin-legacy'
import unocss from 'unocss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react(),
    unocss(),
    pages({
      importMode: 'async',
      exclude: ['**/components/*.tsx'],
    }),
    legacy({
      modernPolyfills: true,
      renderLegacyChunks: false,
    }),
    {
      name: 'after-write-bundle',
      apply: 'build',
      writeBundle: async ({ dir }) => {
        // 生产环境下删除 mockServiceWorker.js
        await fs.rm(path.resolve(dir, 'mockServiceWorker.js'))
      },
    },
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    },
  },
  build: {
    target: 'es2015',
  },
})

最后,

pnpm run dev

启动!