webpack css-loader删除url()中的领先斜线

发布于 2025-02-14 01:50:10 字数 3638 浏览 0 评论 0原文

我在SCSS文件中有一个路径设置到我需要从域根目录中引用的资源。问题是CSS-LOADER在构建过程中删除了领先的斜线,即使选项{url:false}

url('/path/to/file') -> url('path/to/file')

有什么想法,为什么这样做以及如何避免?谢谢。

编辑:应该提到我正在使用 create-react-app with react-app-rewired 。我的配置:

// config-overrides.js

const { override, adjustStyleLoaders } = require('customize-cra');

module.exports = override(
  adjustStyleLoaders(({ use: [, css] }) => {
    css.options = { ...css.options, url: false };
  })
);

console.log样式加载程序:

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: { importLoaders: 1, sourceMap: true, url: false }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: {
      importLoaders: 1,
      sourceMap: true,
      modules: [Object],
      url: false
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: { importLoaders: 3, sourceMap: true, url: false }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/resolve-url-loader/index.js',
    options: {
      sourceMap: true,
      root: '/Users/323782896/Documents/Projects/ReactUI/src'
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/sass-loader/dist/cjs.js',
    options: { sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: {
      importLoaders: 3,
      sourceMap: true,
      modules: [Object],
      url: false
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/resolve-url-loader/index.js',
    options: {
      sourceMap: true,
      root: '/Users/323782896/Documents/Projects/ReactUI/src'
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/sass-loader/dist/cjs.js',
    options: { sourceMap: true }
  }
]

可能是负责的其他加载程序之一吗?

I have a path set in a scss file to a resource I need referenced off the root of the domain. The problem is css-loader removes the leading slash during build, even with the option { url: false }.

url('/path/to/file') -> url('path/to/file')

Any ideas why it does this, and how to avoid? Thanks.

Edit: Should mention I'm using create-react-app with react-app-rewired. My configs:

// config-overrides.js

const { override, adjustStyleLoaders } = require('customize-cra');

module.exports = override(
  adjustStyleLoaders(({ use: [, css] }) => {
    css.options = { ...css.options, url: false };
  })
);

console.log of style loaders:

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: { importLoaders: 1, sourceMap: true, url: false }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: {
      importLoaders: 1,
      sourceMap: true,
      modules: [Object],
      url: false
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: { importLoaders: 3, sourceMap: true, url: false }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/resolve-url-loader/index.js',
    options: {
      sourceMap: true,
      root: '/Users/323782896/Documents/Projects/ReactUI/src'
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/sass-loader/dist/cjs.js',
    options: { sourceMap: true }
  }
]

[
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/mini-css-extract-plugin/dist/loader.js',
    options: {}
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/css-loader/dist/cjs.js',
    options: {
      importLoaders: 3,
      sourceMap: true,
      modules: [Object],
      url: false
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/postcss-loader/src/index.js',
    options: { ident: 'postcss', plugins: [Function: plugins], sourceMap: true }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/resolve-url-loader/index.js',
    options: {
      sourceMap: true,
      root: '/Users/323782896/Documents/Projects/ReactUI/src'
    }
  },
  {
    loader: '/Users/323782896/Documents/Projects/ReactUI/node_modules/sass-loader/dist/cjs.js',
    options: { sourceMap: true }
  }
]

Could it possibly be one of the other loaders responsible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆沫 2025-02-21 01:50:10

事实证明,这是resolve-url-loader,特别是 root 选项设置为项目SRC由CRA。

类似于CSS-LOADER中的(现在已停用)选项。
该字符串可能是空的,被固定到绝对的uris。
仅在设置此选项时才处理绝对URI。

不确定它是如何变化的,但这只会在升级到CRA V4后才成为我的问题。无论如何,以下调整(删除root选项)似乎可以解决问题:

// config-overrides.js

const { override, adjustStyleLoaders } = require('customize-cra');

module.exports = override(
  adjustStyleLoaders(({ use: [miniExtract, css, postcss, resolveUrl, sass] }) => {
    css.options = { ...css.options, url: false };
    if (resolveUrl) {
      delete resolveUrl.options.root;
    }
  })
);

Turns out it was the resolve-url-loader, particularly the root option set to the project src by CRA.

Similar to the (now defunct) option in css-loader.
This string, possibly empty, is prepended to absolute URIs.
Absolute URIs are only processed if this option is set.

Not sure exactly how or when this changed, but this only became a problem for me after upgrading to CRA v4. In any case, the following adjustment (removing the root option) seemed to do the trick:

// config-overrides.js

const { override, adjustStyleLoaders } = require('customize-cra');

module.exports = override(
  adjustStyleLoaders(({ use: [miniExtract, css, postcss, resolveUrl, sass] }) => {
    css.options = { ...css.options, url: false };
    if (resolveUrl) {
      delete resolveUrl.options.root;
    }
  })
);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文