Skip to content

怎么在 vue-cli3.0 中使用 svg-icon 组件? #980

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
fakaka opened this issue Aug 18, 2018 · 15 comments
Closed

怎么在 vue-cli3.0 中使用 svg-icon 组件? #980

fakaka opened this issue Aug 18, 2018 · 15 comments

Comments

@fakaka
Copy link

fakaka commented Aug 18, 2018

No description provided.

@fakaka
Copy link
Author

fakaka commented Aug 18, 2018

我自己目前是用 vue-svg-loader 勉强使用 svg,很难受。搞不定 svg-sprite-loader 在vue-cli3.0 里面的配置

@fakaka
Copy link
Author

fakaka commented Aug 18, 2018

这样配置了,但是还是会解析其他的svg文件

chainWebpack: config => {
    config.module
        .rule('url-loader')
        .exclude.add('./src/icons')
        .end()

    config.module
        .rule('svg')
        .test(/\.svg$/)
        .include.add('src/icons').end()
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .loader('babel-loader')
        .options({
            symbolId: 'icon-[name]'
        })   
}

@fakaka
Copy link
Author

fakaka commented Aug 18, 2018

@GitHdu 不行啊,还想加载的旧的svg格式

@PanJiaChen
Copy link
Owner

PanJiaChen commented Aug 18, 2018

chainWebpack: config => {
    config.module
        .rule('svg')
        .exclude.add('./src/icons')
        .end()

    config.module
        .rule('icons')
        .test(/\.svg$/)
        .include.add('.src/icons')
		.end()
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .options({
            symbolId: 'icon-[name]'
        })   
}

@fakaka
Copy link
Author

fakaka commented Aug 18, 2018

@PanJiaChen 可以了,谢谢!!!

@Fun005
Copy link

Fun005 commented Sep 17, 2018

你好,方便看下你的vue.config.js配置吗,我的图标还是出不来,无法解析

@fakaka
Copy link
Author

fakaka commented Sep 17, 2018

@Fun005 我这样就行了,你把你的发出来看看

module.exports = {
    devServer: {
        port: 3001
    },
    chainWebpack: config => {
        config.module
            .rule('svg')
            .exclude.add(resolve('src/icons'))
            .end()

        config.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]'
            })
    }
}

var path = require('path')

function resolve(dir) {
    return path.join(__dirname, './', dir)
}

@Fun005
Copy link

Fun005 commented Sep 17, 2018

可以了,谢谢~ 我没有加resolve,所以解析不到。再次感谢~

@musnow
Copy link

musnow commented Sep 19, 2018

chainWebpack: config => {
  const svgRule = config.module.rule('svg')
  svgRule.uses.clear()
  svgRule
    .use('file-loader')
    .loader('svg-sprite-loader')
    .options({ symbolId: 'icon-[name]' })
}

PanJiaChen pushed a commit that referenced this issue Oct 29, 2018
…1267)

* feat: perfect migrate to @vue/cli-service, upgrade vue babel version

1. update to @vue/[email protected], @babel/[email protected]
2. use vue-cli service replace config file in build/ and config/
3. upgrade vue and babel configuration
4. solve the svg-sprite config problem #980

refs: #932 #1087  #980 #1056

* fix: fix breadcrumb dependency

* fix: fix index template and static assets load with vue-cli 3

* fix: fix import driver.js in guide page

* refactor(mock): mak mock api compatible with both web-view and webpack server

1. 把 Mockjs 功能移到 server 端中间件,同时也兼容前端直接劫持 XHR
2. dev 环境下默认作为 express 中间件通过 webpack server 提供 mock api
3. prod 构建时,默认在前端用 Mockjs 劫持 XHR

benefits:
  - dev 开发调试时能直接看到 XHR 请求,方便调试网络,能和后端对接联调
  - 避开在开发时因为 Mockjs 引起的网络 bug
  - prod 构建时劫持 XHR,保证本项目的 Github Pages preview 能正常显示 (逻辑和 error-log 一样)
  - 前后台使用的 mock 是同一份代码,不会增加维护负担

ref: [#562](#562 (comment))

* update requires the lowest version of node

* add favicon

* fix(TreeTable): fix `Array.prototype.concat` on custom-tree-table page
@TianTang-TT
Copy link

请问我按照这样的配置为什么会出错呢
我的配置

    // 配置svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add('./src/icons')
      .end()

    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add('./src/icons')
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })

报错信息是这样的
ERROR WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.

  • configuration.module.rules[14].include should be one of these:
    RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? } | [RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? }]
    -> One or multiple rule conditions
    Details:
    • configuration.module.rules[2].exclude should be an instance of RegExp
    • configuration.module.rules[2].exclude should be a string.
    • configuration.module.rules[2].exclude should be an instance of function
    • configuration.module.rules[2].exclude[0] should be an instance of RegExp
    • configuration.module.rules[2].exclude[0]: The provided value "./src/icons" is not an absolute path!
    • configuration.module.rules[2].exclude[0] should be an instance of function
    • configuration.module.rules[2].exclude[0] should be an array:
      [RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? }]
    • configuration.module.rules[2].exclude[0] should be an object.
    • configuration.module.rules[2].exclude should be an object.
    • configuration.module.rules[2].exclude[0] should be an instance of RegExp
    • configuration.module.rules[2].exclude[0]: The provided value "./src/icons" is not an absolute path!
    • configuration.module.rules[2].exclude[0] should be an instance of function
    • configuration.module.rules[2].exclude[0] should be an array:
      [RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? }]
    • configuration.module.rules[2].exclude[0] should be an object.
    • configuration.module.rules[14].include should be an instance of RegExp
    • configuration.module.rules[14].include should be a string.
    • configuration.module.rules[14].include should be an instance of function
    • configuration.module.rules[14].include[0] should be an instance of RegExp
    • configuration.module.rules[14].include[0]: The provided value "./src/icons" is not an absolute path!
    • configuration.module.rules[14].include[0] should be an instance of function
    • configuration.module.rules[14].include[0] should be an array:
      [RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? }]
    • configuration.module.rules[14].include[0] should be an object.
    • configuration.module.rules[14].include should be an object.
    • configuration.module.rules[14].include[0] should be an instance of RegExp
    • configuration.module.rules[14].include[0]: The provided value "./src/icons" is not an absolute path!
    • configuration.module.rules[14].include[0] should be an instance of function
    • configuration.module.rules[14].include[0] should be an array:
      [RegExp | string | function | [(recursive)] | object { and?, exclude?, include?, not?, or?, test? }]
    • configuration.module.rules[14].include[0] should be an object.

@huatten
Copy link

huatten commented Jan 14, 2019

const resolve = dir => path.join(__dirname, dir);
加上它试试 @TianTang-TT
eg:.include.add(resolve("./src/icons"))

@TianTang-TT
Copy link

@MrTenger 多谢,就是这么解决的

config.module
      .rule('svg')
      .exclude.add(path.resolve(__dirname, 'src/icons'))
      .end()

    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(path.resolve(__dirname, 'src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })

@libp
Copy link

libp commented Mar 10, 2019

补充一下,icons下的index.js 这段代码比不可少:

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg组件

// register globally
Vue.component('svg-icon', SvgIcon)

-------下面的语句没理解怎么起作用的,但是绝对不能少的
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

PanJiaChen added a commit that referenced this issue Apr 1, 2019
* fix[ExternalLink]: fixed bug when url include chinese #1182

* feature: support  Spanish(#1196)

* fix[MockJS]: fix bug with withCredentials after using mockjs  (#1194)

* 修复 Mock 导致请求丢失 Cookie 的问题

修复 Mock 导致 Cookie 丢失的问题,只有在 XHR.open() 周期时,自定义的 withCredentials 会被挂载,此时检查是否是未被拦截的 xhr,并挂载自定义的 withCredentials ,无则默认为 false

* update readme

* perf[tagsView]: refactor the moveToTarget function (#1195)

* fix[tagsView]:fixed visited view move to currentTag

* edit the scroll regular friendly

* tweak

* fix[tagsView]: fixed moveToCurrentTag bug

* feature: add pagination component (#1213)

* fix[TagsView]: fixed update tags title demo bug (#1223)

* chore: temporary hack cssnano bug #1222

* [release] 3.9.2

* chore: restore the hack of cssnano bug

cssnano/cssnano#643

* add an example of sort data by table  (#1236)

* feature: add drag select component (#1249)

* feat: perfect migrate to @vue/cli-service, upgrade vue babel version (#1267)

* feat: perfect migrate to @vue/cli-service, upgrade vue babel version

1. update to @vue/[email protected], @babel/[email protected]
2. use vue-cli service replace config file in build/ and config/
3. upgrade vue and babel configuration
4. solve the svg-sprite config problem #980

refs: #932 #1087  #980 #1056

* fix: fix breadcrumb dependency

* fix: fix index template and static assets load with vue-cli 3

* fix: fix import driver.js in guide page

* refactor(mock): mak mock api compatible with both web-view and webpack server

1. 把 Mockjs 功能移到 server 端中间件,同时也兼容前端直接劫持 XHR
2. dev 环境下默认作为 express 中间件通过 webpack server 提供 mock api
3. prod 构建时,默认在前端用 Mockjs 劫持 XHR

benefits:
  - dev 开发调试时能直接看到 XHR 请求,方便调试网络,能和后端对接联调
  - 避开在开发时因为 Mockjs 引起的网络 bug
  - prod 构建时劫持 XHR,保证本项目的 Github Pages preview 能正常显示 (逻辑和 error-log 一样)
  - 前后台使用的 mock 是同一份代码,不会增加维护负担

ref: [#562](#562 (comment))

* update requires the lowest version of node

* add favicon

* fix(TreeTable): fix `Array.prototype.concat` on custom-tree-table page

* update

* add test

* fix bug

* fix[Charts]: fixed charts resize mixins bug  #1285 (#1290)

* perf[Tinymce]: add searchreplace plugin

* perf[avatar]:minimize the selected area of avatar on the mobile phone when user clicked avatar (#1304)

* refine css

* fix[DragSelect]: fixed querySelectorAll bug

* perf[DragSelect]: add $listeners

* fix link

* fix[Breadcurmb]: fixed pathCompile bug

* fix[Breadcurmb]: fixed router-link bug

* perf[style]: use webpack alias instead of hard code src path (#1338)

* perf[style]: use webpack alias instead of hard code src path

* add sponsors

* fix import path bug

* update vue-router to fixed url path for non ascii urls #1362

* fix[Pagination]: apply PageSizes property to el-pagination  (#1355)

Apply PageSizes property to el-pagination

* update dependence

* add tui.editor (#1374)

* tweak

* add preview

* fix return back bug

* update guide page

* fix[Tinymce]: fixed fullScreen bug #1400

* feat[Breadcrumb]: add hide Breadcrumb option #1442

* perf: use WeChat 7.0 new version icon color

* refactor[login]: refactor login page style

* perf[ScrollPane]: refine moveToTarget code (#1460)

* feature[PDF]: add PDF demo (#1469)

* perf[v-permission]: refine v-permission demo

* perf[Sidebar]: refine sidebar store #1473 (#1474)

* refine: GetUserInfo error message

* fix typo (#1505)

* perf: add sidebar width to variables.scss (#1494)

* tweak

* fix[ThemePicker]: fixed bug when oldVal is null (#1517)

* update README.md

* fix[Breadcrumb]: fixed eslint error (#1521)

* fix[DndList]: fixed drag bug (#1527)

#1524

* pref[Hamburger]: refactor Hamburger component (#1528)

* 美化侧栏菜单切换按钮

* tweak

* perf[Login Form]: optimize eye icon style (#1545)

* optimiz: eye icon style for login form

* change eye-open svg

* perf[Sticky]: export reset method (#1550)

* perf[Sticky]: refine width default value

* perf[utils]: refine parseTime function (#1546)

* 优化 parseTime

修复传入的时间戳是字符串类型,不能转换时间的问题
例:parseTime("1548221490638")

* Update index.js

* perf[UploadExcel]: optimized code (#1552)

* perf: adjust the import order to make it more elegant #1537

* perf[Sidebar]: use sass variables in vue template

* perf[Style]: optimize the sidebar style to make it better to set (#1568)

* perf[SizeSelect]: add default size option (#1566)

* fix[SIdebar]: fixed bug in mobile #1567 (#1569)

* perf: fixed eslint errors

* perf[Lang]: make up for miss keywords

* perf: optimize some code

* perf[Navbar]: refactor navbar style

* perf[Login]: refine css

* feature[Navbar]: add header-search component(#1591)

* fix[Screenfull]: fix screenfull click bug

* perf[Screenfull]: refactor screenfull component

* fix[Screenfull]: fix screenfull bug (#1603)

* fix typo

* fearure[TagsView]: add affix option (#1577)

* perf[utils]: optimize code

* perf[utils]: optimizate variable name

* perf[Navbar]: add scroll bar when the subMenu is too long (#1619)

* perf[ThemePicker]: refine updateStyle function (#554)

* theme replacing should cut tons of irrelevant css

* perf[ResizeHandler]: optimized the judgment of isMobile (#1633)

perf[ResizeHandler]: optimized the judgment of isMobile

*  fix[Sidebar]: fixed infinite loop bug(#1333)

* fixed infinite loop Bug when in hasOneShowingChild Edit the onlyOneChild

* tweak

* fix[Sidebar]: data should return a object

* perf[Sidebar]: optimize code logic (#1349)

* fix[TagsView]: fixed refresh affixed-tag bug (#1653)

* perf[utils.js]: refactor byteLength function (#1650)

* perf[TagsView]: refine code

* perf[TagsView]: set the scrollPane as a business component (#1660)

* fix[DragTable]: support multiple drag-table (#1666)

* perf[Tree-Table]: refactor tree-table

* perf[Tree-Table]: organize the structure and add documentation (#1673)

* fix[Sidebar]: fixed nested router hover bug

* update version

* set preserveWhitespace

* lint code

* fix jest test case

* update config

* bump

* remove empty file

* docs: add link

* fix[Sidebar]: fixed collapse animation problem (#1690)

* fix[Tree-Table]: fixed update item data bug (#1692)

* fix[Waves-Directive]: fixed v-waves does not support update (#1705)

* update husky

* rm cli-plugin-eslint

* add settings (#1707)

* refine settings

* fix[utils]: fixed param2Obj not decoding plus sign (#1712)

* feature[Directive]: add auto-height table directive (#1702)

* fix bug

* feature[Permission]: add role permission management page (#1605)

* feature[Excel]: support export merged header export (#1718)

* feature[Excel]: add export merge header excel demo

* lint

* refine theme color

* add role mock

* tweak mock

* fix[Excel]: fixed export merge-header excel bug

* refine code

* add ThemePicker to setting

* fix[HeaderSearch]: fixed bug in vue2.6+ (#1733)

* fix[Sticky]: fixed bug when set stickyTop

* perf[Sticky]: refine demo

* refine code

* tweak mock

* vuex add namespaced

* fix[Excel]: fixed export bug (#1736)

* rm

* refactor permission

* perf[ThemePicker]: add predefine (#1743)

* fix[Utils]: fixed deepClone error msg (#1748)

* feature: add fixedHeader settings

* fix style in mobile

* fix chore

* perf[Eslint]: update eslint rules

* feature: add create template (#1762)

* add comment

* update vue.config.js

* feature: add sidebar logo (#1767)

* rm

* perf settings

* bump

* refine script and css

* update

* refine settings

* refine config

* update docs

* refine

* rm

* fix jest

* add theme setting

* dump vue-cli

* perf: remove redundant code

* update element-ui

* fix sticky demo bug

* docs

* fixed password input  bug

* refine login form css

* remove tree-table

* update version

* mock error

* refine layout name

* refine
@xcf007
Copy link

xcf007 commented Aug 26, 2020

@Fun005 我这样就行了,你把你的发出来看看

module.exports = {
    devServer: {
        port: 3001
    },
    chainWebpack: config => {
        config.module
            .rule('svg')
            .exclude.add(resolve('src/icons'))
            .end()

        config.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]'
            })
    }
}

var path = require('path')

function resolve(dir) {
    return path.join(__dirname, './', dir)
}

解决了我的问题,thks

@bladeandmaster88
Copy link

Vue.component('svg-icon', SvgIcon)

vue3这句会报错,如何改造?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants