Webpack SASS 加载器无法对常见的 SCSS 导入进行重复数据删除

Posted

技术标签:

【中文标题】Webpack SASS 加载器无法对常见的 SCSS 导入进行重复数据删除【英文标题】:Webpack SASS loader cannot dedupe common SCSS imports 【发布时间】:2016-08-23 22:01:05 【问题描述】:

我有以下结构:

node_modules
  - my_component
    - font
    - scss
      - my_component.scss
src
  - my_app.js
  - my_app.scss

我正在尝试导入my_component.scss 中的样式。此文件包含引用../font/@font-face 声明。所以像:

// my_component.scss
@font-face 
  font-family: 'Helvetica Neue';
  font-weight: $weight-medium;
  src: url('../font/font-file.eot');

my_app.js 中,我需要与之关联的 SCSS 文件。所以

// my_app.js

require('./my_app.scss');

//other app-specific code

我是my_app.scss,我正在导入my_component.scss

// my_app.scss

import 'my_component';

并且sassConfig 设置为解析为node_modules/my_component/scss,以便导入工作。

我的加载器配置使用sass-loaderresolve-url-loadercss-loader。这是一个sn-p:

//loaders.js

loaders.push(
  test: /\.scss$/,
  loader: 'style!css?sourcemap!resolve-url!sass?sourceMap'
);

这是我观察到的:

    当我运行 webpack-dev-server 时,url 引用正确解析 但是,当我使用相同的 conf 文件运行 webpack 时,我在 src/font/ 中得到 Module not found: Error: Cannot resolve 'file' or 'directory' ../font/font-file.ttf

我尝试过的事情:

    使用$font-path 变量来引用../fonts 并将其设置为node_modules/my_components/font 检查加载程序的顺序,更新我的 webpack 版本等。

更新

我的sassLoader 配置之前有node-sass-import-once 的配置。当我删除它时,我的字体网址再次开始解析,但是我生成的 CSS 包含大量重复的样式。

node-sass 重复导入每个 @import 而不进行任何类型的重复数据删除(我知道它不应该能够自行完成)。但是用于此类事情的node-sass-import-once 破坏了resolve-url-loader。

这是我的问题:

    为什么 node-sass-import-once 会破坏 Webpack resolve-url-loader? 有没有什么方法可以对导入的 Webpack 进行重复数据删除,并在生成的 CSS 中避免样式重复?

【问题讨论】:

【参考方案1】:

没有看到你的 Webpack 配置,我只能冒险猜测,但看起来你正试图从 node_modules 导入 CSS 文件。

当您想从 node_modules 导入 CSS 时,您可能必须使用 ~。正如 sokra 本人在this issue 中所说:

css @import 是相对于当前目录的。为了解决“像一个模块”你可以前缀〜。

所以也许像@import `~module/my_component.scss`; 这样的东西可以解决问题。

以这种方式解决导入还解决了我遇到的一个问题,即x.js 需要x.css 并在x.css 导入一些 sass 变量配置时由y.css 导入。在 Webpack 配置中使用 resolve.alias 我可以简单地执行以下操作:

// webpack.config.js
resolve: 
  alias: 
    styles: 'src/styles/'
  

然后使用波浪号导入:

// y.css
@import `~styles/x.scss

如果这可行,那么您无需删除node-sass-import-once,一切都应该正确解决。

【讨论】:

我会试一试,但波浪号导入几乎从未对我有用。将使用我的 webpack 配置进行更新。是的,我正在尝试从 node_modules 导入 看来我只剩下几分钟来奖励赏金了。感谢您查看问题并尝试回答,我会将其奖励给您,但我会留给其他人稍后回答。

以上是关于Webpack SASS 加载器无法对常见的 SCSS 导入进行重复数据删除的主要内容,如果未能解决你的问题,请参考以下文章

Sass 加载器无法使用 Encore webpack 和 Symfony 5 加载 url

Webpack 中 CSS / SASS 的加载器

Webpack:无法解析模块“文件加载器”

Sass 加载器在 webpack 中不起作用

Sass - 为从文件导入的所有类添加前缀(使用 sass 导入或 webpack 加载器)

Webpack 无法加载 *.sass 文件