搭建vue3+vant项目架构

打印 上一主题 下一主题

主题 760|帖子 760|积分 2280

git代码仓库,直接下载压缩包使用

1、首先要安装node.js(18.3 或更高版本)

2、创建vue3项目

  1. npm create vue@latest
复制代码
然后按照自己的必要进行选择就行

到此vue3项目创建完成,接下来是搭建项目架构
3、设置Vant (移动端ui)

vue3项目引入vant,按需引入组件
  1. // 引入vant
  2. npm i vant
  3. // 辅助按需引入样式
  4. npm i @vant/auto-import-resolver unplugin-vue-components unplugin-auto-import -D
复制代码
在文件vite.config.js,添加以下代码
  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import AutoImport from 'unplugin-auto-import/vite'
  4. import Components from 'unplugin-vue-components/vite'
  5. import { VantResolver } from '@vant/auto-import-resolver'
  6. export default defineConfig({
  7.   plugins: [
  8.     vue(),
  9.     AutoImport({
  10.       resolvers: [VantResolver()],
  11.     }),
  12.     Components({
  13.       resolvers: [VantResolver()],
  14.     }),
  15.   ]
  16. })
复制代码
使用
vue3中直接在使用的组件,按需引入必要用的组件就行,例如:
  1. // test.vue
  2. <template>
  3.   <van-button type="primary">按钮</van-button>
  4. </template>
复制代码
4、设置环境变量

设置各个环境的设置文件

  1. // 例如在.env.development文件中
  2. NODE_EVN=development  // 环境变量
  3. VITE_BASE_API=http://dev.os-api.vertlet.com // 请求的地址
复制代码
  1. // package.json 文件
  2. "scripts": {
  3.     "dev": "vite --open --mode development",
  4.     "test2": "vite --open --mode test",
  5.     "gray": "vite --open --mode gray",
  6.     "production": "vite --open --mode production",
  7.     "build:gray": "vite build  --mode gray",
  8.     "build:dev": "vite build  --mode development",
  9.     "build:test2": "vite build  --mode test",
  10.     "build:prod": "vite build",
  11.     "preview": "vite preview"
  12.   },
复制代码
5、设置axios请求

  1. // 创建request.ts 文件,封装axios
  2. import axios from 'axios'
  3. import { showToast } from 'vant'
  4. const instance = axios.create({
  5.   baseURL: import.meta.env.VITE_BASE_API,
  6.   timeout: 30000,
  7.   headers: {
  8.     'X-Requested-With': 'XMLHttpRequest',
  9.   },
  10. })
  11. // 请求拦截
  12. instance.interceptors.request.use(
  13.   function (config) {
  14.     const token = localStorage.getItem('token')
  15.     // 在发送请求之前做些什么
  16.     if (token) {
  17.       config.headers['Xl-Os-Token'] = token
  18.     }
  19.     if (config.method == 'get') {
  20.       config.params.from_mobile = 1
  21.     } else {
  22.       config.data.from_mobile = 1
  23.     }
  24.     return config
  25.   },
  26.   function (error) {
  27.     // 对请求错误做些什么
  28.     return Promise.reject(error)
  29.   },
  30. )
  31. // 响应拦截
  32. instance.interceptors.response.use(
  33.   (response) => {
  34.     const { data } = response
  35.     if (data.code === 0) {
  36.       // 请求成功
  37.       return data
  38.     }
  39.     showToast(data.msg)
  40.   },
  41.   function (err) {
  42.     console.log(err)
  43.     return Promise.reject(err)
  44.   },
  45. )
  46. export function GET(url: string, params: object, config?: object) {
  47.   return instance({
  48.     method: 'get',
  49.     url,
  50.     params,
  51.     ...config,
  52.   })
  53. }
  54. export function POST(url: string, data: object, config?: object) {
  55.   return instance({
  56.     method: 'post',
  57.     url,
  58.     data,
  59.     ...config,
  60.   })
  61. }
复制代码
6、pinia使用

界说store
  1. // store/counter.ts
  2. import { ref, computed } from 'vue'
  3. import { defineStore } from 'pinia'
  4. export const useCounterStore = defineStore('counter', () => {
  5.   const count = ref(0)
  6.   const doubleCount = computed(() => count.value * 2)
  7.   function increment() {
  8.     count.value++
  9.   }
  10.   return { count, doubleCount, increment }
  11. })
复制代码
使用store
在必要的vue组件中,引入store
  1. // views/index.vue
  2. <template>
  3.   <p>count:{{ count }}</p>
  4.   <p>doubleCount:{{ doubleCount }}</p>
  5.   <van-button type="primary" @click="increment">anniu</van-button>
  6. </template>
  7. <script setup lang="ts">
  8. // import { getShopGroupList } from '@/service/index'
  9. import { useCounterStore } from '@/stores/counter'
  10. import { storeToRefs } from 'pinia'
  11. const store = useCounterStore()
  12. const { count, doubleCount } = storeToRefs(store)
  13. const { increment } = store
  14. </script>
  15. <style lang="scss" scoped></style>
复制代码
移动端设配问题

使用amfe-flexable,postcss-pxtorem,进行移动端适配;
   amfe-flexable: 是阿里发布的一套可伸缩适配方案。它能根据装备的宽高来设置页面body元素的字体大小,将1rem设置为装备宽度/10以及在页面大小转换时可以重新计算这些数值,但仅限于<style></style>标签里设置的px,对于行内样式和百分比是不生效的。
    postcss-pxtorem是postcss的一个插件,可以将对应的像素单位转换为rem。在vite中可以直接对其进行设置,由于vite已经集成了postcss。
  此中最重要的设置属性为:
  

  • rootValue:根元素的值,即1rem对应的像素值大小。一般设置为计划稿尺寸/10
    以及一些其他属性:
  • propList:必要进行转换的css属性的值,可以使用通配符。如:*意思是将全部属性单位都进行转换;[“position”]会匹配到background-position-y
  • selectorBlackList:不进行单位转换的选择器。如设置为字符串body,则所有含有body字符串的选择器都不会被该插件进行转换;若设置为[/^body$/],则body会被匹配到而不是.body
  • exclude:不必要进行单位转换的文件 mediaQuery:是否允许像素在媒体查询中进行转换
  1. //npm方式
  2. npm install postcss-pxtorem --save-dev
  3. npm install amfe-flexible --save-dev
  4. //pnpm方式
  5. pnpm add postcss-pxtorem -D
  6. pnpm add amfe-flexible -D
复制代码
如果项目用的是ts,还必要安装
  1. npm i --save-dev @types/postcss-pxtorem
复制代码
由于amfe-flexible没有提供类型信息文件,所以必要自己界说一个.d.ts文件;
使用declare关键字来告诉TypeScript编译器存在一个名为amfe-flexible的模块,但是不提供详细的类型信息
  1. // amfe-flexible.d.ts
  2. declare module 'amfe-flexible'
复制代码
  1. // tsconfig.app.json
  2. {
  3.   "extends": "@vue/tsconfig/tsconfig.dom.json",
  4.   "include": [
  5.     "env.d.ts",
  6.     "src/**/*",
  7.     "./auto-imports.d.ts",
  8.     "./components.d.ts",
  9.     "./amfe-flexible.d.ts"
  10.   ],
  11.   "exclude": ["src/**/__tests__/*"],
  12.   "compilerOptions": {
  13.     "composite": true,
  14.     "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
  15.     "allowJs": true,
  16.     "baseUrl": "./",
  17.     "paths": {
  18.       "@/*": ["src/*"]
  19.     }
  20.   }
  21. }
复制代码
  1. // main.js
  2. import 'amfe-flexible'
复制代码
  1. // vite.config.js 配置postcss-pxtorem
  2. import { fileURLToPath, URL } from 'node:url'
  3. import { defineConfig } from 'vite'
  4. import vue from '@vitejs/plugin-vue'
  5. import postCssPxToRem from 'postcss-pxtorem'
  6. // https://vitejs.dev/config/
  7. export default defineConfig({
  8.   plugins: [vue()],
  9.   resolve: {
  10.     alias: {
  11.       '@': fileURLToPath(new URL('./src', import.meta.url))
  12.     }
  13.   },
  14.   css:{
  15.     postcss:{
  16.       plugins:[
  17.         postCssPxToRem({
  18.           rootValue:37.5,
  19.           propList:['*'],
  20.         })
  21.       ]
  22.     }
  23.   }
  24. })
复制代码
引入scss

  1. npm i sass -D
复制代码
  1. // vite.config.ts
  2. export default defineConfig({
  3.   plugins: [
  4. // ...
  5.   css: {
  6.     preprocessorOptions: {
  7.       scss: {
  8.         // 配置全局sass变量注入
  9.         additionalData: '@use "@/styles/variable.scss";',
  10.       },
  11.     },
  12.   },
  13. })
复制代码
添加调试面板VConsole

   vConsole是一个轻量、可拓展、针对手机网页的前端开发者调试面板
  1. npm install vconsole
复制代码
  1. // main.js
  2. import VConsole from 'vconsole';
  3. if (import.meta.env.MODE !== "production") {
  4. // 生产环境不展示
  5.   new VConsole();
  6. }
复制代码
遇到问题

   BUG:在vue文件中导入ts,会出现标红报错:Cannot find module ‘@/service/index’ or
its corresponding type declarations.Vetur(2307)
  解决:在使用vue2的时候,用的插件是vetur;但是vue3推荐使用的是vue-offical。只要切换一下插件就没问题了。
   BUG:设置vant后,由于插件能帮我们自动引入,因此无需手动引入组件,导致ts识别为“Cannot find name
‘showToast’”,如图:

  解决:必要把生成的auto-imports.d.ts和components.d.ts引入tsconfig中,如图


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表