VUE - 实战 2

news/2025/10/2 20:57:09/文章来源:https://www.cnblogs.com/tangge/p/19123994

vue 项目 tailwindcss 安装

安装

命令

npm install -D tailwindcss@3 postcss autoprefixer

现在 版本4.1 和vue集成有问题,所有用3

2 初始化配置文件:

npx tailwindcss init -p

3 修改 tailwind.config.js 配置:

/** @type {import('tailwindcss').Config} */
module.exports = {content: ["./index.html","./src/**/*.{vue,js,ts,jsx,tsx}",],theme: {extend: {},},plugins: [],
}

4 建 Tailwind 样式文件

src/styles 目录下创建 tailwind.css 文件:

@tailwind base;
@tailwind components;
@tailwind utilities;

main.js (或 main.ts) 中导入刚才创建的 CSS 文件:

import { createApp } from 'vue'
import App from './App.vue'
import './assets/css/tailwind.css'  // 引入 TailwindcreateApp(App).mount('#app')

设置HTML的基准值REM和xl,sm,base等的大小

https://tailwindcss.com/docs/font-size 版本4

https://tailwind-v3.nodejs.cn/docs/font-size 版本3

手机端,根据浏览器的宽度,设置字体大小

1 根据 (浏览器可视窗口宽度/10),设置 html 的 fontsize,最大不能过40

export const useREM = () => {const MAX_FONT_SIZE = 40document.addEventListener('DOMContentLoaded', function () {// 拿到html的const html = document.querySelector('html')// 拿到窗口的宽度除以10let fontsize = windowWidth.value / 10fontsize = fontsize > MAX_FONT_SIZE ? MAX_FONT_SIZE : fontsize// 设置html的字体大小html.style.fontSize = fontsize + 'px'})}

2 导入main.js

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import '@/styles/index.scss'
import { useREM } from '@/utils/flexble.js'
import router from '@/routers/index.js'const app = createApp(App)
app.use(createPinia())
app.use(router)
useREM()app.mount('#app')

3 tailwind.config.js

/** @type {import('tailwindcss').Config} */
export default {content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],theme: {extend: {fontSize: {xs: ['0.375rem', '0.5rem'],sm: ['0.5rem', '0.625rem'],base: ['0.625rem', '0.75rem'],lg: ['0.75rem', '0.875rem'],xl: ['0.875rem', '1.125rem'],},},},plugins: [],
}

设置自定义的样式

例如:shadow-white-l

/** @type {import('tailwindcss').Config} */
export default {content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],theme: {extend: {fontSize: {xs: ['0.375rem', '0.5rem'],sm: ['0.5rem', '0.625rem'],base: ['0.625rem', '0.75rem'],lg: ['0.75rem', '0.875rem'],xl: ['0.875rem', '1.125rem'],},},boxShadow: {'white-l': '-10px 0 10px white',},},plugins: [],
}

vite 设置

resolve.alias 软连接 - 路径别名

  • 类型:Record<string, string> | Array<{ find: string | RegExp, replacement: string, customResolver?: ResolverFunction | ResolverObject }>

将会被传递到 @rollup/plugin-alias 作为 entries 的选项。也可以是一个对象,或一个 { find, replacement, customResolver } 的数组。

当使用文件系统路径的别名时,请始终使用绝对路径。相对路径的别名值会原封不动地被使用,因此无法被正常解析。

更高级的自定义解析方法可以通过 插件 实现。

https://cn.vitejs.dev/config/shared-options.html#resolve-alias

import { fileURLToPath, URL } from 'node:url'
// import { join } from 'node:path'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'// https://vite.dev/config/
export default defineConfig({plugins: [vue(), vueDevTools()],resolve: {alias: {// '@': join(__dirname, 'src'),'@': fileURLToPath(new URL('./src', import.meta.url)),},},
})

跨域问题 server.proxy

https://cn.vitejs.dev/config/server-options.html#server-proxy

import { fileURLToPath, URL } from 'node:url'
// import { join } from 'node:path'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'// https://vite.dev/config/
export default defineConfig({plugins: [vue(), vueDevTools()],resolve: {alias: {// '@': join(__dirname, 'src'),'@': fileURLToPath(new URL('./src', import.meta.url)),},},//代理配置server: {proxy: {// 代理所有 /api 的请求'/api': {//代理请求后的地址target: 'https://xxxxxxxxxxx/',//跨域changeOrigin: true,},},},
})

区分开发和生产环境

在 vite 中提供了 .env 文件,该文件为环境变量文件,默认提供了四种文件格式:

.env # 所有情况下都会加载.env.local # 所有情况下都会加载,但会被 git 忽略.env.[mode] # 只在指定模式下加载.env.[mode].local # 只在指定模式下加载,但会被 git 忽略

其中有一种 .env.[mode] 的格式可以在不同模式下加载不同内容,这不正是我们想要的吗?

默认只有 VITE_ 为前缀的变量才会被 vite 处理

//文件 .env.development

# 开发环境
VITE_BASE_API='/api'

//文件 .env.production

# 生产环境
VITE_BASE_API='/prod-api'

request.js

import axios from 'axios'//console.log(import.meta.env.VITE_BASE_API)// 创建axios实例
const service = axios.create({timeout: 10000, // 请求超时时间baseURL: import.meta.env.VITE_BASE_API
})

处理SVG图标

image

1 安装vite-plugin-svg-icons插件

yarn add vite-plugin-svg-icons -D
# or
npm i vite-plugin-svg-icons -D
# or
pnpm install vite-plugin-svg-icons -D

2 配置 vite

import { fileURLToPath, URL } from 'node:url'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
// import { join } from 'node:path'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueDevTools(),createSvgIconsPlugin({// 指定需要缓存的图标文件夹// iconDirs: [path.resolve(fileURLToPath(new URL('./src/assets/icons', import.meta.url)))],iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],// 指定symbolId格式symbolId: 'icon-[dir]-[name]',}),],resolve: {alias: {// '@': join(__dirname, 'src'),'@': fileURLToPath(new URL('./src', import.meta.url)),},},//代理配置server: {proxy: {// 代理所有 /api 的请求'/api': {//代理请求后的地址target: 'https://XXXXXXXXXXXXXX/',//跨域changeOrigin: true,},},},
})

3 创建svg组件

src\libs\svg-icons\index.vue

<template><svgclass="svg-icon"aria-hidden="true":width="size":height="size"><use :xlink:href="`#icon-${name}`" :fill="color" :class="fillClass"></use></svg>
</template><script setup>
import { defineProps } from 'vue'defineProps({// 图标名称(对应svg的id)name: {type: String,required: true},// 图标大小size: {type: [Number, String],default: 24},//svg 图标颜色color:{type: String,},//tailwind 填充类fillClass:{type: String,},
})
</script><style scoped>
</style>

4 导出插件

src\libs\index.js

import SvgIcon from './svg-icons/index.vue'export default{//当你在 Vue 应用中使用 app.use(插件) 时,Vue 会自动调用这个 install 方法install(app) {app.component('svg-icon', SvgIcon) //这行代码将 SvgIcon 组件注册为全局组件,组件的标签名为 svg-icon}
}

https://cn.vuejs.org/guide/reusability/plugins

一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个安装函数本身。安装函数会接收到安装它的应用实例和传递给 app.use() 的额外选项作为参数:

const myPlugin = {install(app, options) {// 配置此应用}
}

插件没有严格定义的使用范围,但是插件发挥作用的常见场景主要包括以下几种:

  1. 通过 app.component()app.directive() 注册一到多个全局组件或自定义指令。
  2. 通过 app.provide() 使一个资源可被注入进整个应用。
  3. app.config.globalProperties 中添加一些全局实例属性或方法
  4. 一个可能上述三种都包含了的功能库 (例如 vue-router)。

5 导入 mian.js

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import '@/styles/index.scss'
import { useREM } from '@/utils/flexble.js'
import router from '@/routers/index.js'
import 'virtual:svg-icons-register' // 引入SVG注册脚本
import libs from '@/libs'const app = createApp(App)
app.use(createPinia())
app.use(router)
app.use(libs)
useREM()app.mount('#app')

6 可以使用了

<svg-icon class="w-1.5 h-1.5" name="hamburger" size="24" />

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平面设计免费模板网站济南装修网

以下是百度统计的诊断&#xff0c;小弟万般无奈&#xff0c;html上的缓存以及图片处理技巧欠缺&#xff0c;希望各位大大帮帮忙支个招&#xff01; 以下元素可在不损失原信息量的前提下进行压缩&#xff1a; http://www.5atl.com/Style/main.css &#xff08;大小&#xff1a; …

QBXT2025S刷题 Day1

今天的题目 T1 \(90pts\)。 赛时树状数组写挂了。 发现没有特判第一个数是 \(0\)。 我的思路是,\(cnt[x]\) 表示对于所有的 \(h[i] \geq x\) 可以构成多少个区间。 先离散化。 对于当前 \(h[i]\),若 \(h[i - 1] <…

wordpress 仅显示标题seo会被取代吗

在当今快节奏的软件开发领域&#xff0c;提升开发效率是每个开发者都追求的目标。对于 Vue 前端开发而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已经成为了众多开发者的首选编辑器。而随着人工智能技术的发展&#xff0c;各类 AI 编码扩展工具如雨后春笋…

2025多校冲刺CSP模拟赛1(螳臂复活祭)

写在前面:题解未动,废话先行: 这次的模拟赛,肝硬化竟取得了比它近三次校内模拟赛的总分之和还要高 \(5pts\) 的成绩!(虽然 \(rank~50\) ),兴奋异常(其实没有),遂写博文(其实是前几天没空写)。顺带一提,那…

龙岩做网站的公司网站开发资源网

1. 题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict&#xff0c;在字符串中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明&#xff1a; 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的…

最新创建的网站网站建设及推广

一、MybatisPlus简介 MybatisPlus&#xff08;简称MP&#xff09;是一个流行的Java持久层框架&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生&#xff0c;旨在简化数据库操作和提高开发效率。MybatisPlus为开发者提供了一套方便的API和…

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance这个警告信息是由于不同操作系统之间归档工具的兼容性问题导致的。 错误信息解释 关键词含义LIBARCHIVE.xattr.com.apple.prove…

短剧小程序核心专业的技术拆解:视频加载优化、用户留存与商业化落地​

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

上小学网站建设php网站开发技术背景

更新spring-boot jar包中的BOOT-INF/lib目录下的jar包 场景 需要更新lib目录下某个jar包的配置文件 失败的解决方法 用解压软件依次打开spring-boot jar包&#xff08;设为a.jar&#xff09;、BOOT-INF/lib目录下的jar包&#xff08;设为b.jar&#xff09;&#xff0c;然后修改…

电影网站推荐哪个网站好沧州网站艰涩很

点击菜单栏 File --> Project Structure 在弹出的窗口中点击选择左侧的 Facets&#xff0c;接着点击右边的 &#xff0c;弹出的菜单中选择 web 在弹出的 『Choose Module』窗口中选择要转为 web 的项目&#xff08;模块&#xff09;&#xff0c;然后点击 OK 选择好模块后…

做网站最好选什么语言南昌做企业网站

本篇内容包括&#xff1a;ArrayList 概述、ArrayList 的扩容机制&#xff08;包含源码部分&#xff09;、如何在遍历 ArrayList 时正确的移除一个元素、ArrayList 的构造方法及常用方法、关于 Array 与 ArrayList 的区别、关于 CopyOnWriteArrayList、关于 Fail Fast 与 Fail S…

完整教程:Apache Doris 入门与技术替代方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站数据库怎么做同步推广网站设计推广方案

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…

微信网站建设塞尼铁克it彩票网站建设维护工程师

摘要&#xff1a;AJAX是一个在前端的应用非常广泛技术&#xff0c;为什么还要谈它呢&#xff1f;么得办法之前学的不全面&#xff0c;再收拾收拾。水平有限&#xff0c;欢迎指正&#xff01; AJAX&#xff08;全称&#xff1a;Asynchronous JavaScript and XML&#xff09;是一…

wordpress主题发布站源码wordpress文章显示作者

需求分析&#xff1a;使用Allegro软件进行PCB Layout设计时&#xff0c;当电路图中有很多路相同的模块&#xff0c;使用模块复用的的操作方法&#xff0c;可以显著提高工作效率&#xff0c;同时也可以使PCB布局在整体上显得美观。下面来讲述这个方法。 具体方法及说明&#xf…

福州市 2025 国庆集训 Day2 前三题题解

福州市 2025 国庆集训 Day2 前三题题解 T1 U614648 strip 首先不难想到,将最长的两个放在两端,并且最长的将非插头那端突出去是最合算的。 然后我们来看看中间的 \(s-2\) 个位置与 \(n-2\) 个插座的分配。 需要遵循的…

2025 年马赛克厂家 TOP 企业品牌推荐排行榜,陶瓷,游泳池,喷墨,冰裂,拼花,防滑,复古,家装马赛克推荐这十家公司!

引言在当前建筑陶瓷行业中,马赛克产品的应用场景愈发广泛,从标准游泳池、水上乐园到别墅、酒店会所等,对马赛克的需求持续增长。然而,行业内也面临着诸多问题,部分厂家缺乏专业的研发能力,产品质量参差不齐,有的…

oppoR9m刷Linux系统: 手动备份系统与基带IMEI/NVRAM/QCN

前言全局说明某些原因,软件不能正确读取手机分区信息,那么就要手动创建脚本来备份注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊天等信息资料…

原来你是这样的claude code aciton:没想象中好

需要占用 github action minutes,要用钱哦 并不是在客户端艾特,而是在 gh网页上 at github自动生成的 pull request workflow 文件不对,版本需要更新

2025/9/29

2025/9/291.统一建模语言训练 2.数据结构学习 3.学习Java开发思路