强制 sass-loader 修改 css 文件

Posted

技术标签:

【中文标题】强制 sass-loader 修改 css 文件【英文标题】:Force sass-loader to modify css files 【发布时间】:2018-11-27 03:36:32 【问题描述】:

我正在尝试配置sass-loader,因此它会像.scss 一样转换.css 文件。然而,它总是按原样输出 css 文件。

这是最低限度的设置:

package.json


  "dependencies": 
    "css-loader": "^0.28.11",
    "node-sass": "^4.9.0",
    "sass-loader": "^7.0.3",
    "webpack": "^4.12.0",
    "style-loader": "^0.21.0",
    "webpack-cli": "^3.0.3",
    "mini-css-extract-plugin": "^0.4.0"
  

webpack.config.js

const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = 
  entry: "./main.sass",
  resolve: 
    extensions: ['.sass', '.css'],
  ,
  plugins: [new MiniCssExtractPlugin()],
  module: 
    rules: [
      
        test: /\.sass$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader",
          "sass-loader?indentedSyntax",
        ]
      ,
      
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader",
          "sass-loader",
        ]
      ,
    ],
  ,
;

a.fff(让我们看看如果 sass-loader 面临未知扩展会发生什么):

.black 
    background-color: black

b.css

.red 
    background-color: red

ma​​in.sass

body
    @import "./a.fff"
    @import "./b.css"

好的。现在让我们运行它node ./node_modules/webpack/bin/webpack.js,并检查 dist/main.css

.red 
    background-color: red


body  
  body .black 
    background-color: black; 

如您所见,a.fff 已正确转换,但 css 只是按原样粘贴。我想得到的是:

body  
  body .black 
    background-color: black; 
  body .red 
    background-color: red; 

有什么办法可以强制 sass-loader 以 .scss 的身份威胁 .css 文件?

【问题讨论】:

我认为不同的扩展都被硬编码到 sass-loader 中:like here 也许你可以直接在 loader-pipeline 中将 rename them 写入 .scss,然后将它们提供给 sass-loader ? 我希望可以,所以我不会浪费太多时间,问题是css 文件位于第三方库中,就像这里github.com/isagalaev/highlight.js/tree/master/src/styles 是的,但是在加载器中执行它可能看起来像 test: /\.css$/, use: [ MiniCssExtractPlugin.loader, "css-loader", "sass-loader", loader: "rename-loader", optionsfilename:"[name].scss' ] , 虽然这只是猜测,但它是一个非常小的加载器,所以我想知道定制有多难。github.com/ax-schneider/rename-loader/blob/master/index.js 我已经尝试过了,并把它放在上面的例子中,它没有用:(关于重命名的想法很棒。我想我可以在代码中像@import 'runTimefile.scss'一样添加类似@ 987654343@你有草图可以完成吗? 【参考方案1】:

好的,你会喜欢这个答案的......

body
    @import "./a.fff"
    @import "./b"

是的,省略扩展名将解析 ./b.css 并将其视为 scss 语法。 把你的薪水寄给我。 ;)

奖金琐事: 你的第二条规则 test: /\.css$/, 永远不会捕获任何东西,因为 @imports 完全由 sass-loader/node-sass 处理,所以在第一个 sass 规则启动后 webpack 永远不会参与。

【讨论】:

【参考方案2】:

您可以尝试以下方法,因为这是我使用的,我猜它提供了您正在寻找的输出。但是我使用的是scss 而不是sass

test: /\.sass$/,
use: [
    MiniCSSExtractPlugin.loader,
    
        loader: 'css-loader',
        options: 
            minimize: process.env.NODE_ENV === 'production'
        
    ,          
    'sass-loader'
]

plugins: [
    new MiniCSSExtractPlugin( 
        filename: 'dist/css/[name].css' // Specify output path and file name
    )

命令:

"dev": "./node_modules/.bin/webpack --config webpack.config.js --mode=development -w",

【讨论】:

如果我指定任何文件名,但在 imports 中 .css ,它会正确转换,请参阅我的示例中的 .a.fff 。问题是,我从 3rd 方库导入 css,它没有 .scss 文件。我看不出您的代码与我的代码有何不同。 也许您可以导入body之前的文件,然后在正文中展开类。 好主意,但我不知道 3rd-party lib 中列出了哪些类(我的意思是它可能是 .red,也可能是 .cyan),有什么方法可以解决未知上课? 第 3 方库是您通过直接 url 包含的东西,还是您下载的文件。如果您已经下载了该库,您可以简单地将其重命名为_b.scss,因此它是部分的。然后它应该工作:***.com/questions/24307455/… 您的意思是将文件从node_modules 复制到源目录吗?我想避免它。

以上是关于强制 sass-loader 修改 css 文件的主要内容,如果未能解决你的问题,请参考以下文章

webpack sass-loader 未生成 css 文件

带有 Webpack 的 sass-loader 不会生成 CSS

Webpack、sass-loader(或 css-loader)在 node_modules 中嵌套文件导入。文件未找到

Webpack sass-loader,css-loader 在 scss 文件中与 font-face 中断

css-loader,sass-loader 不工作 webpack 2

八、sass-loader的使用 ------ 2019-04-23