How to add webpack style-loader nonce attribute to a craco config
Asked Answered
F

1

5

I'm trying to add the webpack style-loader nonce attribute to a craco config file, for a create-react-app, like this:

// craco.config.js
module.exports = {
  webpack: {
    module: {
      rules: [
        {
          test: /\.css$/i,
          use: [
            {
              loader: "style-loader",
              options: {
                attributes: {
                  nonce: "12345678",
                },
              },
            },
            "css-loader",
          ],
        },
      ],
    },
  },
};

but that didn't work. Does anyone if this can be achieved with craco and how?.

Farrington answered 6/12, 2020 at 1:5 Comment(0)
S
7

Problem

craco doesn't offer you to modify module.rules directly that way.

Solution

Instead it offers you webpack.configure method instead which takes following signature:

configure: (webpackConfig, { env, paths }) => { return webpackConfig; }

In order to override style-loader (only support development mode), you would need a few helper functions. Here is the idea for you:

// Import these helpers to figure out where the current loader located
const { getLoader, loaderByName } = require("@craco/craco");

module.exports = {
  webpack: {
    configure: (webpackConfig, { env, paths }) => { 
      
      if (env === 'development') {
        // your overridden `style-loader`
        const overrideOptions = {
          loader: "style-loader",
          options: {
            attributes: {
              nonce: "12345678",
            },
          },
        };

        // override `style-loader`
        const { isFound, match } = getLoader(webpackConfig, loaderByName('style-loader'));

        if (isFound) {
          match.parent[match.index] = overrideOptions;
        }
      }

      return webpackConfig; 
    },
  },
};

Srini answered 7/12, 2020 at 10:34 Comment(4)
why only in development?Typal
Also why do you go from the match, to the parent, back to the match with match.parent[match.index]? Why not just go match.loader? Serious question, I don't knowTypal
Good catch. I think you can try to set directly from match.loader.Srini
what will be the config for production?Lissner

© 2022 - 2024 — McMap. All rights reserved.