mit dotenv mit react & webpack
Ich finde Informationen, die Sie mit dotenv verwenden können, um mit zu reagieren
import React from "react"
console.log(process.env.REACT_APP_API_KEY)
Wenn ich jedoch meine .envDatei im Stammverzeichnis meiner Richtung erstelle , wird eine undefinedMeldung in der Konsole angezeigt.
Ich sollte beachten, dass ich NICHT die React-Create-App verwende.
Hier ist meine .envDatei
REACT_APP_API_KEY=secretKey
Hier ist meine Webpack-Konfigurationsdatei.
Gibt es eine Möglichkeit, dotenv zu verwenden, ohne node.js zu verwenden und einen kleinen Server zu erstellen?
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;
Ich bin jetzt seit ein paar Stunden dabei und ich kann nicht finden, was ich online brauche. Ich hoffe, jemand ist schon einmal auf dieses Problem gestoßen.
Vielen Dank
Antworten
Es gibt ein dotenv-webpackPlugin speziell für diese Situation.
Das Setup ist denkbar einfach:
// webpack.config.js
const dotEnv = require('dotenv-webpack')
module.exports = {
plugins: [new dotEnv()]
}
Docs
BEARBEITEN
Diese Antwort ist zu ausführlich für Kommentare:
Sie fügen dotEnvder falschen pluginsEigenschaft hinzu.
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"]
}
}
}
]
}
Wann sollte es hier hinzugefügt werden:
if (currentTask == "dev") {
config.plugins = [/* RIGHT */ new dotEnv()]
}
Fügen Sie am Anfang Ihrer Datei, in der Sie env-Variablen verwenden möchten, Folgendes hinzu:
import dotenv from 'dotenv';
dotenv.config();
alles sollte gut funktionieren: p
Versuchen Sie in Bezug auf Ihren Fehler mit dem fs-Modul, Ihrer Webpack-Konfiguration das folgende Snippet hinzuzufügen?
node: {
fs: 'empty'
}