Angular css 中的内联资源作为数据 URI

Angular inline resources in css as data-uri

在 Angular 应用程序中是否有任何方法可以在不弹出 webpack 配置的情况下拥有内联资源,如 CSS 后台属性中的 SVG?

我已经尝试自定义 webpack 构建器来删除内置文件加载器规则并添加 uri-loader,但是,SVG 没有内联。

我怀疑它可能与使用 postcss 的内部 SCSS/CSS 处理有某种关系。

如您所说,url-loader 不处理样式文件中的 url。为此,您需要使用 postcss-url package.

要在不弹出的情况下使用自定义 webpack 配置,您需要安装 this package。使用该包中提供的说明配置您的工作区后,您可以使用以下 webpack 配置:

const url = require('postcss-url');    
const urlPlugin = url([{ filter: '**/*.svg', url: 'inline' }]);
    
module.exports = config => {
  for (const rule of config.module.rules) {
      const loader = rule.use && rule.use.find(x => x.loader === 'postcss-loader');
      if (loader) {
          loader.options.plugins = [urlPlugin];
      }
  }
    
  return config;
};

基本上,此代码将 postcss-url 插件添加到 Angular 的默认 webpack 配置中的每个 postcss-loader

您可以编辑此配置以根据您的需要进行自定义。例如,您可以使用 maxSize 参数来排除大于特定大小的文件。阅读 postcss-url repo 了解所有选项。

Zygimantas 编辑:

我接受你的回答是正确的并添加 webpack.config.ts

的 Typescript 版本
import { Configuration, NewLoader } from 'webpack'
import * as PostCssUrlPlugin from 'postcss-url'

export default (config: Configuration) => {
    if (config.module === undefined) {
        throw new Error()
    }

    let patched = false
    for (const rule of config.module.rules) {
        if ('use' in rule && Array.isArray(rule.use)) {
            const loader = rule.use.find(
                (a): a is NewLoader =>
                    typeof a !== 'string' &&
                    'options' in a &&
                    a.loader !== undefined &&
                    a.loader.includes('postcss-loader'),
            )

            if (loader !== undefined && loader.options !== undefined) {
                loader.options.plugins = [PostCssUrlPlugin([{
                  filter: '**/*.svg',
                  url: 'inline',
                }])]

                patched = true
            }
        }
    }

    if (!patched) {
        throw new Error('Could not patch webpack configuration')
    }

    return config
}

注意:

在 Javascript 版本中,我不得不使用 x.loader.includes('postcss-loader') 而不是 x.loader === 'postcss-loader' 因为 loader 值是我的完整路径。