搭建 Vite + Vue 3 + TypeScript 的基础项目模板

简介: 搭建 Vite + Vue 3 + TypeScript 的基础项目模板

前言


Vue 3 发布到现在已经一年多了,目前的版本也到了 3.2.37Vue 相关的周边生态也陆续发布了自己的稳定版本,所以是时候开始学习和使用 Vue 3.0 了。


这里作者也算是炒个冷饭,简单的讲讲自己搭建一个后台管理项目模板的时候遇到的一些问题。


主要内容


  1. Vite 使用与常用配置项


  1. TypeScript 集成


  1. Vue 周边生态:RouterPinia


  1. eslintprettier 代码格式与代码检查


  1. 依赖自动引入与组件库 Naive UI


1. 创建项目


1.1 按步骤选择依赖创建


后面的内容都使用 npm 作为包管理工具,建议使用 vite CLI 直接初始化项目


首先,先在本地找一个“宽敞”的目录,并在该目录下打开命令行( windows 系统可以直接在资源管理器地址栏输入 cmd 进入命令行界面)。


npm init vite@latest
# or
npm create vite@latest
# or
yarn create vite
# or
pnpm create vite


如果没有安装 vitenpm 也会自动下载。


之后则是键入项目名称,并选择相应的库或者框架。


选择 TypeScript,并结束创建过程。


1.2 使用附加命令直接创建


# npm 6.x
npm create vite@latest my-vue-app --template vue-ts
# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue-ts
# yarn
yarn create vite my-vue-app --template vue-ts
# pnpm
pnpm create vite my-vue-app --template vue-ts


Vite 官方文档也提供了多个预设模板,可以通过附加命令 --template 来指定需要使用的模板项目。


当前预设模板有:


  • vanilla


  • vanilla-ts


  • vue


  • vue-ts


  • react


  • react-ts


  • preact


  • preact-ts


  • lit


  • lit-ts


  • svelte


  • svelte-ts


到这里一个基础的 vite + vue + ts 的项目就创建完成了。该项目当前包含以下内容:


如果仅作为个人学习使用,到这里就可以算基本结束了,可以直接使用该项目执行 npm install 下载依赖并启动,进行后续的开发。


📌 Tips:


官方推荐使用 vs code 搭配 volar 插件进行开发。


2. 项目配置


2.1 TypeScript Node 支持


在配置路径别名、进行文件读写等操作时,我们通常为了简化路径都会使用别名,但是直接配置的话 TS 环境无法正确识别 node 相关的包的类型声明,所以需要先配置 nodetypes 依赖。


npm install @types/node -D
# or 
yarn add @types/node -D
# or 
pnpm install @types/node -D


2.2 别名配置


TS 环境配置别名需要修改两个地方:tsconfig.jsonvite.config.ts


tsconfig.json


{
  "compilerOptions": {
    // ...
    "paths": {
      "@/*": ["src/*"]
    }
  }
  // ...
}


tsconfig.json 中的 compilerOptions 内添加 paths 配置,key 为需要增加的别名,value 为别名对应的目录。


别名一般都是配置的文件目录,所以 keyvalue 都需要加上后缀 /*


vite.config.ts


vite.config.ts 配置别名也很简单,只需要增加一个配置项即可。


import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
})


这里注意需要和 tsconfig.json 中的别名配置匹配,只是 key 的末尾不需要添加 /*value 需要用 path 指定对应的文件目录


2.3 开发服务器和代理


本地开发时都需要启动一个 node 服务来预览页面效果,并通过 proxy 代理来访问后端接口。


import { defineConfig } from 'vite'
// ...
export default defineConfig({
    // ...
    // 开发环境服务器的配置都在 server 配置项内
    server: {
        // 指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址,包括局域网和公网地址。
        // 默认为 'localhost',即仅能本机访问
        host: '0.0.0.0',
        // 启动端口
        port: 8080,
        // 设为 true 时若端口已被占用则会直接退出,而不是尝试下一个可用端口。
        strictPort: false,
        // HMR 连接配置(用于 HMR websocket 必须使用不同的 http 服务器地址的情况,或者禁用 hmr 模块),一般省略
        hmr: {
            host: '127.0.0.1',
            port: 8080
        },
        // 参数类型:boolean | string,配置启动时时候自动打开网页,是字符串时表示打开某个特定路径
        open: true,
        // 自定义代理规则,用来配合后端服务进行接口调用等。
        // 默认使用 [http-proxy](https://github.com/http-party/node-http-proxy) 模块,完整配置见官方仓库
        proxy: {
            // 字符串简写写法
            '/foo': 'http://localhost:4567',
            // 选项写法
            '/api': {
                target: 'http://jsonplaceholder.typicode.com',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/api/, '')
            },
            // 正则表达式写法
            '^/fallback/.*': {
                target: 'http://jsonplaceholder.typicode.com',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/fallback/, '')
            },
            // Proxying websockets or socket.io
            '/socket.io': {
                target: 'ws://localhost:3000',
                ws: true
            }
        }
    }
})


详细配置见 Vite - 开发服务器选项


2.4 代码规范与检查


代码规范这部分通常包含两个部分:eslintprettier,并且两者通常会结合使用。eslint 也提供了配合解析 prettier 配置的相关依赖。


配置 prettier


首先,先安装 prettier 相关依赖


然后,创建 prettier.config.js.prettierrc.js,以及忽略检查配置 .prettierignore


// .prettierrc.js
module.exports = {
    // 一行最多 120 字符
    printWidth: 120,
    // 使用 2 个空格缩进
    tabWidth: 2,
    // 不使用 tab 缩进,而使用空格
    useTabs: false,
    // 行尾需要有分号
    semi: true,
    // 使用单引号代替双引号
    singleQuote: true,
    // 对象的 key 仅在必要时用引号
    quoteProps: 'as-needed',
    // jsx 不使用单引号,而使用双引号
    jsxSingleQuote: false,
    // 末尾使用逗号
    trailingComma: 'all',
    // 大括号内的首尾需要空格 { foo: bar }
    bracketSpacing: true,
    // jsx 标签的反尖括号需要换行
    jsxBracketSameLine: false,
    // 箭头函数,只有一个参数的时候,也需要括号
    arrowParens: 'always',
    // 每个文件格式化的范围是文件的全部内容
    rangeStart: 0,
    rangeEnd: Infinity,
    // 不需要写文件开头的 @prettier
    requirePragma: false,
    // 不需要自动在文件开头插入 @prettier
    insertPragma: false,
    // 使用默认的折行标准
    proseWrap: 'preserve',
    // 根据显示样式决定 html 要不要折行
    htmlWhitespaceSensitivity: 'css',
    // 换行符使用 lf
    endOfLine: 'auto'
}
// .prettierignore
node_modules
dist
public


配置 eslint


因为 eslint 不能识别 TypeScript 语法,所以我们要添加对应的 @typescript-eslint/parser 来替换原有解析器;并安装 @typescript-eslint/eslint-plugineslint-plugin-vue 来为 ts 等文件增加对应的语法规则。


并且为了配合 prettier 代码美化规则,还需要安装 eslint-config-prettiereslint-plugin-prettier 来读取 prettier 配置。


npm i eslint -D
npm i eslint-plugin-vue -D
npm i @typescript-eslint/parser -D
npm i @typescript-eslint/eslint-plugin -D
npm i eslint-config-prettier -D
npm i eslint-plugin-prettier -D


也可以直接写到一个安装命令里面,这里只是为了方便阅读。


然后创建配置文件 .eslintrc.js.eslintrc.json,和忽略配置文件 .eslintignore


// .eslintrc.js
module.exports = {
    // parser 代码解析依赖
    parser: 'vue-eslint-parser',
    parserOptions: {
        // 替换原有的代码解析器
        parser: '@typescript-eslint/parser',
        // 声明 es 版本
        ecmaVersion: 2020,
        // 声明源码类型
        sourceType: 'module',
        // 其他语言扩展,包含jsx,全局严格模式等
        ecmaFeatures: {
            jsx: true
        }
    },
    // 继承插件的规则配置
    extends: [
        'plugin:vue/vue3-recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:prettier/recommended',
        'prettier'
    ],
    // 自定义规则配置
    rules: {}
}
// .eslintignore
node_modules/
public/
es/
lib/
dist/
docs/
src/assets/
package.json


2.5 jsx 语法配置


上文 eslint 配置中已经启用了 jsx 检查,并且 vite 官方提供了 vue 对应的 jsx 插件。所以只需要简单配置就可以使用 jsx 或者 tsx 语法。


npm i @vitejs/plugin-vue-jsx -D


然后在 vite.config.js 中启用该插件。


export default defineConfig({
    plugins: [ vue(), vueJsx() ]
})


2.6 引入 pinia 状态管理


piniavuex 一样,作为一个全局状态管理插件,它允许您跨组件/页面共享状态。但是在页面刷新之后依然会丢失状态!所以可以增加引入 pinia-plugin-persistedstate 来进行持久化。


npm i pinia pinia-plugin-persistedstate


然后在 main.ts 中初始化。


import { createApp } from 'vue'
import App from './App'
import router from './router'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
app.use(router)
app.use(pinia)
app.mount('#app')


2.7 依赖自动引入插件


在使用 vue 3 的组合式 api 的时候,页面上通常需要些很多的 import,所以 vuevite 的主要贡献者 Anthony Fu(antfu) 根据 unplugin 编写了几个自动引入插件,这里可以使用 unplugin-auto-importunplugin-vue-components


unplugin-auto-import


为 Vite, Webpack, Rollup 和 esbuild 等提供的自动导入 API 的工具。


npm i unplugin-auto-import -D


因为我们使用的是 vite + ts 的环境,并使用了 eslint,所以我们需要进行一下配置


import AutoImport from 'unplugin-auto-import/vite'
export default defineConfig({
    plugins: [
        AutoImport({
            // 这里使用了 NaiveUI,可以引入以下 4 个函数组件
            imports: [
                'vue',
                'vue-router',
                'pinia',
                {
                    'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar']
                }
            ],
            // 指定引入根目录下的 requests,config,utils 目录内的所有函数
            dirs: ['./src/requests/**', './src/config/**', './src/utils/**'],
            // 指定生成的 d.ts 文件位置与文件名
            dts: './src/auto-imports.d.ts',
            // 配置开启 eslint
            eslintrc: {
                enabled: true
            }
        }),
    ],
})


这里需要对原来的 .eslintrc.js 文件进行修改,增加 unplugin-auto-import 生成的规则文件。


module.exports = {
    extends: [
        './.eslintrc-auto-import.json', // `unplugin-auto-import` 生成的规则配置文件
        // ...
    ]
}


unplugin-vue-components


这个仓库则是自动为 vue 项目按需导入组件的插件,并且可以自定义 Resolver 来配置引入规则。但是,该插件不支持 JsxTsx 语法


该仓库内置了 Ant Design VueArco Design VueElement PlusNaive UIVueUse Components 等 18 个组件库的 Resolver 方法。


npm i unplugin-vue-components -D


然后,在 vite.config.ts 中进行配置。


import { defineConfig } from 'vite'
import Components from 'unplugin-vue-components/vite'
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'
export default defineConfig({
  plugins: [
    Components({
      // 指定组件位置,默认是src/components
      dirs: ['src/components'],
      // 配置文件生成位置
      dts: 'src/components.d.ts',
      resolvers: [NaiveUiResolver()]
    })
  ]
})


结语


到目前为止,这个项目模板还缺少 vue-routeraxios 等基础配置,但是这部分内容大家跟着官方文档基本都可以实现,所以这里不在赘述。


如果是团队开发,这里还需要配置 git 对应的代码提交审核 huskylint-staged 等插件。


但是个人认为,一个团队搭建项目模板,都是大家一起完成,需要综合考虑大家的代码编写习惯以及团队内部的一些开发规范,所以通常都有一个固定的项目模板。本文也仅对刚开始学习和使用 vitevue3 的小伙伴提供一个项目搭建的思路,如有缺陷希望大家多多包涵。


目录
相关文章
|
2月前
|
JavaScript 容器
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
205 2
|
9天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
1月前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
1月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
2月前
|
JavaScript
如何在 Vue 项目中选择合适的模块格式
【10月更文挑战第20天】选择合适的模块格式需要综合考虑多个因素,没有一种绝对正确的选择。需要根据项目的具体情况进行权衡和分析。在实际选择过程中,要保持灵活性,根据项目的发展和变化适时调整模块格式。
24 7
|
1月前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
2月前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
43 6
|
1月前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
2月前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
82 3

热门文章

最新文章