首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webpack 4与sass-加载程序和解析-url-加载程序-图像路径未被找到

Webpack 4与sass-加载程序和解析-url-加载程序-图像路径未被找到
EN

Stack Overflow用户
提问于 2018-04-12 16:28:01
回答 3查看 25.5K关注 0票数 13

这里的最低可重现性设置:https://github.com/jamesopti/webpack_playground/tree/resolve_url_loader_issue

我试图使用resolve-url-loader在我的scss url()图像路径中添加一个hashname,但是我花了很长时间才能让它与webpack 4一起工作。我在/static/img/**中有一堆图片在我的SCSS中引用如下:

代码语言:javascript
复制
span.arrow {
  background: url(/static/img/audiences.png);
}

它在我的css中以完全相同的方式结束(解析-url-加载器找不到它们)

当我通过webpack运行下面的配置时,我看到解析加载程序正在找到正确的url()及其路径,但是调试模式说找不到。

代码语言:javascript
复制
resolve-url-loader: /static/img/audiences.png
  /Users/usr1/webpack_playground/src
  /Users/usr1/webpack_playground/static/img
  NOT FOUND

是否有不正确的输出配置?我尝试过各种设置组合,但都没有效果:

代码语言:javascript
复制
  loader: 'resolve-url-loader',
  options: {
    debug: true,
    root: path.join(__dirname, './static/img'),
    includeRoot: true,
    absolute: true,
  },

我的最终目标是让文件加载器将它们转换为/dist哈希版本:

代码语言:javascript
复制
span.arrow {
  background: url(/static/img/audiences-dhsye47djs82kdhe6.png);
}

// Webpack规则配置

代码语言:javascript
复制
rules: [
      {
        test: /\.(png|jpg|gif)$/,
        include: [
          path.resolve(__dirname, './static/img'),
        ],
        use: {
          loader: 'file-loader',
          options: {
            name: '[name]-[hash].[ext]',
          },
        },
      },
      {
        test: /\.svg$/,
        use: {
          loader: 'svg-inline-loader',
          options: {
            name: '[name]-[hash].[ext]',
          },
        },
      },
      { test: /\/src\/js\/(?:.*)\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] },
      {
        test: [/\.scss$/, /\.sass$/],
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
            },
          },
          {
            loader: 'resolve-url-loader',
            options: {
              debug: true,
              root: './static/img',
              includeRoot: true,
            },
          },
          {
            loader: 'sass-loader',
            options: {
              outputStyle: 'compressed',
              sourceMap: true,
              includePaths: [
                './src'
              ],
            },
          },
        ],
      },
]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-25 20:50:43

结果我只需要file-loader来做我想做的事。

当任何css/ sass /样式加载器遇到一个图像(与我指定的文件扩展名匹配)时,它将通过file-loader处理,后者将其复制到指定的命名格式指定的输出目录中,并返回sass加载程序用作文件名的名称。

代码语言:javascript
复制
rules: [
  {
    test: /\.(png|jpg|gif|svg)$/,
    exclude: [
      path.resolve(__dirname, './node_modules'),
    ],
    use: {
      loader: 'file-loader',
      options: {
        name: '[path][name]-[hash].[ext]',
        outputPath: '../',
        publicPath: '/dist',
      },
    },
  },
  {
    test: /\.svg$/,
    include: [
      path.resolve(__dirname, './node_modules'),
    ],
    use: {
      loader: 'svg-inline-loader',
      options: {
        name: '[name]-[hash].[ext]',
      },
    },
  },
  { test: /\/src\/js\/(?:.*)\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] },
  {
    test: [/\.scss$/, /\.sass$/],
    use: [
      MiniCssExtractPlugin.loader,
      {
        loader: 'css-loader',
        options: {
          sourceMap: true,
          root: path.resolve(__dirname),
        },
      },
      {
        loader: 'postcss-loader',
        options: {
          ident: 'postcss',
          plugins: () => [
            autoprefixer({
              'browsers': ['last 2 versions', 'ie >= 10'],
            }),
          ],
          sourceMap: true,
        },
      },
      {
        loader: 'sass-loader',
        options: {
          outputStyle: 'compressed',
          sourceMap: true,
          includePaths: [
            './src/scss',
          ],
        },
      },
    ],
  },
  {
    test: /\.html$/,
    use: [
      {
        loader: 'html-loader',
        options: {
          root: path.resolve(__dirname),
        },
      },
    ],
  },
  {
    test: [
      /\/bundles\/(?:.*)\.js$/,
    ],
    use: {
      loader: 'babel-loader',
    },
  },
];
票数 7
EN

Stack Overflow用户

发布于 2019-07-25 13:15:19

实际上,有时候仍然需要解析-url加载器.这取决于您是否希望能够解析sass编译中导入的文件中的url()调用。如果没有它,urls就会在这种情况下被破坏。

但是,如果您不使用多文件scss构建(例如,如果每个组件只有一个scss文件本地,而不调用共享库、scss代码或某种类型的部分),那么您就不需要解析-url-加载器。

当然,您仍然需要url-加载器(带有内联功能的包装文件-loder)或文件加载器(用于将资产直接复制到dist文件夹)。

解决-url-加载程序通过重新处理sass发出的原始文件来工作,而sass加载程序在使用dart sass实现时确实存在源代码映射的问题。在本例中,源代码映射源将错误地被stdin替换为文件名,请参阅第671期PR 681中的修复程序。

从今天(2019年7月)起,这仍然是未发布的修补程序,唯一的选择是使用节点sass或使用未发布的sass加载程序。

票数 2
EN

Stack Overflow用户

发布于 2018-07-04 21:00:04

我也有过同样的问题。我相信你需要 url-loader会正确地加载Webpack 4的图片。这个设置对我是有效的:

代码语言:javascript
复制
rules: [
    {
        test: /\.(png|jpg)$/,
        loader: "url-loader",
    }, {        
        test: /\.(scss|css)$/,
        use: [
            "style-loader",
            "css-loader",
            "sass-loader",
        ]
    }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49801654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档