将 webpack(环境)变量传递给 scss 文件

Ver*_* C. 2 javascript css sass webpack

对 webpack 非常陌生...我希望能够读取一个值,在这种情况下,特别是文件中envfrom的值,因此我可以根据环境使用不同的 css。webpack.config.jssass

例如:

  • env = 发展,颜色 = 绿色
  • env = 生产,颜色 = 蓝色

到目前为止,我一直专注于 sass-loader,试图传递数据,但没有奏效,$env我运行时变量始终未定义npm run build:Debug(此运行webpack --app=all --env=development)。

这些是我拥有的文件:

webpack.config.js

const path = require("path");
const common = require("./.webpack/webpack.common.config");

const config = [];

function addAppConfig(app) {
    app.module = common.module;
    app.resolve = common.resolve;
    config.push(app);
}

module.exports = (env, argv) => {
    switch (argv.app) {
    // Add new configs to below
    case "a":
        addAppConfig(aa);
        break;

    case "b":
        addAppConfig(bb);
        break;

    case "c":
        addAppConfig(cc);
        break;
        
    default:
    case "all":
        addAppConfig(xyz);
    }

    switch (env) {
    case "local":
        config.forEach(appConfig => {
            // The "development" mode configuration option tells webpack to use its built-in development optimizations
            // https://webpack.js.org/configuration/mode/#mode-development
            appConfig.mode = "development";
            appConfig.output.path = path.resolve(__dirname, "../dist");
            appConfig.output.publicPath = "http://localhost:3000/dist";
            appConfig.devtool = "inline-source-map";
            appConfig.devServer = {
                contentBase: path.resolve(__dirname, "./public"),
                port: "3000",
                watchContentBase: true
            };
        });

        break;

    case "development":
        config.forEach(appConfig => {
            // The "development" mode configuration option tells webpack to use its built-in development optimizations
            // https://webpack.js.org/configuration/mode/#mode-development
            appConfig.mode = "development";
            appConfig.devtool = "inline-source-map";
        });

        break;

    default:
    case "production":
        config.forEach(appConfig => {
            // The "production" mode configuration option tells webpack to use its built-in production optimizations including minification etc.
            // https://webpack.js.org/configuration/mode/#mode-production
            appConfig.mode = "production";
            appConfig.devtool = "cheap-source-map";
        });

        break;
    }

    return config;
};
Run Code Online (Sandbox Code Playgroud)

webpack.common.config.js - 在 webpack.config.js 中使用

module.exports = {
    module: {
        rules: [
            {
                test: /\.jsx?$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            },
            {
                test: /\.(s*)css$/,
                use: [
                    {
                        loader: "file-loader",
                        options: {
                            name: "[name].css"
                        }
                    },
                    "extract-loader",
                    "css-loader",
                    "sass-loader"
                ]
            },
            {
                test: /\.(png|jp(e*)g)$/,
                use: [
                    {
                        loader: "url-loader",
                        options: {
                            // Convert images < 8kb to base64 strings
                            limit: 8000,
                            name: "images/[name].[ext]"
                        }
                    }
                ]
            },
            {
                test: /\.(svg)$/,
                use: [
                    {
                        loader: "url-loader",
                        options: {
                            // 80kb limit to avoid an IE11 display bug
                            limit: 80000,
                            name: "images/[name].[ext]"
                        }
                    }
                ]
            },
            {
                test: /\.(woff|woff2|eot|ttf)$/,
                use: [
                    {
                        loader: "url-loader",
                        options: {
                            // Convert images < 8kb to base64 strings
                            limit: 8000,
                            name: "fonts/[name].[ext]"
                        }
                    }
                ]
            }
        ]
    },
    resolve: {
        extensions: [".js", ".jsx"]
    }
};
Run Code Online (Sandbox Code Playgroud)

最后:document.scss

.aside__left, .aside__right {
    @if $env == 'development' {
        background-color: red; 
      } @else {
        background-color: green;
      }
      background-color: $desiredColor;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让 scss 变量映射/从 webpack 配置传递,或者任何其他基于环境的方式,会生成不同的 css?

ant*_*kiy 6

您可以使用以下方法将变量从 webpack 配置传递到 scss 文件:

{
    loader: "sass-loader",
    options: {
        data: "$var1: " + yourVar1+ ";"
    }
}
Run Code Online (Sandbox Code Playgroud)

(c) https://github.com/webpack-contrib/sass-loader/issues/49#issuecomment-284131561

  • 这不再有效:` - options 有一个未知的属性“data”。这些属性是有效的:object {implementation?, sassOptions?,additionalData?,sourceMap?,webpackImporter? }` 文档还明确提到 `data` 被忽略 https://webpack.js.org/loaders/sass-loader/#sassoptions (3认同)

Kus*_*eth 6

这个问题已经得到解答并且是正确的,但实际上我搜索了很多以确定如何在 SASS 文件中使用它并将 SASS 与 webpack env 连接。我想将其添加到我的答案中。

包.json

这里我们在 webpack.config.js 中添加 NODE_ENV 变量。添加env到package.json请参考:webpackenvironmentconfiguration

"build:dev": "webpack --env.NODE_ENV=dev --config  webpack.config.js --progress",
Run Code Online (Sandbox Code Playgroud)

webpack.config:

现在,在此处添加您要根据环境使用的变量。就像,我想将环境添加到背景图像的动态 url 中。

{
    loader: "sass-loader",
    options: {
        data: "$var1: " + env.NODE_ENV + ";"
    }
}
Run Code Online (Sandbox Code Playgroud)

_变量.scss

您可以通过任何一种方式在 .sass 文件中使用它:

"build:dev": "webpack --env.NODE_ENV=dev --config  webpack.config.js --progress",
Run Code Online (Sandbox Code Playgroud)
$image-url: "https://#{$var1}.mysite.net/images/ping.jpg";
Run Code Online (Sandbox Code Playgroud)

输出

你的输出网址将是这样的:

https://dev.mysite.net/images/ping.jpg
Run Code Online (Sandbox Code Playgroud)

  • 请注意,sass-loader v8 的“data”已更改为“prependData”:https://github.com/webpack-contrib/sass-loader/issues/760 (4认同)