vue3.2+vite+vant4+sass搭建笔记

这篇具有很好参考价值的文章主要介绍了vue3.2+vite+vant4+sass搭建笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、确定node版本

1、下载nvm安装包

官方下载地址:https://github.com/coreybutler/nvm-windows/releases

vue3.2+vite+vant4+sass搭建笔记

双击安装 

 vue3.2+vite+vant4+sass搭建笔记

vue3.2+vite+vant4+sass搭建笔记 

 vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

 2、在node官网下载安装多个node

3、切换node

vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

2、创建项目 

 1、安装依赖

pnpm i

2、启动项目

npm run dev

vue3.2+vite+vant4+sass搭建笔记

 vue3.2+vite+vant4+sass搭建笔记

3、配置@指向src 

import { defineConfig,loadEnv  } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
const resolve = (dir) => path.resolve(__dirname, dir);

// https://vitejs.dev/config/
export default defineConfig(({mode})=>{
   // 获取当前环境的配置
   const config = loadEnv(mode, './')
   return {
    plugins: [vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    resolve: {
      alias: {
        '@': resolve('src'),//作为 entries 的选项
      },
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    },
   }
 
})

3、安装vant4 

1、安装

pnpm add vant

vue3.2+vite+vant4+sass搭建笔记

 2、按需引入

pnpm add unplugin-vue-components -D

vue3.2+vite+vant4+sass搭建笔记

 3、配置插件

在 vite.config.js 文件中配置插件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    Components({
      resolvers: [VantResolver()],
    }),
  ],
  
})

4、使用组件

<van-button type="primary" >默认按钮</van-button>

vue3.2+vite+vant4+sass搭建笔记

 tips:函数组件样式有异常,在main.js中引入vant样式

import "vant/lib/index.css"

5、rem布局适配

1、安装插件

  • postcss-pxtorem 是一款 PostCSS 插件,用于将 px 单位转化为 rem 单位
  • lib-flexible 用于设置 rem 基准值
pnpm install postcss postcss-pxtorem --save-dev
pnpm i -S amfe-flexible

vue3.2+vite+vant4+sass搭建笔记 

 2、PostCSS 示例配置:新建postcss.config.js

// postcss.config.js
module.exports = {
  plugins: {
    // postcss-pxtorem 插件的版本需要 >= 5.0.0
    'postcss-pxtorem': {
      rootValue({ file }) {
        return file.indexOf('vant') !== -1 ? 37.5 : 75;
      },
      propList: ['*'],
    },
  },
};

3、在main.js中引入 amfe-flexible

import 'amfe-flexible'

重启项目报错

vue3.2+vite+vant4+sass搭建笔记

 修改文件名后缀.cjs, postcss.config.cjs,重启项目即可

vue3.2+vite+vant4+sass搭建笔记

 

4、使用sass

1、安装

pnpm install --save-dev sass

vue3.2+vite+vant4+sass搭建笔记

2、新建src/styles文件夹下index.scss,定义默认颜色变量

$defaultColor:#1989fa;

3、vite配置

import { defineConfig,loadEnv  } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
const resolve = (dir) => path.resolve(__dirname, dir);

// https://vitejs.dev/config/
export default defineConfig(({mode})=>{
   // 获取当前环境的配置
   const config = loadEnv(mode, './')
   return {
    plugins: [vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    css:{
      preprocessorOptions: {
        scss: {
          additionalData: ` @import "@/styles/index.scss";   `
        }
      }
    },
    resolve: {
      alias: {
        '@': resolve('src'),//作为 entries 的选项
      },
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    },
   }
 
})

4、使用scss变量

<script setup>
</script>

<template>
  <div>
    <van-button type="primary" >默认按钮</van-button>
    <div class="test">测试字体大小</div>
  </div>
</template>

<style scoped lang="scss">
.test{
  font-size: 40px;
  color: $defaultColor;
}
</style>

vue3.2+vite+vant4+sass搭建笔记

 5、配置环境变量

1、新建 .env.development、.env.production文件

.env.development内容如下文章来源地址https://www.toymoban.com/news/detail-434608.html

VITE_APP_BASE_URL='/api'
#VITE_APP_BASE_URL='http://192.168.1.33:8088'

2、使用环境变量vite.config.js

import { defineConfig,loadEnv  } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
const resolve = (dir) => path.resolve(__dirname, dir);

// https://vitejs.dev/config/
export default defineConfig(({mode})=>{
   // 获取当前环境的配置
   const config = loadEnv(mode, './')
   return {
    plugins: [vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    css:{
      preprocessorOptions: {
        scss: {
          additionalData: ` @import "@/styles/index.scss";   `
        }
      }
    },
    server: {
      proxy: {
        '/api': {
          // target: "http://192.168.1.33:8088",
          target: config.VITE_APP_BASE_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, '')
        }
      }
   },
    resolve: {
      alias: {
        '@': resolve('src'),//作为 entries 的选项
      },
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    },
   }
 
})

6、vite配置跨域  

import { defineConfig,loadEnv  } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
const resolve = (dir) => path.resolve(__dirname, dir);

// https://vitejs.dev/config/
export default defineConfig(({mode})=>{
   // 获取当前环境的配置
   const config = loadEnv(mode, './')
   return {
    plugins: [vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    css:{
      preprocessorOptions: {
        scss: {
          additionalData: ` @import "@/styles/index.scss";   `
        }
      }
    },
    server: {
      proxy: {
        '/api': {
          // target: "http://192.168.1.33:8088",
          target: config.VITE_APP_BASE_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, '')
        }
      }
   },
    resolve: {
      alias: {
        '@': resolve('src'),//作为 entries 的选项
      },
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    },
   }
 
})

7、请求响应加密sm-crypto

1、安装

pnpm i sm-crypto --save

2、新建config/index.js,配置加密解密公钥私钥

export const PUBLICKEY='****************************************'
export const PRIVATEKEY='**************************'

3、新建utils/crypto.js,封装加密解密方法

import { sm2 } from 'sm-crypto';
import {PUBLICKEY,PRIVATEKEY} from '@/config/index'
//加密
export function doEncrypt(msgString) {
    let msg = msgString
    if (typeof msgString !== 'string') {
      msg = JSON.stringify(msgString)
    }
    // console.log(msg,'加密前')
    // 1 - C1C3C2;	0 - C1C2C3;	默认为1
    let cipherMode = 0
    let publicKey = PUBLICKEY
    // 加密结果
    let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode)
    //Base64编码 自行选择是否使用
    //let baseEncode = Base64.encode(encryptData)
    // 加密后的密文前需要添加04,后端才能正常解密 (不添加04,后端处理也可以)
    let encrypt = '04' + encryptData
    return encrypt
}


// 解密
export function doDecryptStr(enStr) {
    let msg = enStr
    if (typeof enStr !== 'string') {
      msg = JSON.stringify(enStr)
   }
    // 1 - C1C3C2;	0 - C1C2C3;  默认为1
    let cipherMode = 0
    let privateKey = PRIVATEKEY
    let enval = enStr.substring(2)
    // 解密结果
    let doDecrypt = sm2.doDecrypt(enval , privateKey, cipherMode)
    // 解密后类型转换
    let objData = JSON.parse(doDecrypt)
    return objData
 
}

8、封装axios

1、安装axios、qs

pnpm i axios qs --save

2、新建utils/request.js,后台是.net,要求传参formData格式

import axios from 'axios'; // 引入axios
import qs from 'qs'
import { showToast,showLoadingToast,showFailToast, closeToast } from 'vant';
import {doEncrypt,doDecryptStr} from './crypto'
let toast=null
// 创建时自定义默认配置,超时设置为全局默认值0秒
let service = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_URL, // url = base url + request url
    // withCredentials: true, // send cookies when cross-domain requests
    timeout: 50000 ,// request timeout
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Content-Type': 'application/x-www-form-urlencoded'
    //   'Content-Type': 'application/json'
    }
  })
  // 请拦截
  service.interceptors.request.use(
    config => {
      //loading
      toast=showLoadingToast({
      
        
        forbidClick: true,
        loadingType: 'spinner',
        message: '加载中',
      });
      let token = localStorage.getItem('token')
      if (token) {
        config.headers['token'] = token
      }
    //    console.log(config.data,'加密前参数')
       config.data=qs.stringify({json:doEncrypt(config.data)});
    //    console.log(config.data,'加密后参数')
      return config
    },
    error => {
      // do something with request error
      closeToast()//清除loading
      console.log(error) // for debug
      return Promise.reject(error)
    }
  )
  
  // 响应拦截
  service.interceptors.response.use(
    response => {
      closeToast()//清除loading
    //   console.log('response',response);
      let {data} = response
      if(data.Status!==1) return showFailToast(data.Msg);
      return doDecryptStr(data.Data)
    },
    error => {
      console.log('err' + error) // for debug
      showFailToast(error || "请求失败");
      // return Promise.reject(error)
    }
  )
  
  export default service

9、api集中管理

1、新建api文件夹,新建user.js

import request from '@/utils/request'
export function loginApi(data) {
  return request({
     url: '/login.asmx/UserLogin',
    method: 'post',
    data,
  })
}

2、页面调用

import {loginApi} from '@/api/user.js'
const login = async ()=>{
    let res = await loginApi({
        Account:"admin",
        Pwd:"0000"
    })
    console.log(res,'返回结果')
}
login()

10、安装路由

1、安装

pnpm install vue-router@4

2、新建router/index.js

import {createRouter,createWebHashHistory} from 'vue-router'
import Home from '@/views/home/Home.vue'
import About from '@/views/about/About.vue'
// 2. 定义一些路由
// 每个路由都需要映射到一个组件。
// 我们后面再讨论嵌套路由。
const routes = [
    { path: '/', component: Home },
     { path: '/about', component: About },
  ]
  
  // 3. 创建路由实例并传递 `routes` 配置
  // 你可以在这里输入更多的配置,但我们在这里
  // 暂时保持简单
  const router =createRouter({
    // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
    history: createWebHashHistory(),
    routes, // `routes: routes` 的缩写
  })

  export default router

3、使用

  <p>
    <!--使用 router-link 组件进行导航 -->
    <!--通过传递 `to` 来指定链接 -->
    <!--`<router-link>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签-->
    <router-link to="/">Go to Home</router-link>
    <router-link to="/about">Go to About</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>

11、安装pinia

1、安装

pnpm install pinia --save

2、main.js引入 

import { createApp } from 'vue'

import App from './App.vue'
import router from './router'
import 'amfe-flexible'
import 'vant/lib/index.css'
import { createPinia } from 'pinia'
const pinia = createPinia()
const app= createApp(App)
app.use(router)
app.use(pinia)
app.mount('#app')

2、新建store/home.js

import { defineStore } from  'pinia'
 
export const homeStore = defineStore('home',{
    state:()=>{
        return {
            count:100,
            price:250
        }
    },
    getters:{
        doubleCount(){
            return this.count*2
        },
        doublePrice(){
            return this.price*2
        }
    },
    actions:{
        changeStoreData(){
            this.count+=1
            this.price+=1
        },
    }
})

3、使用 

<template>
    <div>
     
        <h1> 主页{{ msg }}</h1>
      <p>{{count}}</p>
      <p>{{doubleCount}}</p>
        <van-button size='large' type="primary" @click="changeData">改变数据</van-button>
            </div>
</template>

<script setup>
import { ref } from 'vue'
import { storeToRefs } from 'pinia';
import { homeStore } from '@/store/home.js';
import {loginApi} from '@/api/home.js'
const store = homeStore()
let { count,doubleCount,price,doublePrice } = storeToRefs(store)
defineProps({
  msg: String,
})

const changeData = ()=>{
  //1、直接修改count
//   count.value++
//    price.value++
  //2、$patch批量修改State的值
//   store.$patch({
//     count:500,
//     price:1000
//   })
  //3、$patch批量修改函数形式
//   store.$patch((state)=>{
//     state.count++
//     state.price++
//   })
  //4、通过原始对象修改整个实例
  //$state您可以通过将store的属性设置为新对象来替换store的整个状态
  //缺点就是必须修改整个对象的所有属性
//   store.$state={
//     count:0,
//     price:1
//   }
  //5、通过actions修改
    store.changeStoreData()
  
}

const login = async ()=>{
    let res = await loginApi({
        Account:"admin",
        Pwd:"0000"
    })
    console.log(res,'返回结果')
}
login()
</script>

<style lang="scss" scoped>
h1{
    font-size: 40px;
    color: $defaultColor;
}
</style>

到了这里,关于vue3.2+vite+vant4+sass搭建笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vite + Vue3 +Vant4构建项目时,按需引入使用Toast组件,引用 showToast 时出现编译报错的解决方案

    一.问题定位 在Vite + Vue3 +Vant4构建项目时,需要使用Toast组件显示提示信息,按照官方文档使用函数调用 使用后直接报错,说是找不到对应的样式文件(如下图): 在项目中查找node-moudles文件,确实没有找到,只有一个toast文件(如下图): 在百度搜索解决方法,说是需要单

    2024年01月17日
    浏览(71)
  • vue3+vant自动导入+pina+vite+js+pnpm搭建项目框架

    要搭建一个使用Vue 3、Vant组件库、Pina状态管理、Vite作为构建工具、JavaScript语言、pnpm作为包管理工具的项目框架,可以按照以下步骤进行操作: 这将生成一个 package.json 文件。 至此,你已经搭建好了一个使用Vue 3、Vant组件库、Pina状态管理、Vite作为构建工具、JavaScript语言、

    2024年04月14日
    浏览(51)
  • Vant4在Vue3.3中如何按需导入组件和样式

    最近我在Vue 3.3的项目中对Vant4做按需导入时,尽管按照Vant4的官方指南进行操作,但样式仍然无法正确加载。经过深入研究和多篇文章的比较,我终于找到了在Vue3中如何正确的按需导入Vant 4组件和样式的方法。由于Vue3.3和Vant4相对较新,相关资料可能还不够完善,因此我认为

    2024年01月21日
    浏览(55)
  • # vue3 vant4 Tabbar 标签栏组件的封装 和Popup弹出层的封装

    需求如上,标签栏里第三个是图片,整个项目有两种场景, 标签栏正常跳转页面, 标签拦渲染别的图片时候,点击就是打开弹出层, 封装了标签栏,弹出层两部分,作为公共组件 标签栏的封装 徽标样式需要调整,list现在是自己暂时再state里写的假数据 下面是再使用标签组

    2024年01月20日
    浏览(67)
  • 【Vue3+Ts project】vant4 实现触发指定表单 rules校验、setTimeout和 setInterval 区别

      一.使用 vant组件  validate属性 实现 触发指定输入框rules校验 ,满足校验通过否则失败  1. 给form表单绑定 ref并定义值名称 ,然后为你想校验的表单绑定 name值 2.为ref的值名称定义变量名 ,然后 ref值名称.value.validate(\\\'name值名称\\\'),.then接收成功 , .catch 接收失败   二. setT

    2024年02月11日
    浏览(62)
  • 分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊

    2022年11月23日首发于掘金,现在同步到公众号。 11. 前言 大家好,我是若川。推荐点右上方蓝字若川视野把我的公众号 设为星标 。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》

    2024年02月05日
    浏览(101)
  • 【Vue H5项目实战】从0到1的自助点餐系统—— 搭建脚手架(Vue3.2 + Vite + TS + Vant + Pinia + Node.js)

    H5 项目基于 Web 技术,可以在智能手机、平板电脑等移动设备上的浏览器中运行,无需下载和安装任何应用程序,且H5 项目的代码和资源可以集中在服务器端进行管理,只需更新服务器上的代码,即可让所有顾客访问到最新的系统版本。 本系列将以肯德基自助点餐页面为模板

    2024年02月13日
    浏览(65)
  • vite vue3配置eslint和prettier以及sass

    教程 官网 vue-eslint ts-eslint 生成配置文件 安装其他插件 修改.eslintrc.cjs 添加.eslintignore 测试 也可以执行查看结果 官网 添加.prettierrc.cjs 添加.prettierignore https://stylelint.io/ 配置.stylelintrc.cjs 配置忽略文件.stylelintignore package.json增加配置 执行 yarn format 会自动格式化ts、js、html、js

    2024年01月23日
    浏览(53)
  • vite+vant+vue3新闻客户端app(一)

    http://toutiao.itheima.net/api.html#u5173u6ce8u7528u62370a3ca20id3du5173u6ce8u7528u62373e203ca3e https://gitee.com/git640640/news 你还可以通过附加的命令行选项直接指定项目名称和你想要使用的模板。例如,要构建一个 Vite + Vue 项目,运行: 安装结束,命令提示你项目创建成功,按照命令行的提示在终端

    2024年02月09日
    浏览(38)
  • Vue3+vite+vant UI移动端项目创建保姆级教程

    vue3 默认端口5173 想要把端口号修改为8088,在vite.config.js中写入 安装插件flexible (适配移动端) 在main.js中引入 安装 postcss-pxtorem (把px转化为rem) 安装这个之后 开发过程中就可以写px了 插件会自动转化为移动端单位rem 配置自动按需引入组件 安装插件 在vite.config.js中配置插件 适配

    2024年04月16日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包