【问题标题】:Webpack: load images from inline style (background-image)Webpack:从内联样式加载图像(背景图像)
【发布时间】:2017-10-21 03:50:28
【问题描述】:

我在使用 webpack 加载图像时遇到问题。

当我在 html 页面上使用图像标签时,一切正常:

 <img src="../../content/images/logo.png">

但我也需要使用内联样式:

<div style="background-image: url('../../content/images/logo.png')">

在这种情况下,webpack 不会解析图像并保持url() 中的字符串不变。

Webpack 配置:

        module: {
        rules: [
            { test: /bootstrap\/dist\/js\/umd\//, loader: 'imports-loader?jQuery=jquery' },
            {
                test: /\.ts$/,
                loaders: [
                    'angular2-template-loader',
                    'awesome-typescript-loader'
                ],
                exclude: ['node_modules/generator-jhipster']
            },
            {
                test: /\.html$/,
                loader: 'html-loader',
                options: {
                    minimize: true,
                    caseSensitive: true,
                    removeAttributeQuotes:false,
                    minifyJS:false,
                    minifyCSS:false
                },
                exclude: ['./src/main/webapp/index.html']
            },
            {
                test: /\.scss$/,
                loaders: ['to-string-loader', 'css-loader', 'sass-loader'],
                exclude: /(vendor\.scss|global\.scss)/
            },
            {
                test: /(vendor\.scss|global\.scss)/,
                loaders: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
            },
            {
                test: /\.css$/,
                loaders: ['to-string-loader', 'css-loader'],
                exclude: /(vendor\.css|global\.css)/
            },
            {
                test: /(vendor\.css|global\.css)/,
                loaders: ['style-loader', 'css-loader']
            },
            {
                test: /\.(jpe?g|png|gif|svg|woff2?|ttf|eot)$/i,
                loaders: ['file-loader?hash=sha512&digest=hex&name=/images/[hash].[ext]']
            }
        ]
    },

如果有人能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

标签: javascript webpack webpack-2 webpack-html-loader


【解决方案1】:

在 webpack 5 上,正确的答案是使用你的 html-loader

改变你的内联样式:

 ## Heading ##<div background-image="../../content/images/logo.png">

还有你的html-loader:

  {
    test: /\.html$/i,
    loader: 'html-loader',
    options: {
      minimize: true,
      attributes: {
        list: [
          '...',// All default supported tags and attributes
          {
            tag: 'div',
            attribute: 'data-background',
            type: 'src',
          }
        ]
      }
    }
  }

Here 了解更多详情。

【讨论】:

    【解决方案2】:

    非常基本的:

    <div class="background-design-element" style="background-image: url('<%= require('./../assets/images/test.jpg') %>')"></div>
    

    关键是要记住: 它实际上可以这么简单 - :-)

    【讨论】:

      【解决方案3】:

      对我来说最直接的解决方案是在 Webpack 中使用 interpolate 选项,如 this answer 中所述。

      {
        test: /\.(html)$/,
        include: path.join(__dirname, 'src/views'),
        use: {
          loader: 'html-loader',
          options: {
            interpolate: true
          }
        }
      }
      

      然后在你的 HTML 中

       <div style="background-image: url('${require('../../content/images/logo.png')')">
      

      【讨论】:

        【解决方案4】:

        其他解决方案是(如果您不想使用插值标志)

        $scope.imageToUse =  require(`../../content/images/logo.png`)
        

        在你的控制器中

        直接在后台使用:url({{imageToUse }})

        在内部,webpack 会将图像编码为 base64,并将其分配给 imageToUse 变量,该变量将呈现到您的 html 页面。

        此解决方案与在 Angular 1.X 项目中实现 webpack 有关。类似的方法可以应用于其他情况。

        【讨论】:

          【解决方案5】:

          在 Google 上搜索自己的解决方案,并决定制作一个装载机。 https://github.com/apotap2/url-replace-loader 它只有 20 行代码:D 它只是将 every 'url(.*)' 替换为 require(),因此您可以将它与文件加载器一起使用。如果您需要更复杂的逻辑,似乎自己制作加载器会更快。

          【讨论】:

          • 您好,我不确定如何安装您的装载机。我只习惯用 npm 安装:/ 你能帮我吗?我假设您只需将“url-replace-loader-master”重命名为“url-replace-loader”并将其放入 node_modules。但在那之后我无法让它工作。
          • 你可以通过 npm install 从 git repos 安装:npm install url#branch,所以在我的情况下它可以是 npm install https://github.com/apotap2/url-replace-loader
          【解决方案6】:

          您可能需要带有interpolation flag enabled 的“html”文件:

          require("html-loader?interpolate!./your-file.html");
          

          ...然后需要您的内联样式背景图片,例如:

          <div style="background-image: url('${require(`../../content/images/logo.png`)}')">
          

          【讨论】:

          • 很好,在这种情况下不知道${require('')}。谢谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-20
          • 1970-01-01
          • 2016-10-20
          • 1970-01-01
          • 1970-01-01
          • 2021-07-01
          • 1970-01-01
          相关资源
          最近更新 更多