• vite + react 基本项目搭建


    新建项目步骤略过

    1、下载scss

    无需任何配置就可以直接使用scss了

    pnpm install sass
    
    • 1

    使用scss配置全局颜色变量
    新建/src/styles/variable.scss并在

    $primary: #76aef9
    
    • 1

    vite.cinfig.js里配置

    export default defineConfig({
      css: {
        preprocessorOptions: {
          scss: {
            javascriptEnabled: true,
            additionalData: '@import "./src/styles/variable.scss";',
          },
        },
      },
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在组件里使用颜色变量

    h1 {
    	color: $primary
    }
    
    • 1
    • 2
    • 3

    2、配置@/路径为/src

    下载@types/node模块用于引入path模块

    pnpm install @types/node
    
    • 1

    vite.cinfig.js里配置

    import path from 'path'
    export default defineConfig({
      resolve: {
        alias:{
            '@': path.resolve(__dirname, './src') //设置路径别名,需要引用/src下面的文件时只需要在前面添加@即可
        },
        extensions: ['.js', '.ts', '.json', '.tsx'] // 导入时想要省略的扩展名列表
      },
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、重置样式

    如果存在index.css,建议删除该文件以及文件引入
    新建/src/styles/reset.scss并在main.tsx中引入

    import '@/styles/reset.scss'
    
    • 1
    html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed, 
    figure, figcaption, footer, header, hgroup, 
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video {
    	margin: 0;
    	padding: 0;
    	border: 0;
    	font-size: 100%;
    	font: inherit;
    	vertical-align: baseline;
    }
    /* HTML5 display-role reset for older browsers */
    article, aside, details, figcaption, figure, 
    footer, header, hgroup, menu, nav, section {
    	display: block;
    }
    body {
    	line-height: 1;
    }
    ol, ul {
    	list-style: none;
    }
    blockquote, q {
    	quotes: none;
    }
    blockquote:before, blockquote:after,
    q:before, q:after {
    	content: '';
    	content: none;
    }
    table {
    	border-collapse: collapse;
    	border-spacing: 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    4、配置eslint

    pnpm i eslit -D 
    
    • 1
    npx eslint --init
    
    • 1

    安装eslint相关插件

    pnpm install -D eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node @babel/eslint-parser
    
    • 1

    修改.eslintrc.cjs文件

    module.exports = {
        env: {
            browser: true,
            es2021: true,
            node: true,
            jest: true,
        },
        /* 指定如何解析语法 */
        parser: "vue-eslint-parser",
        /** 优先级低于 parse 的语法解析配置 */
        parserOptions: {
            ecmaVersion: "latest",
            sourceType: "module",
            parser: "@typescript-eslint/parser",
            jsxPragma: "React",
            ecmaFeatures: {
                jsx: true,
            },
        },
        /* 继承已有的规则 */
        extends: [
            "eslint:recommended",
            "plugin:vue/vue3-essential",
            "plugin:@typescript-eslint/recommended",
            "plugin:prettier/recommended",
        ],
        plugins: ["vue", "@typescript-eslint"],
        /*
         * "off" 或 0    ==>  关闭规则
         * "warn" 或 1   ==>  打开的规则作为警告(不影响代码执行)
         * "error" 或 2  ==>  规则作为一个错误(代码不能执行,界面报错)
         */
        rules: {
            // eslint(https://eslint.bootcss.com/docs/rules/)
            "no-var": "error", // 要求使用 let 或 const 而不是 var
            "no-multiple-empty-lines": ["warn", { max: 1 }], // 不允许多个空行
            "no-console": process.env.NODE_ENV === "production" ? "error" : "off",
            "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
            "no-unexpected-multiline": "error", // 禁止空余的多行
            "no-useless-escape": "off", // 禁止不必要的转义字符
    
            // typeScript (https://typescript-eslint.io/rules)
            "@typescript-eslint/no-unused-vars": "error", // 禁止定义未使用的变量
            "@typescript-eslint/prefer-ts-expect-error": "error", // 禁止使用 @ts-ignore
            "@typescript-eslint/no-explicit-any": "off", // 禁止使用 any 类型
            "@typescript-eslint/no-non-null-assertion": "off",
            "@typescript-eslint/no-namespace": "off", // 禁止使用自定义 TypeScript 模块和命名空间。
            "@typescript-eslint/semi": "off",
    
            // eslint-plugin-vue (https://eslint.vuejs.org/rules/)
            "vue/multi-word-component-names": "off", // 要求组件名称始终为 “-” 链接的单词
            "vue/script-setup-uses-vars": "error", // 防止