【问题标题】:using dotenv with react & webpack将 dotenv 与 react 和 webpack 一起使用
【发布时间】:2021-02-06 01:23:27
【问题描述】:

我正在寻找可以使用 dotenv 和 react using 的信息

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

但是,当我在方向的根目录中创建 .env 文件时,我会在控制台中收到 undefined 消息。

我应该注意我没有使用 react-create-app。

这是我的.env 文件

REACT_APP_API_KEY=secretKey

这是我的 webpack 配置文件。

有什么方法可以在不使用 node.js 和创建小型服务器的情况下使用 dotenv。

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;

我已经在这里工作了几个小时,但我似乎无法在网上找到我需要的东西。希望以前有人遇到过这个问题。

谢谢

【问题讨论】:

  • 非常确定您必须将其添加到您的 webpack 配置中,请在此处查看接受的答案(和其他答案):stackoverflow.com/questions/46224986/… 确保在添加后也重新启动您的服务器

标签: javascript reactjs webpack dotenv


【解决方案1】:

有一个dotenv-webpack 插件专门针对这种情况。

设置非常简单:

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

Docs

编辑

这个答案对于 cmets 来说太冗长了:

您将dotEnv 添加到错误的plugins 属性中。

 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"]
          }
        }
      }
    ]
  }

什么时候应该在此处添加:

if (currentTask == "dev") {
  config.plugins = [/* RIGHT */ new dotEnv()]
}

【讨论】:

  • 我以前试过。我得到以下.definitions is not a valid Plugin property - Maybe you meant to use "plugin": [ ["@babel/plugin-transform-runtime", { "definitions": { "process.env.REACT_APP_WEATHERAPI": "\xxxxxx\"" } }] 这实际上是我在阅读文档时尝试的第一件事
  • 检查更新的答案。一旦你得到这个排序,我强烈建议您查看webpack-merge。您当前拆分 dev/prod 配置的方法非常混乱。
  • 嗯,谢谢。它似乎摆脱了我之前收到的错误,但是我的应用现在不会在网页上显示任何内容。
  • 我有时间休息一下,如果你觉得有用的话,我会为你创建一个 repo?
  • 天啊,在我找到这个之前,我一直在寻找 HOURS。数百个页面建议dotenv,这不适用于 webpack,还有多少 react 应用程序不会使用 webpack?谢谢!
【解决方案2】:

我建议使用dotenv-webpack 访问.env 文件变量。

在 Webpack 配置文件中添加以下内容:

// webpack.config.js
const Dotenv = require('dotenv-webpack');


...
let config = {
  entry: "./app/assets/scripts/App.js",
  plugins: pages,
  ...
};

config.plugins.pushes(new Dotenv());

...

【讨论】:

    【解决方案3】:

    dotenv 变量仅在 webpack 中可用,process 用于 webpack 未编译的内容。

    为了使您的环境变量在 webpack 编译文件中可用,您需要使用 webpack 的定义或环境插件注入它。

    https://webpack.js.org/plugins/environment-plugin/

    这将在编译过程中将文件中的所有环境字符串替换为环境变量。

    您的密钥给出未定义的原因是因为当 webpack (babel) 编译它时,该字符串不存在,因为它从未通过 webpack 环境变量替换/注入。

    【讨论】:

      【解决方案4】:

      在你想要使用环境变量的文件顶部添加:

      import dotenv from 'dotenv';
      
      dotenv.config();
      

      一切都应该正常工作:p

      关于 fs 模块的错误,您是否尝试将以下 sn-p 添加到您的 webpack 配置中?

      node: {
        fs: 'empty'
      }
      

      【讨论】:

      • 对不起,我应该提到这是我尝试的第一件事。我收到Module not found: Error: Can't resolve 'fs': in C:\users\.... 的错误。收到此消息后,我安装了fs,但仍然收到错误
      • 好吧,这与 dotenv 和 env 变量无关。此错误意味着您无法访问基本节点包。 fs 随节点 js 一起提供。
      • 这不是节点应用程序。这个应用只是使用了 react 和其他前端技术。
      • 幕后反应正在使用 nodejs:p,我编辑我的答案,试一试:p
      • 这确实消除了fs 错误消息,但是当我使用console.log(process.env.REACT_APP_API_KEY) 时,我仍然在控制台中收到undefined 消息
      猜你喜欢
      • 2021-02-06
      • 2021-10-31
      • 2016-10-09
      • 2019-12-30
      • 2016-02-04
      • 2019-05-31
      • 2021-03-08
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多