uni-app项目搭建(ts+Vue3+pinia+vite)

2024年8月3日
本文为搭建uni-app项目教程,内容有ts+Vue3+vite项目结构创建、pinia持久化存储、ESLint代码检查。成品项目地址如下

https://gitee.com/hong_23/uni-app-project-da-jian.git
  • typescript:4.9.4
  • vue:3.4.21
  • pinia:2.2.0
  • vite:5.2.8
  • node:20.1.1

1. 创建uni-app+ts+vite项目

uni-app官网:https://uniapp.dcloud.net.cn/quickstart-cli.html

创建以 typescript 开发的工程

npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project

若创建失败,直接访问gitee下载模版

https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite.zip

下载完成后安装依赖

npm install

2. pinia配置

安装pinia@2.2.0

pinia官网:https://pinia.vuejs.org/zh/getting-started.html

npm install pinia@2.2.0

如果安装出现报错比如说:Pinia 依赖的 @vue/composition-api 要求 Vue 的版本在 “>= 2.5 < 2.7” 范围内,但实际上你的项目使用的是 Vue 3。对于@vue/composition-api是Vue2版本提供组合式API的插件,Vue3不需要所以碰到这个问题直接强制安装pinia

npm install pinia@2.2.0 --force

安装成功后可用以下命令进行检查,没问题即可下一步

npm list pinia@2.2.0

初始化pinia:在main.ts引入

import { createSSRApp } from 'vue'
import { createPinia } from 'pinia'//引入第一点
import App from './App.vue'

export function createApp () {
  const app = createSSRApp(App).use(createPinia())//引入第二点
  return {
    app
  }
}

定义Store:src目录下创建一个stores目录,然后创建一个counter.ts文件,内容为

import {ref} from 'vue'
import { defineStore } from 'pinia'

export const useCounterStore=defineStore('counter',()=>{
    //响应式数据
    const count=ref(0)
    
    //定义方法
    function incerment(){
        count.value++;
    }
    function decerment(){
        count.value--;
    }
    
    //外部可访问
    return{
        count,
        incerment,
        decerment
    }
})  

测试刚刚定义的store是否可用:

  1. 首先在pages目录下创建一个test目录,然后再test目录下创建一个test.vue,然后导入以下代码
<template>
  <view class="counter">
    <button class="button" @click="store.decerment" type="primary">-</button>
    <input class="input" v-model="store.count" type="text"/>
    <button class="button" @click="store.incerment" type="primary" >+</button>
  </view>
</template>

<script setup>
import { useCounterStore } from '../../stores/counter';
const store=useCounterStore();
console.log(store)
</script>
 
<style scoped>
.counter {
  display: flex;
  padding: 100rpx;
}
 
.input {
  flex: 1;
  height: 96rpx;
  text-align: center;
  border: 2rpx solid #eee;
  box-sizing: border-box;
}
 
.button {
  width: 100rpx;
  margin: 0;
 
  &:first-child {
    border-start-end-radius: 0;
    border-end-end-radius: 0;
  }
 
  &:last-child {
    border-start-start-radius: 0;
    border-end-start-radius: 0;
  }
}
</style>
  1. 更新pages.json页面配置
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
                {
                        "path": "pages/index/index",
                        "style": {
                                "navigationBarTitleText": "uni-app"
                        }
                },
                //更新的页面
                {
                        "path": "pages/test/test",
                        "style": {
                                "navigationBarTitleText": "uni-app"
                        }
                }
        ],
  1. 之后启动项目在浏览器调到测试页面,就是在原有网址加上
test/test
  1. 可看到页面有俩个按钮,点击俩个按钮中间的数字会改变则配置pinia成功。

持久化存储

https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/

虽然说pinia存储的数据,在切换页面后也不会丢失,但是刷新项目后,数据就会丢失。为了可以持久化存储,可使用pinia-plugin-persistedstate插件,存储在浏览器的storage中

  1. 安装pinia-plugin-persistedstate
npm install pinia-plugin-persistedstate
  1. 将插件添加到pinia实例上
import { createPinia} from 'pinia'
import piniapluginPersistedstate from 'pinia-plugin-persistedstate'

export function createApp() {
  //创建pinia实例
  const pinia=createPinia();
  //pinia使用插件
  pinia.use(piniapluginPersistedstate);
  //挂载到app上
  const app = createSSRApp(App).use(pinia);
   return {
    app,
  };
}
  1. 最后给store加上第三个参数即可完成持久化存储
{
    //网页端
    persist:true
    
    //小程序端
    persist: {
      storage: {
        getItem(key) {
          return uni.getStorageSync(key)
        },
        setItem(key, value) {
          uni.setStorageSync(key, value)
        },
      },
    },
}

5. ESLint代码检查

https://eslint.nodejs.cn/docs/latest/use/configure/configuration-files

  1. 安装
npm i @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-import eslint-plugin-prettier eslint-plugin-vue vue-eslint-parser -D
  1. 在根目录下新键.eslintrc.js文件,内容如下
// .eslintrc.js
module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
    es6: true
  },
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaVersion: 2020,
    sourceType: 'module',
    jsxPragma: 'React',
    ecmaFeatures: {
      jsx: true,
      tsx: true
    }
  },
  plugins: ['@typescript-eslint', 'prettier', 'import'],
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:vue/vue3-recommended',
    'prettier'
  ],
  overrides: [
    {
      files: ['*.ts', '*.tsx', '*.vue'],
      rules: {
        'no-undef': 'off'
      }
    }
  ],
  rules: {
    'no-unused-vars': ['error', { varsIgnorePattern: '.*', args: 'none' }],
    '@typescript-eslint/no-unused-vars': 'off',
    'vue/component-name-in-template-casing': [
      'error',
      'kebab-case',
      {
        registeredComponentsOnly: false,
        ignores: []
      }
    ],
    'vue/prop-name-casing': ['error', 'camelCase'],
    'vue/require-v-for-key': 'error',
    'vue/no-use-v-if-with-v-for': [
      'error',
      {
        allowUsingIterationVar: false
      }
    ],
    'vue/v-bind-style': ['error', 'shorthand'],
    'vue/v-on-style': ['error', 'shorthand'],
    'no-useless-escape': 0
  }
}
  1. 在根目录创建ESLint忽略文件.eslintignore
node_modules
dist
*.md
*.woff
*.ttf
.vscode
.idea
  1. 在根目录创建 .prettierrc 文件
{
  "useTabs": false,
  "tabWidth": 2,
  "printWidth": 80,
  "singleQuote": true,
  "trailingComma": "none",
  "semi": false,
  "endOfLine": "auto"
}
  1. 在根目录创建 .prettierignore 文件
**/*.svg
**/*.ico
package.json
package-lock.json
/dist
.DS_Store
.eslintignore
*.png
.editorconfig
.gitignore
.prettierignore
.eslintcache
*.lock
yarn-error.log
**/node_modules/**

插件推荐

在这里插入图片描述

项目配置信息

"dependencies": {
"@dcloudio/uni-app": "3.0.0-4020420240722002",
"@dcloudio/uni-app-harmony": "3.0.0-4020420240722002",
"@dcloudio/uni-app-plus": "3.0.0-4020420240722002",
"@dcloudio/uni-components": "3.0.0-4020420240722002",
"@dcloudio/uni-h5": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-alipay": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-baidu": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-jd": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-kuaishou": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-lark": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-qq": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-toutiao": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-weixin": "3.0.0-4020420240722002",
"@dcloudio/uni-mp-xhs": "3.0.0-4020420240722002",
"@dcloudio/uni-quickapp-webview": "3.0.0-4020420240722002",
"pinia": "^2.2.0",
"pinia-plugin-persistedstate": "^3.2.1",
"vue": "^3.4.21",
"vue-i18n": "^9.1.9"
},
"devDependencies": {
"@dcloudio/types": "^3.4.8",
"@dcloudio/uni-automator": "3.0.0-4020420240722002",
"@dcloudio/uni-cli-shared": "3.0.0-4020420240722002",
"@dcloudio/uni-stacktracey": "3.0.0-4020420240722002",
"@dcloudio/vite-plugin-uni": "3.0.0-4020420240722002",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"@vue/runtime-core": "^3.4.21",
"@vue/tsconfig": "^0.1.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.27.0",
"typescript": "^4.9.4",
"vite": "5.2.8",
"vue-eslint-parser": "^9.4.3",
"vue-tsc": "^1.0.24"
}
对于使用 Vite + Vue3 + TypeScript + Pinia + Vue Router + Axios + SCSS 并自动导入 API 的设置,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了 Node.js,并且版本大于等于 12.0.0。 2. 创建一个新的 Vue 项目,可以使用 Vue CLI 或者手动创建一个空文件夹。 3. 在项目根目录下,打开终端并执行以下命令安装 Vite: ```bash npm init vite@latest ``` 按照提示选择你的项目配置,包括选择 Vue 3、TypeScript 和其他选项。 4. 进入项目目录并安装依赖: ```bash cd your-project-name npm install ``` 5. 安装 Pinia 插件: ```bash npm install pinia ``` 6. 创建一个 `src/store` 目录,并在其中创建 `index.ts` 文件,用于定义和导出你的 Pinia store。 ```typescript // src/store/index.ts import { createPinia } from &#39;pinia&#39; export const store = createPinia() // 可以在这里定义你的 store 模块 ``` 7. 在项目根目录下创建 `src/api` 目录,用于存放 API 请求相关的文件。 8. 在 `src/api` 目录下创建一个 `index.ts` 文件,用于自动导入所有 API 文件。 ```typescript // src/api/index.ts const modules = import.meta.globEager(&#39;./*.ts&#39;) const apis: any = {} for (const path in modules) { if (path !== &#39;./index.ts&#39;) { const moduleName = path.replace(/^.\/|\.ts$/g, &#39;&#39;) apis[moduleName] = modules[path].default } } export default apis ``` 这样,你就可以在 `src/api` 目录下创建各种 API 请求的文件,例如 `user.ts`: ```typescript // src/api/user.ts import axios from &#39;axios&#39; export function getUser(id: number) { return axios.get(`/api/user/${id}`) } ``` 然后,在你的组件中使用自动导入的 API: ```typescript import { defineComponent, ref } from &#39;vue&#39; import { useUserStore } from &#39;@/store&#39; import apis from &#39;@/api&#39; export default defineComponent({ setup() { const userStore = useUserStore() const userId = ref(1) const fetchUser = async () => { const response = await apis.user.getUser(userId.value) userStore.setUser(response.data) } return { userId, fetchUser, } }, }) ``` 以上就是使用 Vite + Vue3 + TypeScript + Pinia + Vue Router + Axios + SCSS 并自动导入 API 的基本设置。你可以根据自己的需求进一步配置和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跑得动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值