如何避免在 Webpack 上重复 sass 导入(使用 @use)

Cha*_*ark 2 import sass typescript webpack sass-loader

我的 sass 模块可以像下面这样相互导入。

// LinearLayout.scss
@mixin LinearLayout { ... }
linear-layout { @include LinearLayout; }

// ScrollView.scss
@use "LinearLayout" as *;
@mixin ScrollView {
    @include LinearLayout;
    ...
}
scroll-view { @include ScrollView; }
Run Code Online (Sandbox Code Playgroud)

并且由于每个sass 模块都通过在脚本中导入而最终出现在捆绑的 css 文件中,因此捆绑的 css 文件包含重复的 css 选择器。

如何删除重复项?

Cha*_*ark 6

两个 Webpack 版本下的共同需求

我还没有深入研究这个问题,但似乎这两个插件都在由mini-css-extract-plugin. 所以你不能使用style-loader,它所做的事情可以通过html-webpack-plugin来完成。

下面是你webpack.config.ts应该是什么样子。请注意,您设置optimization.minimize为 true 以使其也在开发中运行。

import type Webpack from "webpack";
import HtmlBundler from "html-webpack-plugin";
import CssExtractor from "mini-css-extract-plugin";

// webpack@5
import CssMinimizer from "css-minimizer-webpack-plugin";
// under webpack@5
import CssMinimizer from "optimize-css-assets-webpack-plugin";

const config: Webpack.Configuration = {
    ...
    plugins: [
        new HtmlBundler({
            template: "yourHtmlTemplate.html"
        });
        new CssExtractor({
            filename: "outputCssFilename.css",
        }),
    ],
    module: {
        rules: [
            {
                test: /\.s[ac]ss$/,
                use: [
                    CssExtractor.loader,
                    "css-loader",
                    "resolve-url-loader",
                    "sass-loader",
                ]
            },
        ],
    },
    optimization: {
        minimize: true, // set true to run minimizers also in development
        minimizer: [
            new CssMinimizer(),
        ],
    },
};

export default config;
Run Code Online (Sandbox Code Playgroud)

  • sass 文档中我最喜欢的部分是:“@use 仅加载每个文件一次。这可以确保您不会意外多次重复依赖项的 CSS。” 这显然与事实相差甚远。 (2认同)