• Vue3+Ts+Vite 项目搭建&项目说明


    项目搭建

    命令行工具输入以下命令,生成模板项目

     npm init vue@latest
    
    • 1
    ✔ Project name: … <项目名称>   
    ✔ Add TypeScript? … No / Yes  ---------------------------------------- #安装 TypeScript 
    ✔ Add JSX Support? … No / Yes ---------------------------------------- #安装对 JSX 语法的支持 
    ✔ Add Vue Router for Single Page Application development? … No / Yes - #安装 Vue Router 路由管理
    ✔ Add Pinia for state management? … No / Yes ------------------------- #安装 Pinia 状态管理
    ✔ Add Vitest for Unit testing? … No / Yes ---------------------------- #安装 Vitest 单元测试
    ✔ Add Cypress for both Unit and End-to-End testing? … No / Yes ------- #安装 Cypress 端到端测试
    ✔ Add ESLint for code quality? … No / Yes ---------------------------- #安装 ESLint 代码校验
    ✔ Add Prettier for code formatting? … No / Yes ----------------------- #安装 Prettier 统一代码规范
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    模板项目的基本目录结构

    node_modules --------------------------------- 第三方依赖文件
    public --------------------------------------- 公共文件夹(如icon图标)
    src ------------------------------------------ 项目页面目录
    .env ----------------------------------------- 环境变量配置
    .env.development ----------------------------- 开发环境下的配置文件
    .env.production ------------------------------ 生产环境下的配置文件
    .eslintignore -------------------------------- 配置 Eslint 忽略检查的文件目录、文件等
    .eslintrc.js --------------------------------- 配置 Eslint 代码校验规则
    .gitignore ----------------------------------- 配置 Git 忽略目录或文件
    .prettierrc.js ------------------------------- 配置代码规范,统一代码风格
    index.html ----------------------------------- 项目挂载的 html 页面
    LICENSE -------------------------------------- 开源声明
    package-lock.json ---------------------------- 主要用于记录了上一次安装的依赖的版本号(为升级后不兼容,提供回退参考)
    package.json --------------------------------- 该项目包必要的说明文件
    plugins.d.ts --------------------------------- 插件类型声明文件
    README.md ------------------------------------ 该项目说明文件
    vue.d.ts ------------------------------------- .vue文件类型声明文件
    source.d.ts ---------------------------------- 资源类型声明文件
    tsconfig.json -------------------------------- Ts编译器配置文件
    vite.config.ts ------------------------------- vite配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    模板项目下几个重要的配置文件说明

    package.json 文件

    参考阅读:

    { 
      "name": "",// ----------------------------------------- 项目名称
      "version": "1.0.0",// --------------------------------- 项目的版本
      "description": "快速了解该项目的功能及作用", // --------- 项目的描述
      "scripts": {// ---------------------------------------- 定义命令别名,当命令很长时可以使用别名替换
        "dev": "vite",                              // 默认 command 的值为 serve, mode 为 development
        "build": "vue-tsc --noEmit && vite build",  // 默认 command 的值为 build, mode 为 production
        "preview": "vite preview"
      },
      "keywords": [],// -------------------------------------- 关键字,它允许我们使用关键字去描述当前的项目
      "author": "",//----------------------------------------- 项目的作者
      "license": "MIT",//------------------------------------- 项目遵循的协议,默认是ISC也就是开放源代码的协议
      "dependencies": {},//----------------------------------- 项目所需要依赖的第三方模块(包)
      "devDependencies": {},//-------------------------------- 仅开发时所需要依赖的第三方模块(包)
      "repository": {},// ------------------------------------ 项目仓库地址
      "browserslist": []// ----------------------------------- 适用的浏览器
      // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    vite.config.ts 文件

    Vite 会自动解析 项目根目录下名为 vite.config.js 的文件

    参考阅读:

    import vue from '@vitejs/plugin-vue';
    import { resolve } from 'path';
    import { defineConfig, loadEnv, ConfigEnv } from 'vite';
    
    const pathResolve = (dir: string): any => {
    	return resolve(__dirname, '.', dir);
    };
    
    const alias: Record<string, string> = {
    	'/@': pathResolve('./src/'),
    };
    /**
     * @command 在 Vite 的 API 中,在开发环境下 command 的值为 serve(在 CLI 中, vite dev 和 vite serve 是 vite 的别名),而在生产环境下为 build(vite build)
     * @mode 根据当前工作目录中的 `mode` 加载 .env 文件
     * @ssrBuild 用于服务端渲染时
    */
    export default defineConfig(({ command, mode, ssrBuild }) => {
        // 使用 Vite 导出的 loadEnv 函数来加载指定的 .env 文件,设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀
        const env = loadEnv(mode, process.cwd(), '')
        return {
            // vite 共享配置
    		root: process.cwd(),    // ----------------- 项目根目录(index.html 文件所在的位置)
    		base: 'workbench',      // ----------------- 开发或生产环境服务的公共基础路径
            mode: "development",    // ----------------- 默认: 'development' 用于开发,'production' 用于构建
            define: { __APP_ENV__: env.APP_ENV }, // --- 定义全局常量替换方式
            plugins: [vue()],       // ----------------- 需要用到的插件数组
    		resolve: { alias },     // ----------------- 定义文件路径别名,当使用文件系统路径的别名时,请始终使用绝对路径,否则无法解析
    		css: {                  // ----------------- css 配置
    			postcss: {          // ----------------- 内联的 PostCSS 配置
    				plugins: [{
    						postcssPlugin: 'internal:charset-removal',
    						AtRule: { charset: (atRule) => { if (atRule.name === 'charset') { atRule.remove() }}},
    					}],
    			},
    		},
    
            // 开发时服务器配置选项  执行 npm run dev 时
    		server: {
    			host: '0.0.0.0',        // 指定服务器应该监听哪个 IP 地址
    			port: '',               // 端口
                open: false,    // 在开发服务器启动时自动在浏览器中打开应用程序
                // 为开发服务器配置自定义代理规则,如前端接口调用: fetch('/api/dev')
                // 此时会通过上面的代理规则,将源地址代理到目标地址,从而访问目标地址的接口 https://googxh.xyz/api/dev
    			proxy: {                
    				'/api/dev': {
    					target: 'https://googxh.xyz',
    					ws: true,
    					changeOrigin: true,
    					rewrite: (path) => path.replace(/^\/api/, ''),
    				},
    			},
    		},
    
    		// 构建打包时配置选项 执行 npm run build 时
    		build: {
    			outDir: 'dist',// 指定输出路径(相对于 项目根目录)
    			sourcemap: false, // 构建后是否生成 source map 文件
    			chunkSizeWarningLimit: 1500, // 规定触发警告的 chunk(文件块) 大小
    			rollupOptions: {  // 自定义底层的 Rollup 打包配置
    				output: {
    					entryFileNames: `assets/[name].${new Date().getTime()}.js`,
    					chunkFileNames: `assets/[name].${new Date().getTime()}.js`,
    					assetFileNames: `assets/[name].${new Date().getTime()}.[ext]`,
    					compact: true,
    					manualChunks: {
    						vue: ['vue', 'vue-router', 'pinia'],
    						echarts: ['echarts'],
    					},
    				},
    			},
                //生产环境自动删除console
    			terserOptions: {
    				compress: {
    					drop_console: true,     // 自动去除console
    					drop_debugger: true,    // 清除 debugger 语句
    				},
    				ie8: true,
    				output: { comments: true }, // 删除注释
    			},
    		},
            
        }
    })
    
    
    • 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
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    tsconfig.json 文件

    TypeScript 编译器配置文件

    参考阅读:

    {
    	"compilerOptions": {
    
    		/* Basic Options */
            "incremental": true, // ----------------- TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度
            "tsBuildInfoFile": "./buildFile", // ---- 增量编译文件的存储位置
    		"target": "esnext" /* 目标语言的版本: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
    		"module": "esnext" /* 生成代码的模板标准: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
    		"lib": ["esnext", "dom", "dom.iterable", "scripthost"] /* Specify library files to be included in the compilation. */,
    		// "allowJs": true,                       /* 允许编译器编译 JS,JSX 文件 */
    		// "checkJs": true,                       /* 允许在 JS 文件中报错,通常与 allowJS 一起使用 */
    		"jsx": "preserve"                         /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */,
            // "declaration": true,                   /* 生成声明文件,开启后会自动生成声明文件 */
            // "declarationDir": "./file",            /* 指定生成声明文件存放目录 */
    		// "declarationMap": true,                /* 为声明文件生成 sourceMap '.d.ts' file. */
    		// "sourceMap": true,                     /* 生成目标文件的 sourceMap 文件 */
    		// "outFile": "./",                       /* 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD" */
    		// "outDir": "./",                        /* 指定输出目录 */
    		// "rootDir": "./",                       /* 指定输出文件目录(用于输出),用于控制输出目录结构 */
    		// "composite": true,                     /* Enable project compilation */
    		// "removeComments": true,                /* 删除注释 */
            // "noEmit": true,                        /* 不输出文件,即编译后不会生成任何js文件 */
            // "noEmitOnError": true,                 /* 发送错误时不输出任何文件 */
            // "noEmitHelpers": true,                 /* 不生成helper函数,减小体积,需要额外安装,常配合importHelpers一起使用 */
    		// "importHelpers": true                  /* 通过 tslib 引入helper 函数,文件必须是模块 */,
    		// "downlevelIteration": true             /* 降级遍历器实现,如果目标源是 Es3/Es5 ,那么遍历器会有降级的实现 */,
    		// "isolatedModules": true                /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */,
    
    		/* Strict Type-Checking Options */
    		"strict": true                            /* 开启所有严格的类型检查*/,
    		// "noImplicitAny": true,                 /* 不允许隐式的 any 类型 */
    		// "strictNullChecks": true,              /* 不允许把 null、undefined 赋值给其他类型的变量 */
    		// "strictFunctionTypes": true,           /* 不允许函数参数双向协变 */
    		// "strictBindCallApply": true,           /* 严格的 bind/call/apply 检查 */
    		// "strictPropertyInitialization": true,  /* 类的实例属性必须初始化 */
    		// "noImplicitThis": true,                /* 不允许 this 有隐式的 any 类型 */
    		// "alwaysStrict": true,                  /* 在代码中注入'use strict' */
    
    		/* Additional Checks */
    		// "noUnusedLocals": true,                /* 检查只声明、未使用的局部变量(只提示不报错) */
    		// "noUnusedParameters": true,            /* 检查未使用的函数参数(只提示不报错) */
    		// "noImplicitReturns": true,             /* 每个分支都会有返回值 */
    		// "noFallthroughCasesInSwitch": true,    /* 防止switch语句贯穿(即如果没有break语句后面不会执行) */
    		// "noUncheckedIndexedAccess": true,      /* 没有在接口里声明的对象的属性,会添加一个 undefined 类型 */
    
    		/* Module Resolution Options */
    		"moduleResolution": "node"                /* 模块解析策略,ts 默认用 node 的解析策略,即相对的方式导入, 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
    		"baseUrl": "."                            /* 解析非相对模块的基地址,默认是当前目录 */,
    		"paths": { "/@/*": ["src/*"] }            /* 路径映射,相对于 baseUrl */,
    		// "rootDirs": [],                        /* 将多个目录放在一个虚拟目录下,用于运行时,即编译后引入文件的位置可能发生变化,这也设置可以虚拟src和out在同一个目录下,不用再去改变路径也不会报错 */
    		// "typeRoots": [],                       /* 声明文件目录,默认时 node_modules/@types */
    		"types": ["vite/client"]                  /* 加载的声明文件包 */,
    		"allowSyntheticDefaultImports": true      /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */,
    		"esModuleInterop": true                   /* 允许 export 导出,由 import from 导入. */,
    		// "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
    		// "allowUmdGlobalAccess": true,          /* 允许在模块中全局变量的方式访问umd模块. */
    
    		/* Source Map Options 可以精准定位到具体的错误行*/
    		// "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    		// "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    		// "inlineSourceMap": true,               /* 生成目标文件的inline SourceMap,inline SourceMap会包含在生成的js文件中. */
    		// "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
    
    		/* Experimental Options 实验性选项*/
    		"experimentalDecorators": true            /* Enables experimental support for ES7 decorators. */,
    		// "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
    
    		/* Advanced Options 高级选项 */
    		"skipLibCheck": true                      /* Skip type checking of declaration files. */,
    		"forceConsistentCasingInFileNames": true  /* Disallow inconsistently-cased references to the same file. */
    	}
    }
    
    • 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
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    .eslintrc.js 文件

    参考阅读:

    module.exports = {
       root: true,
       env: {
       	browser: true,
       	es2021: true,
       	node: true,
       },
       parser: 'vue-eslint-parser',
       parserOptions: {
       	ecmaVersion: 12,
       	parser: '@typescript-eslint/parser',
       	sourceType: 'module',
       },
       extends: ['plugin:vue/vue3-essential', 'plugin:vue/essential', 'eslint:recommended'],
       plugins: ['vue', '@typescript-eslint'],
       rules: {
       	'@type-eslint/ban-ts-ignore': 'off',
       	'@type-eslint/explicit-function-return-type': 'off',
       	'@type-eslint/no-explicit-any': 'off',
       	'@type-eslint/no-var-requires': 'off',
       	'@type-eslint/no-empty-function': 'off',
       	'@type-eslint/no-use-before-define': 'off',
       	'@type-eslint/ban-ts-comment': 'off',
       	'@type-eslint/ban-types': 'off',
       	'@type-eslint/no-non-null-assertion': 'off',
       	'@type-eslint/explicit-module-boundary-types': 'off',
       	'vue/custom-event-name-casing': 'off',
       	'vue/attributes-order': 'off',
       	'vue/one-component-per-file': 'off',
       	'vue/html-closing-bracket-newline': 'off',
       	'vue/max-attributes-per-line': 'off',
       	'vue/multiline-html-element-content-newline': 'off',
       	'vue/singleline-html-element-content-newline': 'off',
       	'vue/attribute-hyphenation': 'off',
       	'vue/html-self-closing': 'off',
       	'vue/no-multiple-template-root': 'off',
       	'vue/require-default-prop': 'off',
       	'vue/no-v-model-argument': 'off',
       	'vue/no-arrow-functions-in-watch': 'off',
       	'vue/no-template-key': 'off',
       	'vue/no-v-html': 'off',
       	'vue/comment-directive': 'off',
       	'vue/no-parsing-error': 'off',
       	'vue/no-deprecated-v-on-native-modifier': 'off',
       	'vue/multi-word-component-names': 'off',
       	'no-useless-escape': 'off',
       	'no-sparse-arrays': 'off',
       	'no-prototype-builtins': 'off',
       	'no-constant-condition': 'off',
       	'no-use-before-define': 'off',
       	'no-restricted-globals': 'off',
       	'no-restricted-syntax': 'off',
       	'generator-star-spacing': 'off',
       	'no-unreachable': 'off',
       	'no-multiple-template-root': 'off',
       	'no-unused-vars': 'error',
       	'no-v-model-argument': 'off',
       	'no-case-declarations': 'off',
       	// 'no-console': 'error',
       },
    };
    
    • 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
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    .prettierrc.js 文件

    参考阅读:

    module.exports = {
    	printWidth: 150,	// 一行最多多少个字符
    	tabWidth: 2,		// 指定每个缩进级别的空格数
    	useTabs: true,		// 使用制表符而不是空格缩进行
    	semi: true,			// 在语句末尾打印分号
    	singleQuote: true,	// 使用单引号而不是双引号
    	quoteProps: 'as-needed',	// 更改引用对象属性的时间 可选值""
    	jsxSingleQuote: false,		// 在JSX中使用单引号而不是双引号
    	trailingComma: 'es5',		// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none
    	bracketSpacing: true,		// 在对象文字中的括号之间打印空格
    	jsxBracketSameLine: false,	// jsx 标签的反尖括号需要换行
    	arrowParens: 'always',		// 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x
    	rangeStart: 0,				// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
    	rangeEnd: Infinity,
    	requirePragma: false,		// 指定要使用的解析器,不需要写文件开头的 @prettier
    	insertPragma: false,		// 不需要自动在文件开头插入 @prettier
    	proseWrap: 'preserve',		// 使用默认的折行标准 always\never\preserve
    	htmlWhitespaceSensitivity: 'css',	// 指定HTML文件的全局空格敏感度 css\strict\ignore
    	vueIndentScriptAndStyle: fale,		// Vue文件脚本和样式标签缩进
    	endOfLine: 'lf',			// 换行符使用 lf 结尾是 可选值""
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    CPP 核心编程4-重载递增运算符
    Vue原理及源码设计模式
    PowerBI 一些基础功能
    【UE C++】打印输出的两种方式
    【详细图文】Windows下安装RustRover和配置Rust环境
    el-table表格动态设置最大高度 高度根据窗口可视高度大小改变自适应
    低代码核心:代码生成还是模型解释?
    Tableau2019.2 连接MongoDB数据库
    【牛客网-前端笔试题】——Javascript专项练习3
    基于scrapy+flask的疫情数据可视化
  • 原文地址:https://blog.csdn.net/qq_44721831/article/details/125917680