Webpack SASS加载程序无法重复使用常见的SCSS导入

Jay*_*Jay 11 sass node-sass webpack webpack-dev-server

我有以下结构:

node_modules
  - my_component
    - font
    - scss
      - my_component.scss
src
  - my_app.js
  - my_app.scss
Run Code Online (Sandbox Code Playgroud)

我正在尝试导入样式my_component.scss.该文件包含@font-face引用的声明../font/.所以类似于:

// my_component.scss
@font-face {
  font-family: 'Helvetica Neue';
  font-weight: $weight-medium;
  src: url('../font/font-file.eot');
}
Run Code Online (Sandbox Code Playgroud)

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

// my_app.js

require('./my_app.scss');

//other app-specific code
Run Code Online (Sandbox Code Playgroud)

我是my_app.scss,我正在进口my_component.scss:

// my_app.scss

import 'my_component';
Run Code Online (Sandbox Code Playgroud)

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

我的loader配置使用sass-loader,resolve-url-loadercss-loader.这是一个片段:

//loaders.js

loaders.push({
  test: /\.scss$/,
  loader: 'style!css?sourcemap!resolve-url!sass?sourceMap'
});
Run Code Online (Sandbox Code Playgroud)

这是我观察到的:

  1. 当我运行时webpack-dev-server,url引用正确解析
  2. 但是,当我webpack使用相同的conf文件运行时,我进入Module not found: Error: Cannot resolve 'file' or 'directory' ../font/font-file.ttfsrc/font/

我试过的事情:

  1. 使用$font-path变量来引用../fonts和设置它node_modules/my_components/font
  2. 检查我的加载器的顺序,更新我的webpack版本等.

更新

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

node-sass反复导入每个@import而不进行任何类型的重复数据删除(我知道它不应该自己做).但是node-sass-import-once这是针对这种事情的,打破了resolve-url-loader.

这是我的问题:

  1. 为什么node-sass-import-once会破坏Webpack resolve-url-loader?
  2. 有没有办法重复导入Webpack并获得生成的CSS免费样式复制?

Mat*_*ick 3

如果没有看到你的 Webpack 配置,我只能大胆猜测,但看起来你正在尝试从node_modules.

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

css @import 是相对于当前目录的。为了解决“像模块一样”的问题,您可以添加前缀 ~。

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

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

// webpack.config.js
resolve: {
  alias: {
    styles: 'src/styles/'
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用波形符导入:

// y.css
@import `~styles/x.scss
Run Code Online (Sandbox Code Playgroud)

如果这有效,那么您无需删除node-sass-import-once,一切都会正确解决。