Webpack QuillJS 输出 SVG 路径而不是内联它

Posted

技术标签:

【中文标题】Webpack QuillJS 输出 SVG 路径而不是内联它【英文标题】:Webpack QuillJS outputs SVG path instead of inlining it 【发布时间】:2019-03-08 01:50:48 【问题描述】:

我正在尝试使用 Symfony-Encore 安装 QuillJS。 不知何故,工具栏的 SVG 图标没有按预期加载。

输出只是显示了 SVG 的路径:

<span class="ql-formats">
    <button type="button" class="ql-bold">/build/images/bold.89e9c638.svg</button>
    <button type="button" class="ql-italic">/build/images/italic.b802b8f9.svg</button>
</span>

如何解决此路径并嵌入或链接相应的 svg-icon? 我猜是缺少某种加载器配置,或者像这样。

我将 Quill 作为单独的组件嵌入:

import Quill from 'quill/core';
// ... more quill packages

编辑:

我添加了 html-Loader 以使用此配置将 svg 内联到我的 HTML 中:


    test: /\.svg$/,
    use: [
        loader: 'html-loader',
        options: 
            minimize: true
        
    ]

我现在收到此错误。

未找到这些相关模块:

../assets/icons/align-left.svg in ./node_modules/quill/ui/icons.js ../assets/icons/align-center.svg in ./node_modules/quill/ui/icons.js ../assets/icons/align-right.svg in ./node_modules/quill/ui/icons.js ../assets/icons/background.svg in ./node_modules/quill/ui/icons.js ../assets/icons/align-justify.svg 在 ./node_modules/quill/ui/icons.js ...

路径主题正确。我完全不知道这里出了什么问题。

感谢您的帮助:-)

【问题讨论】:

你找到解决这个问题的方法了吗? 你有什么解决办法吗? 【参考方案1】:

您需要通过添加 .disableImagesLoader() 来禁用标准图像加载器,并添加您自己的(不包括 Quill 资产)。我做了以下工作,改编自 this issue,它是为 CKEditor 做的:

.disableImagesLoader()
.addRule(
    test: /\.(svg|png|jpg|jpeg|gif|ico)/,
    exclude: /node_modules\/quill\/assets\/icons\/(.*)\.svg$/,
    use: [
        loader: 'file-loader',
        options: 
            filename: 'images/[name].[hash:8].[ext]',
            publicPath: '/build/'
        
    ]
)

.addLoader(
    test: /node_modules\/quill\/assets\/icons\/(.*)\.svg$/,
    loader: 'html-loader',
    options: 
        minimize: true
    
)

【讨论】:

【参考方案2】:

如果您的问题涉及 Laravel Mix:on GitHub there is a discussion 关于 Mix 本身的问题,and a solution 涉及修改您的 webpack.mix.js 文件,如下所示:

mix.extend('quill', webpackConfig => 
    const  rules  = webpackConfig.module;

    // 1. Exclude quill's SVG icons from existing rules
    rules.filter(rule => /svg/.test(rule.test.toString()))
        .forEach(rule => rule.exclude = /quill/);

    // 2. Instead, use html-loader for quill's SVG icons
    rules.unshift(
        test: /\.svg$/,
        include: [path.resolve('./node_modules/quill/assets')],
        loaders: [ loader: 'html-loader', options:  minimize: true  ]
    );

    // 3. Don't exclude quill from babel-loader rule
    rules.filter(rule => rule.exclude && rule.exclude.toString() === "/(node_modules|bower_components)/")
        .forEach(rule => rule.exclude = /node_modules\/(?!(quill)\/).*/);
);

// …

mix.js(/* ... */)
   .quill()

【讨论】:

将第 2 步,html 加载器部分替换为:const quillIconsRegex = /node_modules\/quill\/assets\/icons\/(.*)\.svg$/rules.push( test: quillIconsRegex, use: [ loader: 'html-loader', options: minimize: true ], )【参考方案3】:

您是否将 svg 添加到 webpack 配置中允许的文件扩展名?

resolve: 
    // Which file extensions to load
    extensions: ['.ts', '.js', '*.js', '.css', '*.css', '.json', '*.json', '.svg', '*.svg'],

【讨论】:

以上是关于Webpack QuillJS 输出 SVG 路径而不是内联它的主要内容,如果未能解决你的问题,请参考以下文章

webpack需要动态文件路径?

来自公共路径的 Webpack 原始加载器?

vue.config.js更细粒度的配置webpack

Webpack SVG 渐变问题

如何将matplotlib图的输出作为SVG?

如何使用 webpack 设置内联 svg