Подтвердить что ты не робот

Как передать переменные файла .env в конфигурацию webpack?

Я новичок в webpack и разработал почти все разделы сборки, но теперь проблема в том, что я хочу передать переменные окружения из .env файла в конфигурацию webpack, чтобы я мог передавать эти переменные в мои файлы сборки через webpack.DefinePlugin.

В настоящее время я могу передать переменную среды непосредственно из webpack в мою сборку. Пожалуйста, см. Код ниже, который я использовал в webpack.

new webpack.DefinePlugin({
            "API_URL": JSON.stringify("http://my-api.com"),
            "SECRET_KEY" : "MYSECRETKEYGOESHERE"
        }),

My package.json build script есть

"scripts": {
    "start": "NODE_ENV=development webpack-dev-server --progress --port 8000 --content-base app/build/src"
    } 
4b9b3361

Ответ 1

Для этой цели вы можете использовать пакет dotenv

Ссылка: https://www.npmjs.com/package/dotenv https://github.com/motdotla/dotenv

В верхней части файла конфигурации веб-пакета требуется dotenv следующим образом (установите путь к .env правильно)

var dotenv = require('dotenv').config({path: __dirname + '/.env'});

в разделе плагинов для конфигурации веб-пакетов используйте

new webpack.DefinePlugin({
            "process.env": dotenv.parsed
        }),

Теперь вы можете использовать переменные env во всем приложении. попробуйте console.log(process.env); в вашем коде приложения

Ответ 2

Это не совсем соответствует вашему случаю (хотя и частично), но я нашел, что эта формула работает лучше всего для меня.

Я использую комбинацию из 2 libs: dotenv для чтения файла .env для webpack.config.js (конфигурация) и webpack-dotenv-plugin для проверки (на .env.example файла .env.example) и для передачи всех переменные из файла .env в код приложения:

Часть моего webpack.config.js:

// this is to load env vars for this config
require('dotenv').config({ // it puts the content to the "process.env" var. System vars are taking precedence
    path: '.env.webpack',
});
// and this to pass env vars to the JS application
const DotenvPlugin = require('webpack-dotenv-plugin');

Раздел плагинов:

plugins: [
    // ...
    new DotenvPlugin({ // makes vars available to the application js code
        path: '.env.webpack',
        sample: '.env.webpack.example',
        allowEmptyValues: true,
    }),
    // ...
]

Ответ 3

Я не могу комментировать, чтобы прояснить любую информацию, поэтому приношу свои извинения за ответ.

Вы можете сделать:

var env = require('.env');

то

new webpack.DefinePlugin({
            "API_URL": JSON.stringify("http://my-api.com"),
            "SECRET_KEY" : "MYSECRETKEYGOESHERE",
            "env_property": env.property
        }),

Но я делаю предположения относительно вашего .env файла и способа его настройки с помощью этого ответа

Ответ 4

вебпак + дотенв

Я получил вдохновение от принятого ответа, но он не работает для меня. Возможно API дотенв изменился.

Следующие работы у меня

import dotenv from 'dotenv'
import { DefinePlugin } from 'webpack'


...

plugins: [
    new DefinePlugin({
      'process.env': JSON.stringify(dotenv.config().parsed)
    })
]

...

Ответ 5

Самое простое решение, которое я нашел, это использовать этот пакет npm: dotenv-webpack

Создать файл .env

// .env
DB_HOST=127.0.0.1
DB_PASS=foobar
S3_API=mysecretkey

Добавьте его в свой конфигурационный файл Webpack

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

module.exports = {
...
plugins: [
new Dotenv()
]
...
};

Используйте в своем коде

// file1.js
console.log(process.env.DB_HOST);
// '127.0.0.1'
Resulting bundle
// bundle.js
console.log('127.0.0.1');

Ответ 6

Из webpack docs:

Параметр среды командной строки webpack --env позволяет вам пройти в как много переменных среды, как вам нравится. Переменные среды будут доступны в вашем webpack.config.js. Например, --env.production или --env.NODE_ENV = local (NODE_ENV обычно используется для определения типа среды, см. здесь.)

в package.json

webpack --env.NODE_ENV=local --env.production --progress

в webpack.config.js

module.exports = env => {
  // Use env.<YOUR VARIABLE> here:
  console.log('NODE_ENV: ', env.NODE_ENV) // 'local'
  console.log('Production: ', env.production) // true

  return {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    }