menggunakan dotenv dengan react & webpack
Saya menemukan informasi bahwa Anda dapat menggunakan dotenv dengan react using
import React from "react"
console.log(process.env.REACT_APP_API_KEY)
Namun ketika saya membuat .envfile saya di root arah saya, saya mendapatkan undefinedpesan di konsol.
Saya harus mencatat bahwa saya TIDAK menggunakan react-create-app.
Ini .envfile saya
REACT_APP_API_KEY=secretKey
Ini adalah file konfigurasi webpack saya.
Apakah ada cara saya dapat menggunakan dotenv tanpa menggunakan node.js dan membuat server kecil.
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;
Saya telah melakukan ini selama beberapa jam sekarang dan sepertinya saya tidak dapat menemukan apa yang saya butuhkan secara online. Berharap seseorang pernah mengalami masalah ini sebelumnya.
Terima kasih
Jawaban
Ada dotenv-webpackplugin khusus untuk situasi ini.
Penyiapannya sangat sederhana:
// webpack.config.js
const dotEnv = require('dotenv-webpack')
module.exports = {
plugins: [new dotEnv()]
}
Docs
EDIT
Jawaban ini terlalu panjang untuk dikomentari:
Anda menambahkan dotEnvke pluginsproperti yang salah .
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"]
}
}
}
]
}
Kapan harus ditambahkan di sini:
if (currentTask == "dev") {
config.plugins = [/* RIGHT */ new dotEnv()]
}
di bagian atas file Anda di mana Anda ingin menggunakan variabel env tambahkan:
import dotenv from 'dotenv';
dotenv.config();
semuanya harus bekerja dengan baik: p
Mengenai kesalahan Anda dengan modul fs, apakah Anda mencoba menambahkan cuplikan berikut ke konfigurasi webpack Anda?
node: {
fs: 'empty'
}