hi,我按照你的项目自己抽离了需要的部分重写了一下,但是icon-svg的标签可以识别却不能正常的加载图片。我前段渲染成的效果是这样的
<svg aria-hidden="true" class="svg-icon">
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-yonghuming">
#shadow-root(closed)
</use>
</svg>
icon的index.js也生成了inconmap,不知道为什么没有加载出来
请问在webpack.base.conf.js中url-loader和svg-sprite-loader有正确配置吗?
在components/icons/svg/index.js有require.context()吗?
@leij1ang 应该是webpack的问题,我后端用了laravel自带的配置,所以没有使用你的webpack配置。
module: {
rules: [
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [path.resolve(__dirname,'./resources/assets/js/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [path.resolve(__dirname,'./resources/assets/js/icons')],
options: {
limit: 10000,
name: ('images/[name].[hash:7].[ext]')
}
}
]
}
我添加了这两个规则,但是报错:
warning in ./resources/assets/js/icons/svg/zonghe.svg
svg-sprite-loader exception. 2 rules applies to D:\work\data-analysis-platform\resources\assets\js\icons\svg\zonghe.svg
@ ./resources/assets/js/icons/svg nonrecursive \.svg$
@ ./resources/assets/js/icons/index.js
@ ./resources/assets/js/app.js
@ multi ./resources/assets/js/app.js ./resources/assets/sass/app.scss
我在./resources/assets/js/icons放的文件,编译后在 public/fonts下面有生成了新的图片包括svg,感觉是路径或引入的问题,但是我对webpack的配置不是很熟悉。
下面是requireAll输出的结果:
:
"/fonts/404.svg?ba00b8106183e7b9b1af5fd526070563"
1
:
"/fonts/EXCEL.svg?52faddc8a6954695c64c73ed06643744"
2
:
"/fonts/QQ.svg?762ef26a079008907049a7f63a6ed4ad"
3
:
"/fonts/a.svg?a072b0cd2847e511e3ef57adddd73789"
4
:
"/fonts/b.svg?fedb42c8c74a0cccbd799cb90b273703"
5
:
"/fonts/bug.svg?c769d87ac1c9e8718a8008fee660190e"
太久没后续 先关闭
我现在也遇到这个问题了,不知道是不是laravel自带的webpack.mix.js的问题。我看了一下icons/index.js中的iconMap,我的都是
0: "/images/404.svg?683aef6d588f427279e3e97bc63f3bd8"
1: "/images/bug.svg?c74b0b9f2819bd45afe964e7f03f72b1"
2: "/images/chart.svg?00215b442fff3eea7ecdb1dc37b27326"
3: "/images/clipboard.svg?afeabab9d359074dfb2e4b3ccecdaa5e"
4: "/images/component.svg?9d89f4d81c717fee32fd5889baf21e2b"
5: "/images/dashboard.svg?eb21a696247e8daf1c20a2f68c714913"
6: "/images/documentation.svg?50aeba85b4b692e29f29e62ab6c073c8"
7: "/images/drag.svg?d79cf3e05135d3e5a53e325bb19d95f6"
8: "/images/email.svg?8990cbc67f501f37fc374339ba463fbb"
9: "/images/example.svg?72852e4b67349e7179ba1c2a4fb519b1"
10: "/images/excel.svg?0e0e914df023042a4957762aecbe6677"
11: "/images/eye.svg?a977c78883c376522a325821b6f43252"
12: "/images/form.svg?8ba0c582946536f5b22c921b67c2e555"
13: "/images/icon.svg?074f1259b150c21e0594b7a5909f039d"
14: "/images/international.svg?b878dfb3ca8e73831bd27b99924ae25f"
15: "/images/language.svg?cbbb682b1f7bf56d29824b5b685ab9b2"
16: "/images/lock.svg?794f1af16eb3cb62b6c8ae2531bb13d8"
17: "/images/message.svg?7e9b1314f74fa68760a6650166d50c28"
18: "/images/money.svg?bc3f3b159b65ca42688252ef6fc8b8d1"
19: "/images/password.svg?619b0ec97607fad9498378fc31caa5b1"
20: "/images/people.svg?b79eeb04187ecf607562c2c273832914"
21: "/images/peoples.svg?d9dfce72e4919a48cca0cecf2816400d"
22: "/images/qq.svg?c8ac28c368ffae7bacea69f8789a4a06"
23: "/images/shoppingCard.svg?ae60058940b790eb4c8dba6a936e52c3"
24: "/images/star.svg?2540aa8014a63c4fafa065c1cd0b6c05"
25: "/images/tab.svg?b0340256e08f61a9b2e9fd671f936bc9"
26: "/images/table.svg?2a4ac98dc809ad490c1915800814eb03"
27: "/images/theme.svg?e89638029e4dc5833b2c188f65b5f173"
28: "/images/user.svg?7c34a3277843c42b0f521da1ae18dda2"
29: "/images/wechat.svg?65024b23d2e9d30a6102daab01726aed"
30: "/images/zip.svg?80022cfb82b7afc4bcc77b5db3dc0632"`
而作者的却是
Array(31)
0
:
{default: BrowserSpriteSymbol, __esModule: true}
1
:
{default: BrowserSpriteSymbol, __esModule: true}
2
:
{default: BrowserSpriteSymbol, __esModule: true}
3
:
{default: BrowserSpriteSymbol, __esModule: true}
4
:
{default: BrowserSpriteSymbol, __esModule: true}
5
:
{default: BrowserSpriteSymbol, __esModule: true}
6
:
{default: BrowserSpriteSymbol, __esModule: true}
7
:
{default: BrowserSpriteSymbol, __esModule: true}
8
:
{default: BrowserSpriteSymbol, __esModule: true}
9
:
{default: BrowserSpriteSymbol, __esModule: true}
10
:
{default: BrowserSpriteSymbol, __esModule: true}
11
:
{default: BrowserSpriteSymbol, __esModule: true}
12
:
{default: BrowserSpriteSymbol, __esModule: true}
13
:
{default: BrowserSpriteSymbol, __esModule: true}
14
:
{default: BrowserSpriteSymbol, __esModule: true}
15
:
{default: BrowserSpriteSymbol, __esModule: true}
16
:
{default: BrowserSpriteSymbol, __esModule: true}
17
:
{default: BrowserSpriteSymbol, __esModule: true}
18
:
{default: BrowserSpriteSymbol, __esModule: true}
19
:
{default: BrowserSpriteSymbol, __esModule: true}
20
:
{default: BrowserSpriteSymbol, __esModule: true}
21
:
{default: BrowserSpriteSymbol, __esModule: true}
22
:
{default: BrowserSpriteSymbol, __esModule: true}
23
:
{default: BrowserSpriteSymbol, __esModule: true}
24
:
{default: BrowserSpriteSymbol, __esModule: true}
25
:
{default: BrowserSpriteSymbol, __esModule: true}
26
:
{default: BrowserSpriteSymbol, __esModule: true}
27
:
{default: BrowserSpriteSymbol, __esModule: true}
28
:
{default: BrowserSpriteSymbol, __esModule: true}
29
:
{default: BrowserSpriteSymbol, __esModule: true}
30
:
{default: BrowserSpriteSymbol, __esModule: true}`
可能就是这的问题,但是webpack.mix.js配置都没有问题,搞了一下午也没有搞出来,心累~
出现此问题的原因为:
laravel-mix 在 1.5 版本下默认将 svg 作为字体处理,且其默认配置的优先级高于 webpack.mix.js, 相关 issue 查看。
以下为解决办法:
node_modules/laravel-mix/src/builder/webpack-rules.js 中搜索 svg,并删除 svg 关键词。在项目下新建 webpack.config.js,文件内容如下:
const config = require('laravel-mix/setup/webpack.config');
// Exclude SVG from laravel-mix webpack config, we will handle them with vue-svg-loader
// See also: https://github.com/JeffreyWay/laravel-mix/issues/350
for (const rule of config.module.rules) {
if (rule.test.toString() == '/\\.(woff2?|ttf|eot|svg|otf)$/') {
rule.test = /\.(woff2?|ttf|eot|otf)$/;
}
}
module.exports = config;
webpack.mix.js 的规则配置如下:
rules: [
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [path.resolve(__dirname,'resources/assets/js/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [path.resolve(__dirname, 'resources/assets/js/icons/svg')],
options: {
limit: 10000,
name: ('images/[name].[hash:7].[ext]')
}
}
]
最后修改package.json 的配置文件引入位置:
"scripts": {
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=webpack.config.js"
},
此方案已通过本地测试 @JerryGreenLuan , 测试 laravel-mix 的最新 2.1 版本,出现大量错误遂放弃新版本的应用。
@Donng 昨天我看了laravel文档,自定义了webpack.config.js配置文件。可惜自定义之后,直接报错了。我用的laravel mix是2.0,估计也没什么好的解决方案了。也多谢您的帮助!
`//const req = require.context('./svg', false, /.svg$/);
const req = require.context('!svg-sprite-loader?{"symbolId":"icon-[name]"}!./svg', false, /.svg$/)`
看到另一个问题中的回答,我直接修改了icons/index.js,没想到就好了
@JerryGreenLuan 的方法可以。在说一下这个文件是 icons/index.js
我也遇到了,是单词写错了,把 symbolId 写成了 symbolld,你可以检查下拼写
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [path.resolve(__dirname,'./resources/assets/js/icons')],
options: {
symbolId: 'icon-[name]'
}
},
Most helpful comment
`//const req = require.context('./svg', false, /.svg$/);
const req = require.context('!svg-sprite-loader?{"symbolId":"icon-[name]"}!./svg', false, /.svg$/)`
看到另一个问题中的回答,我直接修改了icons/index.js,没想到就好了