当前位置:   article > 正文

vite+vue3+ts+tsx+ant-design-vue项目框架搭建_vue3+ts+vite+antd

vue3+ts+vite+antd

参与公司项目开发一段时间了,项目用到了很多新的技术(vite,vue3,ts等等),但是框架都是别人搭好的,然后就想说如果是自己的话,会从零搭建一个吗,于是就有了这篇文章。

目录

一、涉及到的相关依赖

二、项目创建

三、项目配置

 3.1、Tsx支持

3.2、路径别名配置

3.3、less配置

3.4、router配置

3.5、vuex配置

3.6、ant-design-vue框架配置使用

3.7、配置eslint


一、涉及到的相关依赖

  1. "dependencies": {
  2. "@ant-design/icons-vue": "^7.0.1",
  3. "ant-design-vue": "^3.2.15",
  4. "vue": "^3.3.8",
  5. "vue-router": "^4.2.5",
  6. "vuex": "^4.1.0"
  7. },
  8. "devDependencies": {
  9. "@types/node": "^20.10.3",
  10. "@typescript-eslint/eslint-plugin": "^6.13.2",
  11. "@typescript-eslint/parser": "^6.13.2",
  12. "@vitejs/plugin-vue": "^4.5.0",
  13. "@vitejs/plugin-vue-jsx": "^3.1.0",
  14. "consola": "^3.2.3",
  15. "eslint": "^8.55.0",
  16. "eslint-config-prettier": "^9.1.0",
  17. "eslint-plugin-prettier": "^5.0.1",
  18. "eslint-plugin-vue": "^9.19.2",
  19. "less": "^4.2.0",
  20. "less-loader": "^11.1.3",
  21. "prettier": "^3.1.0",
  22. "typescript": "^5.2.2",
  23. "vite": "^5.0.0",
  24. "vite-plugin-style-import": "^2.0.0",
  25. "vite-require": "^0.2.3",
  26. "vue-tsc": "^1.8.22"
  27. }

二、项目创建

本人用的node版本是16.10.0的,根据vite官方文档运行如下命令,然后根据提示创建即可:

然后进入项目,安装依赖,就可以直接运行了。

安装完的项目目录结构如下:

  1. │ ├─public # 静态资源目录
  2. │ │ favicon.ico
  3. │ │
  4. │ ├─src
  5. │ │ │ App.vue # 入口vue文件
  6. │ │ │ main.ts # 入口文件
  7. │ │ │ shims-vue.d.ts # vue文件模块声明文件
  8. │ │ │ vite-env.d.ts # vite环境变量声明文件
  9. │ │ │
  10. │ │ ├─assets # 资源文件目录
  11. │ │ │ logo.png
  12. │ │ │
  13. │ │ └─components # 组件文件目录
  14. │ │ HelloWorld.vue
  15. │ │
  16. │ │ .gitignore
  17. │ │ index.html # Vite项目的入口文件
  18. │ │ package.json
  19. │ │ README.md
  20. │ │ tsconfig.json # tsconfig配置文件
  21. │ │ vite.config.ts # vite配置文件

这样的配置显然是不够的,下面就需要我们进行其他的项目配置了。

三、项目配置

 3.1、Tsx支持

首先需要安装官方维护的vite插件@vitejs/plugin-vue-jsx,这个插件其实核心还是@vue/babel-plugin-jsx,只是在这个插件上封装了一层供vite插件调用。vue jsx语法规范

  1. $ npm install @vitejs/plugin-vue-jsx -D
  2. # or
  3. $ yarn add @vitejs/plugin-vue-jsx -D

安装完之后在vite.config.ts进行插件使用,代码如下:

  1. import { defineConfig } from "vite";
  2. import vue from "@vitejs/plugin-vue";
  3. import vueJsx from "@vitejs/plugin-vue-jsx";
  4. export default defineConfig({
  5. plugins: [
  6. vue(),
  7. vueJsx() //插件使用
  8. ],
  9. });

后面就可以把目录中的app.vueHelloWorld.vue以及shims.vue.d.ts这三个文件删除了,因为后面我们就只需要写tsx文件了。

然后src目录下新增App.tsx文件,写入如下代码:

  1. import { defineComponent } from 'vue'
  2. export default defineComponent({
  3. setup() {
  4. return () => {
  5. return (
  6. <div>
  7. <h1>Vue3 + tsx + ts + ant-design-vue</h1>
  8. </div>
  9. )
  10. }
  11. }
  12. })

然后运行npm run dev就可以看到app.tsx中的内容了。

这里做个小优化:一般项目都会有开发环境,测试环境,线上环境等,所以我们可以在项目根目录下新增三个文件:.env.dev,.env.alpha,.env.prod,分别代表上面三个环境,然后在文件中配置各自的端口号和服务地址:

然后在vite.config.ts里做如下配置:

  1. import { defineConfig, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import vueJsx from '@vitejs/plugin-vue-jsx'
  4. // https://vitejs.dev/config/
  5. const envPrefix = ['VITE', 'VUE']
  6. export default defineConfig(({ mode }) => {
  7. const envConfig = loadEnv(mode, process.cwd(), envPrefix)
  8. console.log('envConfig', envConfig)
  9. return {
  10. base: './',
  11. envPrefix: envPrefix,
  12. server: {
  13. port: Number(envConfig.VUE_APP_DEV_PORT),
  14. proxy: {
  15. '/server-api': {
  16. target: envConfig.VUE_APP_SERVER,
  17. changeOrigin: true
  18. }
  19. }
  20. },
  21. define: {
  22. 'process.env': envConfig
  23. },
  24. plugins: [vue(), vueJsx()]
  25. }
  26. })

最后在package.json中增加三条命令:

  1. "scripts": {
  2. "serve:dev": "vite --host --mode dev",
  3. "serve:alpha": "vite --host --mode alpha",
  4. "serve:prod": "vite --host --mode prod",
  5. },

然后就可以通过运行对应命令,在本地快速启动并代理到各自的环境,而不用每次修改服务地址。

3.2、路径别名配置

路径别名同样需要在vite.config.ts中配置,此时具体配置如下:

  1. import { resolve } from 'path' // 此处如果报错则安装 node/path依赖
  2. import { defineConfig, loadEnv } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import vueJsx from '@vitejs/plugin-vue-jsx'
  5. // https://vitejs.dev/config/
  6. const envPrefix = ['VITE', 'VUE']
  7. export default defineConfig(({ mode }) => {
  8. const envConfig = loadEnv(mode, process.cwd(), envPrefix)
  9. console.log('envConfig', envConfig)
  10. return {
  11. base: './',
  12. envPrefix: envPrefix,
  13. server: {
  14. port: Number(envConfig.VUE_APP_DEV_PORT),
  15. proxy: {
  16. '/server-api': {
  17. target: envConfig.VUE_APP_SERVER,
  18. changeOrigin: true
  19. }
  20. }
  21. },
  22. resolve: {
  23. alias: [
  24. { find: '@', replacement: resolve(__dirname, 'src') },
  25. { find: /^~/, replacement: '' }
  26. ]
  27. },
  28. define: {
  29. 'process.env': envConfig
  30. },
  31. plugins: [vue(), vueJsx()]
  32. }
  33. })

此时在项目中就可以直接使用新的路径别名了,使用vscode可能会没有路径提示,这个时候只需要在jsconfig.json/tsconfig.json配置pathsbaseUrl就会出现路径提示了,具体如下:

  1. {
  2. "compilerOptions": {
  3. // ...
  4. "baseUrl": ".",
  5. "paths": {
  6. "@/*": ["src/*"],
  7. },
  8. // ...
  9. }

3.3、less配置

Vite 提供了对 .scss.sass.less.styl 和 .stylus 文件的内置支持。因此没有必要为它们安装特定的 Vite 插件,但必须安装相应的预处理器依赖,依赖安装完项目就可以直接解析less文件了。

  1. $ npm install less less-loader -D
  2. # or
  3. $ yarn add less less-loader -D

注意这里有个坑,less 和 less-loader 需要写到 devDependencies 里面,否则运行会报错。

使用:

可以在tsx文件下新建index.module.less文件然后tsx页面中引入直接使用,如下:

  1. .page_title {
  2. font-size: 16px;
  3. color: pink;
  4. }

3.4、router配置

请注意,路由一定得安装4.0.0以上版本,最好直接安装当前最新版本。

查看 vue-router 版本:

$ npm info vue-router versions

安装最新版本:

  1. $ npm install vue-router@4.2.5
  2. # or
  3. $ yarn add vue-router@4.2.5

然后在src下新建router和view等文件和文件夹

在router文件夹下的index.ts配置对应路由:

  1. import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
  2. const routes: RouteRecordRaw[] = [
  3. {
  4. path: '/',
  5. name: 'Home',
  6. component: () => import('@/views/home'),
  7. meta: {
  8. title: '首页'
  9. }
  10. },
  11. {
  12. path: '/user',
  13. name: 'User',
  14. component: () => import('@/views/user'),
  15. meta: {
  16. title: '个人中心'
  17. }
  18. }
  19. ]
  20. const router = createRouter({
  21. history: createWebHistory('/'),
  22. routes: routes,
  23. scrollBehavior(to, from, savedPosition) {
  24. // 始终滚动到顶部
  25. console.log(to, from, savedPosition)
  26. return { top: 0 }
  27. }
  28. })
  29. export default router as typeof router & { refresh?: () => string }

接着在main.ts这个入口文件中插件的方式通过vue引入就可以了

  1. import { createApp } from 'vue'
  2. import './style.css'
  3. import router from './router'
  4. import App from './App'
  5. createApp(App).use(router).mount('#app')

 最后在app.tsx中引入ruter-view进行如下配置:

  1. import { defineComponent } from 'vue'
  2. import { RouterView, RouterLink } from 'vue-router'
  3. export default defineComponent({
  4. setup() {
  5. return () => {
  6. return (
  7. <div>
  8. <h1>Vue3 + tsx + ts + ant-design-vue</h1>
  9. <div>
  10. <RouterLink to={'/'} style={{ marginRight: '20px' }}>
  11. 首页
  12. </RouterLink>
  13. <RouterLink to={'/user'}>用户中心</RouterLink>
  14. </div>
  15. <RouterView />
  16. </div>
  17. )
  18. }
  19. }
  20. })

从新运行项目就可以使用路由跳转切换页面了

3.5、vuex配置

请注意,vuex也得安装4.0.0及以上版本,最好直接安装当前最新版本。跟上面router一样查看下最新版本,然后直接安装:

  1. $ npm install vuex@4.1.0
  2. # or
  3. $ yarn add vuex@4.1.0

创建目录结构:

代码如下:

system.ts

  1. import { Module } from 'vuex'
  2. export interface SystemState {
  3. showLogin: boolean
  4. }
  5. export const system: Module<SystemState, any> = {
  6. state: {
  7. showLogin: false
  8. },
  9. getters: {
  10. getLoginVisible(state) {
  11. return state.showLogin
  12. }
  13. },
  14. mutations: {
  15. SET_SHOW_LOGIN(state, visible) {
  16. state.showLogin = visible
  17. }
  18. },
  19. actions: {
  20. showLoginAction({ commit }, visible) {
  21. commit('SET_SHOW_LOGIN', visible)
  22. }
  23. }
  24. }

user.ts

  1. import { Module } from 'vuex'
  2. interface UserInfoProperties {
  3. username: string
  4. age: number
  5. }
  6. export interface UserState {
  7. userInfo: UserInfoProperties
  8. }
  9. export const user: Module<UserState, any> = {
  10. state: {
  11. userInfo: {
  12. username: 'helen',
  13. age: 32
  14. }
  15. }
  16. }

index.ts

  1. import { createStore, useStore as useRawStore } from 'vuex'
  2. import { user, UserState } from './modules/user'
  3. import { system, SystemState } from './modules/system'
  4. export interface StoreState {
  5. user: UserState
  6. system: SystemState
  7. }
  8. export const STORE_KEY = 'store'
  9. const store = createStore<StoreState>({
  10. modules: {
  11. user,
  12. system
  13. },
  14. plugins: []
  15. })
  16. export function useStore() {
  17. return useRawStore(STORE_KEY) as typeof store
  18. }
  19. export default store

然后在main.ts中引入:

  1. import { createApp } from 'vue'
  2. import './style.css'
  3. import router from './router'
  4. import App from './App'
  5. import store, { STORE_KEY } from './store'
  6. createApp(App).use(store, STORE_KEY).use(router).mount('#app')

最后就可以在页面中直接引入使用了:

遇到的问题:

1、引入使用vuex时报错:无法找到模块声明文件vuex 

解决方法:在vite.env.d.ts里面声明vuex导出其声明文件路径

  1. declare module 'vuex' {
  2. export * from 'vuex/types/index.d.ts'
  3. export * from 'vuex/types/helpers.d.ts'
  4. export * from 'vuex/types/logger.d.ts'
  5. export * from 'vuex/types/vue.d.ts'
  6. }

3.6、ant-design-vue框架配置使用

安装框架和图标库

  1. $ npm install ant-desing-vue @ant-design/icons-vue -D
  2. # or
  3. $ yarn add ant-design-vue @ant-design/icons-vue -D

安装vite样式引入插件

  1. $ npm install vite-plugin-style-import -D
  2. # or
  3. $ yarn add vite-plugin-style-import -D

在vite.config.ts中进行配置

  1. import { resolve } from 'path' // 此处如果报错则安装 node/path依赖
  2. import { defineConfig, loadEnv } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import vueJsx from '@vitejs/plugin-vue-jsx'
  5. import { viteRequire } from 'vite-require'
  6. import { createStyleImportPlugin, AndDesignVueResolve } from 'vite-plugin-style-import'
  7. // https://vitejs.dev/config/
  8. const envPrefix = ['VITE', 'VUE']
  9. export default defineConfig(({ mode }) => {
  10. const envConfig = loadEnv(mode, process.cwd(), envPrefix)
  11. console.log('envConfig', envConfig)
  12. return {
  13. base: './',
  14. envPrefix: envPrefix,
  15. server: {
  16. port: Number(envConfig.VUE_APP_DEV_PORT),
  17. proxy: {
  18. '/server-api': {
  19. target: envConfig.VUE_APP_SERVER,
  20. changeOrigin: true
  21. }
  22. }
  23. },
  24. // 依赖优化-预构建
  25. optimizeDeps: {
  26. include: ['vue', 'vuex', 'vue-router', 'ant-design-vue', '@ant-desgin/icons-vue']
  27. },
  28. resolve: {
  29. alias: [
  30. { find: '@', replacement: resolve(__dirname, 'src') },
  31. { find: /^~/, replacement: '' }
  32. ]
  33. },
  34. define: {
  35. 'process.env': envConfig
  36. },
  37. css: {
  38. preprocessorOptions: {
  39. less: {
  40. javascriptEnabled: true
  41. }
  42. }
  43. },
  44. plugins: [
  45. vue(),
  46. vueJsx(),
  47. // 兼容vite不支持require
  48. viteRequire(),
  49. createStyleImportPlugin({
  50. resolves: [AndDesignVueResolve()]
  51. })
  52. ]
  53. }
  54. })

然后就可以在home的index.tsx页面中引入使用了:

  1. import { defineComponent } from 'vue'
  2. import { useStore } from '@/store'
  3. import { Button } from 'ant-design-vue'
  4. import { RightOutlined } from '@ant-design/icons-vue'
  5. import classes from './index.module.less'
  6. export default defineComponent({
  7. name: 'Home',
  8. setup() {
  9. const store = useStore()
  10. console.log(store, 'store')
  11. return () => {
  12. return (
  13. <>
  14. <div class={classes.page_title}>
  15. home page
  16. <RightOutlined />
  17. </div>
  18. <Button type="primary" onClick={() => console.log('aa')}>
  19. ant-design-vue Button
  20. </Button>
  21. </>
  22. )
  23. }
  24. }
  25. })

遇到问题: 

1、引入antd-design-vue组件后点击按钮报错Uncaught TypeError: Cannot read properties of undefined (reading ‘value‘)

解决方法:看博客说是vue3.2.13和antd4.0.7版本不兼容,然后就把4换成3了;antd换成3的后运行又报错了,原来按需加载样式vite-plugin-style-import配置后,还要在vite.cofing.ts里面配置css

  1. css: {
  2. preprocessorOptions: {
  3. less: {
  4. javascriptEnabled: true
  5. }
  6. }
  7. },

3.7、配置eslint

增加eslint用来规范Typescript以及vue代码,首先安装相关依赖:

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

这三个依赖的作用分别是:

  • eslint: ESLint的核心代码
  • eslint-plugin-vue:ESLint关于检测vue代码规范的插件
  • @typescript-eslint/parser:ESLint的解析器,用于解析typescript,从而检查和规范Typescript代码
  • @typescript-eslint/eslint-plugin:这是一个ESLint插件,包含了各类定义好的检测Typescript代码的规范

结合Prettier和Eslint

npm i prettier eslint-config-prettier eslint-plugin-prettier -D

其中:

  • prettier:prettier插件的核心代码
  • eslint-config-prettier:解决ESLint中的样式规范和prettier中样式规范的冲突,以prettier的样式规范为准,使ESLint中的样式规范自动失效
  • eslint-plugin-prettier:将prettier作为ESLint规范来使用

依赖装好之后便可以开始相关文件的配置工作了,首先在项目根目录新增.eslintrc.js文件

这个地方遇到了一个坑,如果eslint-config-prettier版本号在8.0.0以上,则在.eslintrc.js配置extends中不需要再新增 'prettier/@typescript-eslint' 这个配置,否则执

行eslint会报错

  1. module.exports = {
  2. parser: 'vue-eslint-parser',
  3. parserOptions: {
  4. parser: '@typescript-eslint/parser', // Specifies the ESLint parser
  5. ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
  6. sourceType: 'module', // Allows for the use of imports
  7. ecmaFeatures: {
  8. // Allows for the parsing of JSX
  9. jsx: true
  10. }
  11. },
  12. extends: [
  13. 'plugin:vue/vue3-recommended',
  14. 'plugin:@typescript-eslint/recommended',
  15. 'plugin:prettier/recommended'
  16. ],
  17. rules: {
  18. '@typescript-eslint/no-explicit-any': 'off',
  19. 'vue/multi-word-component-names': 'off',
  20. }
  21. }

紧接着增加prettier配置,再在项目根目录中新增.prettierrc.js文件

  1. // 具体配置可以参考 https://prettier.io/docs/en/options.html
  2. const base = {
  3. printWidth: 100,
  4. tabWidth: 2,
  5. useTabs: false,
  6. semi: false, // 未尾逗号
  7. vueIndentScriptAndStyle: true,
  8. singleQuote: true, // 单引号
  9. quoteProps: 'as-needed',
  10. bracketSpacing: true,
  11. trailingComma: 'none', // 未尾分号
  12. jsxBracketSameLine: false,
  13. jsxSingleQuote: false,
  14. arrowParens: 'always',
  15. insertPragma: false,
  16. requirePragma: false,
  17. proseWrap: 'preserve',
  18. htmlWhitespaceSensitivity: 'strict',
  19. endOfLine: 'auto',
  20. embeddedLanguageFormatting: 'auto',
  21. }
  22. module.exports = {
  23. ...base,
  24. overrides: [
  25. {
  26. files: ['*.js', '*.jsx', '*.mjs', '*.ts', '*.tsx'],
  27. options: base
  28. },
  29. {
  30. files: ['*.vue'],
  31. options: base
  32. },
  33. {
  34. files: '*.md',
  35. options: {
  36. ...base,
  37. tabWidth: 4,
  38. proseWrap: 'never'
  39. }
  40. }
  41. ]
  42. };

做到这里,eslint除了脚本配置之外就配置完成了,现在只需在package.json中配置好脚本命令就完成了整个eslint的配置工作了。

  1. {
  2. ...
  3. "scripts": {
  4. "dev": "vite",
  5. "build": "vue-tsc --noEmit --skipLibCheck && vite build", // 增加skipLibCheck可以跳过引入库的ts检查
  6. "serve": "vite preview",
  7. "lint": "eslint src",
  8. "lint:fix": "eslint src --fix --ext .ts,.tsx"
  9. },
  10. }

 遇到的问题:

1、运行 npm run lint的时候直接报错了:[ERR_REQUIRE_ESM]: require() of ES Module,

解决方法:把.eslintrc.js后缀改成cjs;

2、从新运行又报错:ReferenceError: module is not defined in ES module scope This file is being;

解决方法:把package.json的type去掉;方案参考https://www.cnblogs.com/tudou1179006580/p/17698047.html

从新执行npm run lint

发现app.tsx有个错误,执行npm run lint:fix修复错误后就可以提交代码了。

这样一个项目框架就搭建好了:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/320659
推荐阅读
相关标签
  

闽ICP备14008679号