usando dotenv con react e webpack

Oct 22 2020

Sto trovando informazioni che puoi usare dotenv con react using

import React from "react"
console.log(process.env.REACT_APP_API_KEY)

tuttavia quando creo il mio .envfile nella directory principale della mia direzione ottengo un undefinedmessaggio nella console.

Dovrei notare che NON sto usando react-create-app.

Ecco il mio .envfile

REACT_APP_API_KEY=secretKey

Ecco il mio file di configurazione del webpack.

C'è un modo per usare dotenv senza usare node.js e creare un piccolo server.

const currentTask = process.env.npm_lifecycle_event;
const path = require("path");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { postcss } = require("postcss-mixins");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const fse = require("fs-extra");

const postCSSPlugins = [
  require("postcss-import"),
  require("postcss-mixins"),
  require("postcss-simple-vars"),
  require("postcss-nested"),
  require("postcss-hexrgba"),
  require("autoprefixer")
];

class RunAfterCompile {
  apply(compiler) {
    compiler.hooks.done.tap("Copy images", function () {
      fse.copySync("./app/assets/images", "./docs/assets/images");
    });
  }
}

let cssConfig = {
  test: /\.css$/i, use: [ "css-loader?url=false", { loader: "postcss-loader", options: { plugins: postCSSPlugins } } ] }; let pages = fse .readdirSync("./app") .filter(function (file) { return file.endsWith(".html"); }) .map(function (page) { return new HtmlWebpackPlugin({ filename: page, template: `./app/${page}`
    });
  });

let config = {
  entry: "./app/assets/scripts/App.js",
  plugins: pages,
  module: {
    rules: [
      cssConfig,
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-react", "@babel/preset-env"],
            plugins: ["@babel/plugin-transform-runtime"]
          }
        }
      }
    ]
  }
};

if (currentTask == "dev") {
  cssConfig.use.unshift("style-loader");
  config.output = {
    filename: "bundled.js",
    path: path.resolve(__dirname, "app")
  };
  config.devServer = {
    before: function (app, server) {
      server._watch("./app/**/*.html");
    },
    contentBase: path.join(__dirname, "app"),
    hot: true,
    port: 3000,
    host: "0.0.0.0",
    historyApiFallback: { index: "/" }
  };
  config.mode = "development";
}

if (currentTask == "build") {
  cssConfig.use.unshift(MiniCssExtractPlugin.loader);
  postCSSPlugins.push(require("cssnano"));
  config.output = {
    filename: "[name].[chunkhash].js",
    chunkFilename: "[name].[chunkhash].js",
    path: path.resolve(__dirname, "docs")
  };
  config.mode = "production";
  config.optimization = {
    splitChunks: { chunks: "all" }
  };
  config.plugins.push(
    new CleanWebpackPlugin(),
    new MiniCssExtractPlugin({ filename: "styles.[chunkhash].css" }),
    new RunAfterCompile()
  );
}

module.exports = config;

Ci sono stato per un paio d'ore e non riesco a trovare quello che mi serve online. Spero che qualcuno si sia imbattuto in questo problema prima.

Grazie

Risposte

1 AlexMckay Oct 23 2020 at 00:53

C'è un dotenv-webpackplugin specifico per questa situazione.

La configurazione è semplicissima:

// webpack.config.js
const dotEnv = require('dotenv-webpack')
module.exports = {
  plugins: [new dotEnv()]
}

Docs

MODIFICARE

Questa risposta è troppo prolissa per i commenti:

Stai aggiungendo dotEnvalla pluginsproprietà sbagliata .

 module: {
    rules: [
      cssConfig,
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-react", "@babel/preset-env"],
            plugins: [/* WRONG */ new dotEnv(), "@babel/plugin-transform-runtime"]
          }
        }
      }
    ]
  }

Quando dovrebbe essere aggiunto qui:

if (currentTask == "dev") {
  config.plugins = [/* RIGHT */ new dotEnv()]
}
Wonkledge Oct 23 2020 at 00:18

nella parte superiore del tuo file dove vuoi usare le variabili env aggiungi:

import dotenv from 'dotenv';

dotenv.config();

tutto dovrebbe funzionare perfettamente: p

Per quanto riguarda il tuo errore con il modulo fs, provi ad aggiungere il seguente frammento alla configurazione del tuo webpack?

node: {
  fs: 'empty'
}