你若带 ./ 便是晴天 —— TOMCAT启动慢问题调优纪实

本文介绍了在CentOS 7.2环境下,针对Tomcat 7.0.73启动缓慢的问题进行了排查与解决。通过调整JRE设置,将安全随机数源由/dev/urandom更改为/dev/./urandom,显著提高了启动速度。


 昨天,在一套公司新搭建的标准环境上进行部署系统,遇到了一个问题,就是tomcat 启动非常慢的问题。虚拟机环境如下

  • 操作系统 :centos 7.2
  • jdk            :java version "1.7.0_80"
         Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
        Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
  • TOMCAT  :Server version: Apache Tomcat/7.0.73
  •         CPU ,内存 :2core +8g 

我们部署的是一套web 系统,没有多么庞大,虽然里边有好多的功能,平时在本机开发的时候也是很正常的,不算很慢,在原来的其他的演示环境和现场环境应该都很快,没遇到过服务启动很慢的现象,然而这次在新搭建的环境上却真的出现了问题,在最开始的时候,我们只是增量更新新修改的内容,然后启动,发现 TOMCAT  启动总是停止在




先说解决办法,可能是最关心的,

有两种解决办法:

1)在Tomcat环境中解决

可以通过配置JRE使用非阻塞的Entropy Source。

在catalina.sh中加入这么一行:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

即可。

2)在JVM环境中解决

打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:

securerandom.source=file:/dev/urandom

替换成

securerandom.source=file:/dev/./urandom



一开始我们以为是我们更新的 内容引起的问题,然后好一阵折腾,各种替换,就差把整个应用 都删掉重新来一次了。不论怎么折腾,他就是这样,忘了中间什么事情耽误了一会,竟然能从页面访问了,然后开始想应该不是我们更新的代码的问题,因为本机开发环境是好的,开始想有可能是tomcat的问题,后面就要祭出法宝了,开启百度和google的模式,当然了,他俩肯定会告诉你解决办法的,先百度后谷歌,如果你什么都不知道的话,就把你遇到的现象放到百度里边搜索,然后他会给你提示出 关键词,你按照关键词搜索就会得到你想要的内容,当然百度的搜索结果你得会辨别真假,不要轻易上当。如果有了关键词 我相信google 能告诉你更好的答案。 百度会告诉你 原来是这个样子,google会告诉你原来世界是这样才会这样,知其然而知其所以然。 当然了,啰里啰嗦说了一大堆,都没说到关键点上,下面打住,进入正题。从TOMCAT 启动慢入手,搜索结果中能值得我们参考的我想有两个 
https://my.oschina.net/caiw/blog/794637?nocache=1490857665059
http://blog.youkuaiyun.com/njchenyi/article/details/46641141
http://www.cnblogs.com/suiyueqiannian/p/6060951.html?utm_source=itdadao&utm_medium=referral

另外一个是
http://www.linkedin.com/pulse/whats-so-special-devurandom-brad-diggs  这个似乎需要翻墙,专业解释为什么带 ./

博文中 提到了很多的数学概念,别问我,我给你解释不清楚。我书读的少。


亲测有效,下面是图
最开始的时候,如下图所示 用时差不多 1070s 也就是得13 分钟



修改完成后 9S

  
export { default as AddLocation } from './add-location.vue'; export { default as Aim } from './aim.vue'; export { default as AlarmClock } from './alarm-clock.vue'; export { default as Apple } from './apple.vue'; export { default as ArrowDownBold } from './arrow-down-bold.vue'; export { default as ArrowDown } from './arrow-down.vue'; export { default as ArrowLeftBold } from './arrow-left-bold.vue'; export { default as ArrowLeft } from './arrow-left.vue'; export { default as ArrowRightBold } from './arrow-right-bold.vue'; export { default as ArrowRight } from './arrow-right.vue'; export { default as ArrowUpBold } from './arrow-up-bold.vue'; export { default as ArrowUp } from './arrow-up.vue'; export { default as Avatar } from './avatar.vue'; export { default as Back } from './back.vue'; export { default as Baseball } from './baseball.vue'; export { default as Basketball } from './basketball.vue'; export { default as BellFilled } from './bell-filled.vue'; export { default as Bell } from './bell.vue'; export { default as Bicycle } from './bicycle.vue'; export { default as BottomLeft } from './bottom-left.vue'; export { default as BottomRight } from './bottom-right.vue'; export { default as Bottom } from './bottom.vue'; export { default as Bowl } from './bowl.vue'; export { default as Box } from './box.vue'; export { default as Briefcase } from './briefcase.vue'; export { default as BrushFilled } from './brush-filled.vue'; export { default as Brush } from './brush.vue'; export { default as Burger } from './burger.vue'; export { default as Calendar } from './calendar.vue'; export { default as CameraFilled } from './camera-filled.vue'; export { default as Camera } from './camera.vue'; export { default as CaretBottom } from './caret-bottom.vue'; export { default as CaretLeft } from './caret-left.vue'; export { default as CaretRight } from './caret-right.vue'; export { default as CaretTop } from './caret-top.vue'; export { default as Cellphone } from './cellphone.vue'; export { default as ChatDotRound } from './chat-dot-round.vue'; export { default as ChatDotSquare } from './chat-dot-square.vue'; export { default as ChatLineRound } from './chat-line-round.vue'; export { default as ChatLineSquare } from './chat-line-square.vue'; export { default as ChatRound } from './chat-round.vue'; export { default as ChatSquare } from './chat-square.vue'; export { default as Check } from './check.vue'; export { default as Checked } from './checked.vue'; export { default as Cherry } from './cherry.vue'; export { default as Chicken } from './chicken.vue'; export { default as ChromeFilled } from './chrome-filled.vue'; export { default as CircleCheckFilled } from './circle-check-filled.vue'; export { default as CircleCheck } from './circle-check.vue'; export { default as CircleCloseFilled } from './circle-close-filled.vue'; export { default as CircleClose } from './circle-close.vue'; export { default as CirclePlusFilled } from './circle-plus-filled.vue'; export { default as CirclePlus } from './circle-plus.vue'; export { default as Clock } from './clock.vue'; export { default as CloseBold } from './close-bold.vue'; export { default as Close } from './close.vue'; export { default as Cloudy } from './cloudy.vue'; export { default as CoffeeCup } from './coffee-cup.vue'; export { default as Coffee } from './coffee.vue'; export { default as Coin } from './coin.vue'; export { default as ColdDrink } from './cold-drink.vue'; export { default as CollectionTag } from './collection-tag.vue'; export { default as Collection } from './collection.vue'; export { default as Comment } from './comment.vue'; export { default as Compass } from './compass.vue'; export { default as Connection } from './connection.vue'; export { default as Coordinate } from './coordinate.vue'; export { default as CopyDocument } from './copy-document.vue'; export { default as Cpu } from './cpu.vue'; export { default as CreditCard } from './credit-card.vue'; export { default as Crop } from './crop.vue'; export { default as DArrowLeft } from './d-arrow-left.vue'; export { default as DArrowRight } from './d-arrow-right.vue'; export { default as DCaret } from './d-caret.vue'; export { default as DataAnalysis } from './data-analysis.vue'; export { default as DataBoard } from './data-board.vue'; export { default as DataLine } from './data-line.vue'; export { default as DeleteFilled } from './delete-filled.vue'; export { default as DeleteLocation } from './delete-location.vue'; export { default as Delete } from './delete.vue'; export { default as Dessert } from './dessert.vue'; export { default as Discount } from './discount.vue'; export { default as DishDot } from './dish-dot.vue'; export { default as Dish } from './dish.vue'; export { default as DocumentAdd } from './document-add.vue'; export { default as DocumentChecked } from './document-checked.vue'; export { default as DocumentCopy } from './document-copy.vue'; export { default as DocumentDelete } from './document-delete.vue'; export { default as DocumentRemove } from './document-remove.vue'; export { default as Document } from './document.vue'; export { default as Download } from './download.vue'; export { default as Drizzling } from './drizzling.vue'; export { default as EditPen } from './edit-pen.vue'; export { default as Edit } from './edit.vue'; export { default as ElemeFilled } from './eleme-filled.vue'; export { default as Eleme } from './eleme.vue'; export { default as ElementPlus } from './element-plus.vue'; export { default as Expand } from './expand.vue'; export { default as Failed } from './failed.vue'; export { default as Female } from './female.vue'; export { default as Files } from './files.vue'; export { default as Film } from './film.vue'; export { default as Filter } from './filter.vue'; export { default as Finished } from './finished.vue'; export { default as FirstAidKit } from './first-aid-kit.vue'; export { default as Flag } from './flag.vue'; export { default as Fold } from './fold.vue'; export { default as FolderAdd } from './folder-add.vue'; export { default as FolderChecked } from './folder-checked.vue'; export { default as FolderDelete } from './folder-delete.vue'; export { default as FolderOpened } from './folder-opened.vue'; export { default as FolderRemove } from './folder-remove.vue'; export { default as Folder } from './folder.vue'; export { default as Food } from './food.vue'; export { default as Football } from './football.vue'; export { default as ForkSpoon } from './fork-spoon.vue'; export { default as Fries } from './fries.vue'; export { default as FullScreen } from './full-screen.vue'; export { default as GobletFull } from './goblet-full.vue'; export { default as GobletSquareFull } from './goblet-square-full.vue'; export { default as GobletSquare } from './goblet-square.vue'; export { default as Goblet } from './goblet.vue'; export { default as GoldMedal } from './gold-medal.vue'; export { default as GoodsFilled } from './goods-filled.vue'; export { default as Goods } from './goods.vue'; export { default as Grape } from './grape.vue'; export { default as Grid } from './grid.vue'; export { default as Guide } from './guide.vue'; export { default as Handbag } from './handbag.vue'; export { default as Headset } from './headset.vue'; export { default as HelpFilled } from './help-filled.vue'; export { default as Help } from './help.vue'; export { default as Hide } from './hide.vue'; export { default as Histogram } from './histogram.vue'; export { default as HomeFilled } from './home-filled.vue'; export { default as HotWater } from './hot-water.vue'; export { default as House } from './house.vue'; export { default as IceCreamRound } from './ice-cream-round.vue'; export { default as IceCreamSquare } from './ice-cream-square.vue'; export { default as IceCream } from './ice-cream.vue'; export { default as IceDrink } from './ice-drink.vue'; export { default as IceTea } from './ice-tea.vue'; export { default as InfoFilled } from './info-filled.vue'; export { default as Iphone } from './iphone.vue'; export { default as Key } from './key.vue'; export { default as KnifeFork } from './knife-fork.vue'; export { default as Lightning } from './lightning.vue'; export { default as Link } from './link.vue'; export { default as List } from './list.vue'; export { default as Loading } from './loading.vue'; export { default as LocationFilled } from './location-filled.vue'; export { default as LocationInformation } from './location-information.vue'; export { default as Location } from './location.vue'; export { default as Lock } from './lock.vue'; export { default as Lollipop } from './lollipop.vue'; export { default as MagicStick } from './magic-stick.vue'; export { default as Magnet } from './magnet.vue'; export { default as Male } from './male.vue'; export { default as Management } from './management.vue'; export { default as MapLocation } from './map-location.vue'; export { default as Medal } from './medal.vue'; export { default as Memo } from './memo.vue'; export { default as Menu } from './menu.vue'; export { default as MessageBox } from './message-box.vue'; export { default as Message } from './message.vue'; export { default as Mic } from './mic.vue'; export { default as Microphone } from './microphone.vue'; export { default as MilkTea } from './milk-tea.vue'; export { default as Minus } from './minus.vue'; export { default as Money } from './money.vue'; export { default as Monitor } from './monitor.vue'; export { default as MoonNight } from './moon-night.vue'; export { default as Moon } from './moon.vue'; export { default as MoreFilled } from './more-filled.vue'; export { default as More } from './more.vue'; export { default as MostlyCloudy } from './mostly-cloudy.vue'; export { default as Mouse } from './mouse.vue'; export { default as Mug } from './mug.vue'; export { default as MuteNotification } from './mute-notification.vue'; export { default as Mute } from './mute.vue'; export { default as NoSmoking } from './no-smoking.vue'; export { default as Notebook } from './notebook.vue'; export { default as Notification } from './notification.vue'; export { default as Odometer } from './odometer.vue'; export { default as OfficeBuilding } from './office-building.vue'; export { default as Open } from './open.vue'; export { default as Operation } from './operation.vue'; export { default as Opportunity } from './opportunity.vue'; export { default as Orange } from './orange.vue'; export { default as Paperclip } from './paperclip.vue'; export { default as PartlyCloudy } from './partly-cloudy.vue'; export { default as Pear } from './pear.vue'; export { default as PhoneFilled } from './phone-filled.vue'; export { default as Phone } from './phone.vue'; export { default as PictureFilled } from './picture-filled.vue'; export { default as PictureRounded } from './picture-rounded.vue'; export { default as Picture } from './picture.vue'; export { default as PieChart } from './pie-chart.vue'; export { default as Place } from './place.vue'; export { default as Platform } from './platform.vue'; export { default as Plus } from './plus.vue'; export { default as Pointer } from './pointer.vue'; export { default as Position } from './position.vue'; export { default as Postcard } from './postcard.vue'; export { default as Pouring } from './pouring.vue'; export { default as Present } from './present.vue'; export { default as PriceTag } from './price-tag.vue'; export { default as Printer } from './printer.vue'; export { default as Promotion } from './promotion.vue'; export { default as QuartzWatch } from './quartz-watch.vue'; export { default as QuestionFilled } from './question-filled.vue'; export { default as Rank } from './rank.vue'; export { default as ReadingLamp } from './reading-lamp.vue'; export { default as Reading } from './reading.vue'; export { default as RefreshLeft } from './refresh-left.vue'; export { default as RefreshRight } from './refresh-right.vue'; export { default as Refresh } from './refresh.vue'; export { default as Refrigerator } from './refrigerator.vue'; export { default as RemoveFilled } from './remove-filled.vue'; export { default as Remove } from './remove.vue'; export { default as Right } from './right.vue'; export { default as ScaleToOriginal } from './scale-to-original.vue'; export { default as School } from './school.vue'; export { default as Scissor } from './scissor.vue'; export { default as Search } from './search.vue'; export { default as Select } from './select.vue'; export { default as Sell } from './sell.vue'; export { default as SemiSelect } from './semi-select.vue'; export { default as Service } from './service.vue'; export { default as SetUp } from './set-up.vue'; export { default as Setting } from './setting.vue'; export { default as Share } from './share.vue'; export { default as Ship } from './ship.vue'; export { default as Shop } from './shop.vue'; export { default as ShoppingBag } from './shopping-bag.vue'; export { default as ShoppingCartFull } from './shopping-cart-full.vue'; export { default as ShoppingCart } from './shopping-cart.vue'; export { default as ShoppingTrolley } from './shopping-trolley.vue'; export { default as Smoking } from './smoking.vue'; export { default as Soccer } from './soccer.vue'; export { default as SoldOut } from './sold-out.vue'; export { default as SortDown } from './sort-down.vue'; export { default as SortUp } from './sort-up.vue'; export { default as Sort } from './sort.vue'; export { default as Stamp } from './stamp.vue'; export { default as StarFilled } from './star-filled.vue'; export { default as Star } from './star.vue'; export { default as Stopwatch } from './stopwatch.vue'; export { default as SuccessFilled } from './success-filled.vue'; export { default as Sugar } from './sugar.vue'; export { default as SuitcaseLine } from './suitcase-line.vue'; export { default as Suitcase } from './suitcase.vue'; export { default as Sunny } from './sunny.vue'; export { default as Sunrise } from './sunrise.vue'; export { default as Sunset } from './sunset.vue'; export { default as SwitchButton } from './switch-button.vue'; export { default as SwitchFilled } from './switch-filled.vue'; export { default as Switch } from './switch.vue'; export { default as TakeawayBox } from './takeaway-box.vue'; export { default as Ticket } from './ticket.vue'; export { default as Tickets } from './tickets.vue'; export { default as Timer } from './timer.vue'; export { default as ToiletPaper } from './toilet-paper.vue'; export { default as Tools } from './tools.vue'; export { default as TopLeft } from './top-left.vue'; export { default as TopRight } from './top-right.vue'; export { default as Top } from './top.vue'; export { default as TrendCharts } from './trend-charts.vue'; export { default as TrophyBase } from './trophy-base.vue'; export { default as Trophy } from './trophy.vue'; export { default as TurnOff } from './turn-off.vue'; export { default as Umbrella } from './umbrella.vue'; export { default as Unlock } from './unlock.vue'; export { default as UploadFilled } from './upload-filled.vue'; export { default as Upload } from './upload.vue'; export { default as UserFilled } from './user-filled.vue'; export { default as User } from './user.vue'; export { default as Van } from './van.vue'; export { default as VideoCameraFilled } from './video-camera-filled.vue'; export { default as VideoCamera } from './video-camera.vue'; export { default as VideoPause } from './video-pause.vue'; export { default as VideoPlay } from './video-play.vue'; export { default as View } from './view.vue'; export { default as WalletFilled } from './wallet-filled.vue'; export { default as Wallet } from './wallet.vue'; export { default as WarnTriangleFilled } from './warn-triangle-filled.vue'; export { default as WarningFilled } from './warning-filled.vue'; export { default as Warning } from './warning.vue'; export { default as Watch } from './watch.vue'; export { default as Watermelon } from './watermelon.vue'; export { default as WindPower } from './wind-power.vue'; export { default as ZoomIn } from './zoom-in.vue'; export { default as ZoomOut } from './zoom-out.vue'; 都代表什么图形
最新发布
08-15
<think>我们导出了大量的Vue单文件组件(SFC),每个组件代表一个图标。这些图标通常用于构建用户界面,例如在按钮、菜单、工具栏等地方。这些图标名称大多来源于Element Plus图标库(或类似设计系统)的命名约定。 每个文件(如`add-location.vue`)对应一个特定的图标。这些图标的名称通常描述了其外观或含义。例如: - `AddLocation`:添加位置图标(可能是一个加号叠加在地图上) - `Aim`:瞄准图标(可能是一个十字准星) - `AlarmClock`:闹钟图标 由于图标是视觉元素,仅通过名称可能无法完全确定其具体图形,但我们可以根据常见的图标命名规范来推断: 1. **方向类**:如`ArrowUp`(上箭头)、`ArrowDown`(下箭头)、`CaretBottom`(向下插入符号)等。 2. **操作类**:如`Check`(勾选)、`Close`(关闭)、`Delete`(删除)、`Edit`(编辑)等。 3. **对象类**:如`Camera`(相机)、`Phone`(电话)、`User`(用户)等。 4. **状态类**:如`CircleCheckFilled`(实心圆勾选)、`StarFilled`(实心星星)等。 5. **天气类**:如`Sunny`(晴天)、`Cloudy`(多云)等。 6. **食物类**:如`Apple`(苹果)、`Coffee`(咖啡)等。 这些图标通常用于Element Plus组件库,或者是一个自定义图标集合。每个图标都是一个独立的Vue组件,可以通过组件名直接使用。 例如,在Vue模板中使用: ```vue <template> <AddLocation style="width: 1em; height: 1em;" /> <AlarmClock style="width: 1em; height: 1em;" /> </template> ``` 由于图标数量众多,无法一一解释每个图标的具体图形,但我们可以根据名称进行大致的分类: ### 常见分类及部分图标解释 1. **箭头与方向**: - `ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`:基本箭头 - `DArrowLeft`, `DArrowRight`:双箭头(可能是左右方向的双箭头) - `CaretTop`, `CaretBottom`:插入符号(通常用于下拉指示) 2. **操作与交互**: - `Check`:对勾(表示完成或正确) - `Close`:关闭(通常是一个叉) - `Delete`:删除(垃圾桶或叉) - `Edit`:编辑(铅笔) - `Search`:搜索(放大镜) - `Refresh`:刷新(循环箭头) 3. **文件与文档**: - `Document`:文档(一页纸) - `Folder`:文件夹 - `Files`:多个文件 4. **设备与硬件**: - `Camera`:相机 - `Phone`:电话 - `Monitor`:显示器 - `Printer`:打印机 5. **天气**: - `Sunny`:太阳(晴天) - `Cloudy`:多云 - `Pouring`:下雨 6. **交通**: - `Van`:货车 - `Ship`:船 - `Bicycle`:自行车 7. **运动**: - `Basketball`:篮球 - `Football`:足球(美式橄榄球) - `Soccer`:足球(英式足球) 8. **购物**: - `ShoppingCart`:购物车 - `ShoppingBag`:购物袋 - `PriceTag`:价格标签 9. **状态指示**: - `CircleCheckFilled`:实心圆形对勾(成功状态) - `WarningFilled`:实心三角形感叹号(警告) - `InfoFilled`:实心圆形信息图标 10. **其他常见**: - `HomeFilled`:实心房屋(首页) - `User`:用户 - `Setting`:设置(齿轮) 注意:具体的图形外观需要查看对应组件的SVG(或字体图标)代码。这些图标通常以SVG形式内置于Vue组件中。 例如,一个简单的`AddLocation.vue`组件可能包含如下内容: ```vue <template> <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"> <!-- 具体的SVG路径 --> </svg> </template> ``` 由于图标数量太多,无法一一列举,但使用方式都是作为组件引入并使用。 ### 使用示例 假设我们有一个图标集合的入口文件`index.ts`(即你提供的代码),那么在其他组件中可以这样使用: ```vue <script setup> import { AddLocation, AlarmClock } from '@/icons'; // 根据实际路径整 </script> <template> <div> <AddLocation /> <AlarmClock /> </div> </template> ``` 为了控制图标大小,通常需要通过CSS设置宽度和高度,或者通过props传入(如果图标组件支持)。 如果这些图标组件设计时支持通过props改变颜色和大小,那么可以这样使用: ```vue <AddLocation style="width: 24px; height: 24px; color: red;" /> ``` 或者,如果组件内部使用了`currentColor`,那么可以通过设置`color`属性来改变颜色。 ### 总结 这些导出代表了一个图标库,包含了各种类别的图标,每个图标都是一个Vue组件。具体图形需要查看每个组件的实现,但根据名称可以推断其大致含义。 §§相关问题§§: 1. 在Vue中如何创建一个可复用的图标组件? 2. 如何通过props动态控制SVG图标的颜色和大小? 3. 在Vue项目中,如何自动导入一个目录下的所有图标组件(例如使用unplugin-vue-components)? 4. 如何为图标组件添加动画效果(例如悬停旋转)?</think>这些文件名代表一套完整的图标库(通常是基于 Element Plus 或类似设计系统的图标集),每个 Vue 组件对应一个特定的 SVG 图形图标。以下是主要分类和代表性图标的解释: ### 一、图标分类说明 1. **方向箭头类** - `ArrowUp`/`ArrowDown`/`ArrowLeft`/`ArrowRight`:基础方向箭头 - `DArrowLeft`/`DArrowRight`:双线箭头(通常用于返回/前进) - `CaretTop`/`CaretBottom`:三角指示符(常用于下拉菜单) 2. **交互操作类** - `Check`/`CircleCheck`:勾选/完成状态 - `Close`/`CircleClose`:关闭/取消操作 - `Plus`/`CirclePlus`:添加操作 - `Delete`/`Remove`:删除操作 - `Download`/`Upload`:下载/上传 3. **设备与物体类** - `Camera`:照相机 - `Phone`:手机 - `Printer`:打印机 - `CreditCard`:信用卡 - `Laptop`:笔记本电脑(`Monitor`) 4. **状态指示类** - `Star`/`StarFilled`:收藏/评分(空心与实心) - `Bell`/`BellFilled`:通知提醒 - `Warning`/`WarningFilled`:警告提示 - `SuccessFilled`:操作成功 5. **天气类** - `Sunny`:晴天 - `Cloudy`:多云 - `Pouring`:大雨 - `Moon`:月亮 6. **商业类** - `ShoppingCart`:购物车 - `Goods`:商品 - `Ticket`:票券 - `Coin`:硬币 7. **地图位置类** - `Location`:定位标记 - `MapLocation`:地图标记 - `Compass`:指南针 ### 二、部分特殊图标详解 1. **食物相关** ```vue <!-- 使用示例 --> <template> <Coffee /> <!-- 咖啡杯图标 --> <IceCream /> <!-- 冰淇淋图标 --> <Bowl /> <!-- 碗图标 --> <ForkSpoon /> <!-- 叉勺餐具图标 --> </template> ``` 2. **文档操作** ```vue <DocumentAdd /> <!-- 添加文档 --> <DocumentCopy /> <!-- 复制文档 --> <DocumentDelete /> <!-- 删除文档 --> ``` 3. **多媒体** ```vue <VideoCamera /> <!-- 摄像机 --> <Microphone /> <!-- 麦克风 --> <Headset /> <!-- 耳机 --> ``` 4. **特殊符号** ```vue <FullScreen /> <!-- 全屏图标(四个方向箭头) --> <Refresh /> <!-- 刷新图标(循环箭头) --> <ZoomIn /> <!-- 放大镜(+号) --> ``` ### 三、完整图标使用示例 ```vue <template> <div class="icon-demo"> <!-- 系统操作 --> <Setting /> <!-- 齿轮状设置图标 --> <User /> <!-- 用户轮廓图标 --> <Lock /> <!-- 锁图标(锁定状态) --> <!-- 文件管理 --> <Folder /> <!-- 文件夹图标 --> <FolderOpened /> <!-- 打开的文件夹 --> <!-- 视图控制 --> <View /> <!-- 眼睛图标(查看) --> <Hide /> <!-- 斜杠的眼睛(隐藏) --> </div> </template> <script> // 按需导入图标组件 import { Setting, User, Lock, Folder, FolderOpened, View, Hide } from './icons' export default { components: { Setting, User, Lock, Folder, FolderOpened, View, Hide } } </script> <style scoped> .icon-demo svg { width: 24px; height: 24px; margin-right: 10px; color: #606266; /* 统一图标颜色 */ } </style> ``` ### 四、图标库最佳实践 1. **按需加载**:使用 `unplugin-icons` 等工具实现自动按需导入 2. **动态渲染**:通过动态组件实现图标切换 ```vue <component :is="currentIcon" /> ``` 3. **样式统一**:通过 CSS 控制所有图标的默认尺寸和颜色 4. **交互增强**:添加悬停效果 ```css .icon:hover { color: var(--el-color-primary); transform: scale(1.1); transition: all 0.3s ease; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值