From 4c7c5cf4ba232369b71e6f401f386ed8a95c7391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=94=E8=B7=91=E7=9A=84=E9=9D=A2=E6=9D=A1?= <1262327911@qq.com> Date: Sun, 17 Dec 2023 00:12:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20iconify=E5=9B=BE=E6=A0=87=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=A6=BB=E7=BA=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- pnpm-lock.yaml | 42 +++--- src/components/GoIconify/index.ts | 3 + src/components/GoIconify/index.vue | 34 +++++ src/main.ts | 126 ++++++++++-------- .../components/Icons/Default/Icon/index.vue | 4 +- .../components/ChartsItemBox/index.vue | 4 +- .../components/ChartsSearch/index.vue | 4 +- types/shims-vue.d.ts | 3 +- vite.config.ts | 11 +- 10 files changed, 147 insertions(+), 88 deletions(-) create mode 100644 src/components/GoIconify/index.ts create mode 100644 src/components/GoIconify/index.vue diff --git a/package.json b/package.json index 3636ceb3..4ab857b3 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dependencies": { "@amap/amap-jsapi-loader": "^1.0.1", "@amap/amap-jsapi-types": "^0.0.8", + "@iconify/json": "^2.2.158", "@types/color": "^3.0.3", "@types/crypto-js": "^4.1.1", "@types/keymaster": "^1.6.30", @@ -32,6 +33,7 @@ "gsap": "^3.11.3", "highlight.js": "^11.5.0", "html2canvas": "^1.4.1", + "iconify-icon": "^1.0.8", "keymaster": "^1.6.2", "mitt": "^3.0.0", "monaco-editor": "^0.33.0", @@ -50,8 +52,6 @@ "devDependencies": { "@commitlint/cli": "^17.0.2", "@commitlint/config-conventional": "^17.0.2", - "@iconify/types": "^2.0.0", - "@iconify/vue": "^4.1.1", "@types/node": "^16.11.26", "@types/three": "^0.144.0", "@typescript-eslint/eslint-plugin": "^5.18.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d00e0ef..4cc6ff8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@amap/amap-jsapi-types': specifier: ^0.0.8 version: 0.0.8 + '@iconify/json': + specifier: ^2.2.158 + version: 2.2.158 '@types/color': specifier: ^3.0.3 version: 3.0.3 @@ -59,6 +62,9 @@ dependencies: html2canvas: specifier: ^1.4.1 version: 1.4.1 + iconify-icon: + specifier: ^1.0.8 + version: 1.0.8 keymaster: specifier: ^1.6.2 version: 1.6.2 @@ -87,7 +93,7 @@ dependencies: specifier: ^0.13.1 version: 0.13.1(vue@3.2.37) vue-i18n: - specifier: ^9.2.2 + specifier: 9.2.2 version: 9.2.2(vue@3.2.37) vue-router: specifier: 4.0.12 @@ -109,12 +115,6 @@ devDependencies: '@commitlint/config-conventional': specifier: ^17.0.2 version: 17.0.2 - '@iconify/types': - specifier: ^2.0.0 - version: 2.0.0 - '@iconify/vue': - specifier: ^4.1.1 - version: 4.1.1(vue@3.2.37) '@types/node': specifier: ^16.11.26 version: 16.11.40 @@ -1122,18 +1122,16 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@iconify/types@2.0.0: - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - dev: true - - /@iconify/vue@4.1.1(vue@3.2.37): - resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==} - peerDependencies: - vue: '>=3' + /@iconify/json@2.2.158: + resolution: {integrity: sha512-6foGYcG97nmYpJ7N0MAbtfH7SKf7RvoOCYYSBi8gs+8qopXzplIP2F4lQiLrjpbPQihAoTercmGYWi4ABxLX1A==} dependencies: '@iconify/types': 2.0.0 - vue: 3.2.37 - dev: true + pathe: 1.1.1 + dev: false + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: false /@intlify/core-base@9.2.2: resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} @@ -3668,6 +3666,12 @@ packages: hasBin: true dev: true + /iconify-icon@1.0.8: + resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} + dependencies: + '@iconify/types': 2.0.0 + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4741,6 +4745,10 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} diff --git a/src/components/GoIconify/index.ts b/src/components/GoIconify/index.ts new file mode 100644 index 00000000..a333d9a2 --- /dev/null +++ b/src/components/GoIconify/index.ts @@ -0,0 +1,3 @@ +import GoIconify from './index.vue'; + +export { GoIconify }; diff --git a/src/components/GoIconify/index.vue b/src/components/GoIconify/index.vue new file mode 100644 index 00000000..750b8267 --- /dev/null +++ b/src/components/GoIconify/index.vue @@ -0,0 +1,34 @@ +<template> + <iconify-icon + :icon="icon" + :rotate="`${rotate}deg`" + :width="width" + :style="{ + color: color + }" + ></iconify-icon> +</template> + +<script setup lang="ts"> +defineProps({ + icon: { + type: String, + required: true + }, + color: { + type: String, + default: '#999999', + required: false + }, + width: { + type: [String, Number], + default: '20', + required: false + }, + rotate: { + type: [String, Number], + default: '0', + required: false + } +}) +</script> diff --git a/src/main.ts b/src/main.ts index 550bc63c..dcd249d4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,59 +1,67 @@ -import { createApp } from 'vue' -import App from './App.vue' -import router, { setupRouter } from '@/router' -import i18n from '@/i18n/index' -import { setupStore } from '@/store' -import { setupNaive, setupDirectives, setupCustomComponents, initFunction } from '@/plugins' -import { GoAppProvider } from '@/components/GoAppProvider/index' -import { setHtmlTheme } from '@/utils' - -// 引入全局样式 -import '@/styles/pages/index.scss' -// 引入动画 -import 'animate.css/animate.min.css' -// 引入标尺 -import 'vue3-sketch-ruler/lib/style.css' - -async function appInit() { - const goAppProvider = createApp(GoAppProvider) - - const app = createApp(App) - - // 注册全局常用的 naive-ui 组件 - setupNaive(app) - - // 注册全局自定义指令 - setupDirectives(app) - - // 注册全局自定义组件 - setupCustomComponents(app) - - // 挂载状态管理 - setupStore(app) - - // 解决路由守卫,Axios中可使用,Dialog,Message 等全局组件 - goAppProvider.mount('#appProvider', true) - - // 挂载路由 - setupRouter(app) - - // 路由准备就绪后挂载APP实例 - await router.isReady() - - // Store 准备就绪后处理主题色 - setHtmlTheme() - - // 语言注册 - app.use(i18n) - - // 挂载到页面 - app.mount('#app', true) - - // 挂载到 window - window['$vue'] = app -} - -appInit().then(() => { - initFunction() -}) - +import { createApp } from 'vue' +import App from './App.vue' +import router, { setupRouter } from '@/router' +import i18n from '@/i18n/index' +import { setupStore } from '@/store' +import { setupNaive, setupDirectives, setupCustomComponents, initFunction } from '@/plugins' +import { GoAppProvider } from '@/components/GoAppProvider/index' +import { setHtmlTheme } from '@/utils' +import { addCollection } from 'iconify-icon' +import uimIcons from '@iconify/json/json/uim.json' +import lineMdIcons from '@iconify/json/json/line-md.json' +import wiIcons from '@iconify/json/json/wi.json' + +// 引入全局样式 +import '@/styles/pages/index.scss' +// 引入动画 +import 'animate.css/animate.min.css' +// 引入标尺 +import 'vue3-sketch-ruler/lib/style.css' +// 注册图标 +addCollection(uimIcons) +addCollection(lineMdIcons) +addCollection(wiIcons) + +async function appInit() { + const goAppProvider = createApp(GoAppProvider) + + const app = createApp(App) + + // 注册全局常用的 naive-ui 组件 + setupNaive(app) + + // 注册全局自定义指令 + setupDirectives(app) + + // 注册全局自定义组件 + setupCustomComponents(app) + + // 挂载状态管理 + setupStore(app) + + // 解决路由守卫,Axios中可使用,Dialog,Message 等全局组件 + goAppProvider.mount('#appProvider', true) + + // 挂载路由 + setupRouter(app) + + // 路由准备就绪后挂载APP实例 + await router.isReady() + + // Store 准备就绪后处理主题色 + setHtmlTheme() + + // 语言注册 + app.use(i18n) + + // 挂载到页面 + app.mount('#app', true) + + // 挂载到 window + window['$vue'] = app +} + +appInit().then(() => { + initFunction() +}) + diff --git a/src/packages/components/Icons/Default/Icon/index.vue b/src/packages/components/Icons/Default/Icon/index.vue index 2c139a8a..cbfc81ae 100644 --- a/src/packages/components/Icons/Default/Icon/index.vue +++ b/src/packages/components/Icons/Default/Icon/index.vue @@ -1,13 +1,13 @@ <template> <div class="go-icon-box"> - <Icon :icon="((dataset || '') as string)" :color="color" :width="size" :rotate="rotate" /> + <GoIconify :icon="((dataset || '') as string)" :color="color" :width="size" :rotate="rotate" /> </div> </template> <script setup lang="ts"> import { PropType, toRefs } from 'vue' import { CreateComponentType } from '@/packages/index.d' -import { Icon } from '@iconify/vue' +import { GoIconify } from '@/components/GoIconify' const props = defineProps({ chartConfig: { diff --git a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue index cca0c4a1..f3f96e39 100644 --- a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue @@ -23,7 +23,7 @@ </n-text> </div> <div class="list-center go-flex-center go-transition" draggable="true"> - <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="48" /> + <GoIconify v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="48" style="height: auto" /> <chart-glob-image v-else class="list-img" :chartConfig="item" /> </div> <div class="list-bottom"> @@ -64,7 +64,7 @@ import { createComponent } from '@/packages' import { ConfigType, CreateComponentType, PackagesCategoryEnum } from '@/packages/index.d' import { ChatCategoryEnum } from '@/packages/components/Photos/index.d' import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' -import { Icon } from '@iconify/vue' +import { GoIconify } from '@/components/GoIconify' import { icon } from '@/plugins' import omit from 'lodash/omit' diff --git a/src/views/chart/ContentCharts/components/ChartsSearch/index.vue b/src/views/chart/ContentCharts/components/ChartsSearch/index.vue index f90536a8..e0a2e452 100644 --- a/src/views/chart/ContentCharts/components/ChartsSearch/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsSearch/index.vue @@ -37,7 +37,7 @@ :title="item.title" @click="selectChartHandle(item)" > - <Icon v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="20" /> + <GoIconify v-if="item.icon" class="list-img" :icon="item.icon" color="#999" width="20" /> <chart-glob-image v-else class="list-item-img" :chartConfig="item" /> <n-text class="list-item-fs" depth="2">{{ item.title }}</n-text> </div> @@ -79,7 +79,7 @@ import { isString, addEventListener, removeEventListener } from '@/utils' import { fetchConfigComponent, fetchChartComponent } from '@/packages/index' import { componentInstall, loadingStart, loadingFinish, loadingError } from '@/utils' import { ChartGlobImage } from '@/components/Pages/ChartGlobImage' -import { Icon } from '@iconify/vue' +import { GoIconify } from '@/components/GoIconify' const props = defineProps({ menuOptions: { diff --git a/types/shims-vue.d.ts b/types/shims-vue.d.ts index fa19c5db..fbfc8922 100644 --- a/types/shims-vue.d.ts +++ b/types/shims-vue.d.ts @@ -5,5 +5,4 @@ declare module '*.vue' { } declare module 'lodash/*' -declare module 'dom-helpers' -declare module '@iconify/vue' \ No newline at end of file +declare module 'dom-helpers' \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 79f05a76..93caff76 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -25,7 +25,7 @@ export default defineConfig({ }, { find: 'vue-i18n', - replacement: 'vue-i18n/dist/vue-i18n.cjs.js', //解决i8n警告 + replacement: 'vue-i18n/dist/vue-i18n.cjs.js' //解决i8n警告 } ], dedupe: ['vue'] @@ -40,7 +40,14 @@ export default defineConfig({ } }, plugins: [ - vue(), + vue({ + template: { + compilerOptions: { + // 排除 iconify 图标影子组件编译报错 + isCustomElement: tag => tag.startsWith('iconify-icon') + } + } + }), monacoEditorPlugin({ languageWorkers: ['editorWorkerService', 'typescript', 'json', 'html'] }),