ওয়েবপ্যাকে পরিবেশ-নির্ভর ভেরিয়েবলগুলি পাস করা


306

আমি কৌনিক অ্যাপটি গুলপ থেকে ওয়েবপ্যাকে রূপান্তর করার চেষ্টা করছি। নলখাগুলিতে আমি এইচডিএমএল পৃষ্ঠায় কিছু ভেরিয়েবল প্রতিস্থাপন করতে গল্প-প্রিপ্রোসেস ব্যবহার করি (যেমন ডাটাবেসের নাম) NODE_ENV এর উপর নির্ভর করে। ওয়েবপ্যাকের সাথে অনুরূপ ফলাফল অর্জনের সর্বোত্তম উপায় কী?


1
উপন্যাস কি আপনার জন্য কাজ করেছিল?
জুহো ভেস্পসালিনেন

1
@ ব্রাবরউ: এলিয়াসের চারপাশে মাথা পেতে পেরে ওঠার আগে, আপনি DefinePlugin () এর ভিত্তিতে প্রস্তাবিত অন্যান্য সমাধানটি আমি কার্যকর করেছি। আমি এখন দেখতে পাচ্ছি যে উপনামটি আরও ভাল সমাধান হতে পারে এবং সম্ভবত কিছু সময় রিফ্যাক্টর হবে - ধন্যবাদ। যদি আপনি একটি উত্তরে আপনার দুটি সমাধান অন্তর্ভুক্ত করতে চান তবে আমি আনন্দের সাথে এটি গ্রহণ করব।
কেপিজি

2
এখানে কনসোল বার্তার মাধ্যমে পরিচালিত হয়েছিল। কিভাবে ব্রাউজারিফাইতে এটি ঠিক করবেন?
জিএন

2
এই প্রশ্নটি কি নির্মাণের সময় বা লোড টাইমে এসপিএ কনফিগার করার চেষ্টা করছে? আমি এসপিএগুলির জন্য দুটি ধরণের কনফিগারেশন নোট করি: 1) বিকাশ বা উত্পাদন মোড এবং 2) স্থাপনার পরিবেশ, যেমন উন্নয়ন, মঞ্চায়ন, উত্পাদন production আমি মনে করি NODE_ENV বিল্ড সময় (1) এর জন্য কনফিগার করতে ব্যবহার করা যেতে পারে তবে আমরা কীভাবে (2) মোতায়েনের জন্য কনফিগার করব, যেমন বিভিন্ন স্থাপনার পরিবেশের জন্য একটি উত্পাদন মোড কনফিগার করা। আমি আশা করি এটি এই প্রশ্নের সাথে প্রাসঙ্গিক।
অ্যাশলে আইটকেন

1
@AshleyAitken গ্রেট প্রশ্ন যা আমি এই থ্রেড (হয়তো আমি এটা মিস) একটি উত্তর খুঁজে পাইনি, কিন্তু এই নতুন থ্রেড পোস্ট stackoverflow.com/questions/44464504/...
ডেভিড Tesar

উত্তর:


427

এটি অর্জনের দুটি মূল উপায় রয়েছে।

DefinePlugin

new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}),

দ্রষ্টব্য যে এটি কেবল "যেমন আছে" মিলগুলি প্রতিস্থাপন করবে। এই কারণে স্ট্রিংটি এটি ফর্ম্যাটে রয়েছে। আপনার আরও জটিল কাঠামো থাকতে পারে, যেমন কোনও বস্তু কিন্তু আপনি ধারণাটি পান।

EnvironmentPlugin

new webpack.EnvironmentPlugin(['NODE_ENV'])

EnvironmentPluginDefinePluginঅভ্যন্তরীণভাবে ব্যবহার করে এবং এর মাধ্যমে কোডের জন্য পরিবেশের মানকে মানচিত্র করে। টিয়ার সিনট্যাক্স।

উপনাম

বিকল্পভাবে আপনি একটি এলিয়াসড মডিউলটির মাধ্যমে কনফিগারেশন গ্রাস করতে পারেন । গ্রাহক পক্ষ থেকে এটি দেখতে এই রকম হবে:

var config = require('config');

কনফিগারেশন নিজেই এটি দেখতে পারে:

resolve: {
    alias: {
        config: path.join(__dirname, 'config', process.env.NODE_ENV)
    }
}

আসুন বলে process.env.NODE_ENVহয় development। এটি তখন মানচিত্র হবে ./config/development.js। এটি মডিউলটি মানচিত্র করে যার জন্য এটি কনফিগারেশনটি রফতানি করতে পারে:

module.exports = {
    testing: 'something',
    ...
};

3
এটি ম্যাচগুলিকে "যেমন আছে" প্রতিস্থাপন করে তা নির্দেশ করার জন্য ধন্যবাদ। আমার কোডটি কেন একটি ত্রুটি ছুঁড়েছে তা বোঝার জন্য আমি কিছুক্ষণ সংগ্রাম করে যাচ্ছিলাম এবং এটি কারণ যে আমি JSON.stringify()
একটিতে

4
আপনি যদি ES2015 ব্যবহার করছেন তবে আপনি স্ট্রিং ইন্টারপোলেশনও ব্যবহার করতে পারেন -'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
ব্যবহারকারী 2688473

1
@ tybro0103 JSON.stringify('development')যেমন হয় তেমন কার্যকর হতে পারে না। পরিবর্তে JSON.stringify(someVariable)বেশ হতে পারে!
সুপারজোজ

1
আপনার এটি করা উচিত NODE_ENV। কীভাবে সেট করবেন এটি আপনার প্ল্যাটফর্মের উপর নির্ভর করে।
জুহো ভেস্পসালিনেন

1
@ অ্যানুলরিভাস হ্যাঁ প্রতিক্রিয়া process.env.NODE_ENVপ্যাটার্ন ব্যবহার করে এবং এটি কাজ করে।
জুহো ভেপসালাইনেইন

109

অন্য একটি বিকল্প, আপনি যদি কেবল defineক্লিপ ইন্টারফেস ব্যবহার করতে চান তবে কেবল ওয়েবপ্যাকের বিকল্পটি ব্যবহার করুন । আমি আমার মধ্যে নিম্নলিখিত স্ক্রিপ্ট যুক্ত package.json:

"build-production": "webpack -p --define process.env.NODE_ENV='\"production\"' --progress --colors"

সুতরাং আমি শুধু চালাতে হবে npm run build-production


2
এর জন্য কি কোন দলিল আছে? আমি গুগল
রিচার্ড

5
ওয়েবপ্যাক @ 2 এর জন্য "-p" ইতিমধ্যে --optimize-minimize --define process.env.NODE_ENV = "উত্পাদনের"
ok

@okm ডকস -p - অনুকূলকরণ-মিনিমাইজ - ওপটিমাইজ-ইভেন্ট - অর্ডারের সমান উল্লেখ করেছেন, সুতরাং --define process.env.NODE_ENV = "উত্পাদন" এর কোনও উল্লেখ নেই। এটি কি এমন কিছু মুছে ফেলা হয়েছে?
নাদের ঘানবাড়ী

1
@ নাদেরহাদজিঝানবাড়ি এটি ওয়েবপ্যাক সংস্করণ 2 ওয়েবপ্যাক.জেএস.আর.সি.আইপি
সিলি

73

পরিবেশ-নির্দিষ্ট ভেরিয়েবল কীভাবে সেট করতে হয় সে সম্পর্কে আমি কয়েকটি বিকল্প অনুসন্ধান করেছি এবং এটি দিয়ে শেষ করেছিলাম:

আমার কাছে বর্তমানে 2 টি ওয়েবপ্যাক কনফিগার রয়েছে:

webpack.production.config.js

new webpack.DefinePlugin({
  'process.env':{
    'NODE_ENV': JSON.stringify('production'),
    'API_URL': JSON.stringify('http://localhost:8080/bands')
  }
}),

webpack.config.js

new webpack.DefinePlugin({
  'process.env':{
    'NODE_ENV': JSON.stringify('development'),
    'API_URL': JSON.stringify('http://10.10.10.10:8080/bands')
  }
}),

আমার কোডে আমি এই (সংক্ষিপ্ত) উপায়ে API_URL এর মান পাই:

const apiUrl = process.env.API_URL;

এডিটি 3 য় নভেম্বর, 2016

ওয়েবপ্যাক ডক্সের একটি উদাহরণ রয়েছে: https://webpack.js.org/plugins/define-plugin/#usage

new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(true),
    VERSION: JSON.stringify("5fa3b9"),
    BROWSER_SUPPORTS_HTML5: true,
    TWO: "1+1",
    "typeof window": JSON.stringify("object")
})

ESLint এর সাহায্যে আপনার যদি no-undefনিয়ম থাকে তবে কোডগুলিতে আপনাকে নির্দিষ্ট করে অপরিবর্তিত ভেরিয়েবলগুলি অনুমতি দিতে হবে। http://eslint.org/docs/rules/no-undef এর মত:

/*global TWO*/
console.log('Running App version ' + TWO);

7 ই সেপ্টেম্বর, 2017 সম্পাদনা করুন (তৈরি-প্রতিক্রিয়া-অ্যাপ্লিকেশন নির্দিষ্ট)

আপনি যদি খুব বেশি কনফিগার করতে না পারেন তবে তৈরি করুন-প্রতিক্রিয়া অ্যাপ্লিকেশন: তৈরি করুন - প্রতিক্রিয়া-অ্যাপ্লিকেশন - কাস্টম এনভায়রনমেন্ট ভেরিয়েবলগুলি যুক্ত করা । হুডের নীচে সিআরএ যেভাবেই ওয়েবপ্যাক ব্যবহার করে।


2
আপনি কি খুঁজে পেয়েছেন যে এটি কোনও পরিবেশের ভেরিয়েবলগুলি রান টাইমে যাওয়ার সময়কে বাধা দিয়েছে? আপনি যদি পুরোটি প্রতিস্থাপন করেন process.envতবে process.env.PORTউদাহরণস্বরূপ undefinedওয়েবপ্যাকটি নির্মাণের সময় সমাধান করা যায় না যার অর্থ আপনি পরিবেশ থেকে পোর্টটি আর ওভাররাইড করতে পারবেন না?
ডিজেস্কিনার

অনেক ধন্যবাদ. অবশেষে এই ইস্যুতে একটি উত্তর যা বোধগম্য!
ডেভ সাগ

প্রক্রিয়া কি? এটা কোথা থেকে আসছে? যদি এটি নোড অবজেক্ট হয় তবে এটি ব্রাউজারে কীভাবে প্রবেশ করবে?
ড্যানিয়েল বিরোস্কি পপেস্কি

এটি একটি ভয়াবহ সমাধান, আপনার দুটি ওয়েবপ্যাক.কমফিজ রয়েছে পুরোপুরি অভিন্ন যেমন NODE_ENV এবং API_URL নির্ধারণ করা
ব্রায়ান ওগডেন

1
@ ব্রায়ানঅ্যাগডেন হ্যাঁ এটি সত্যিই, আপনার এটির জন্য ওয়েবপ্যাক একীভূত করার মতো কিছু ব্যবহার করা উচিত: npmjs.com/package/webpack- विसর - এটি আইএমও এই প্রশ্নের সুযোগের বাইরে নয়।
10

24

আপনি ওয়েবপ্যাক 2 ব্যবহার করে অতিরিক্ত প্লাগইন ছাড়াই যে কোনও কমান্ড-লাইন আর্গুমেন্টটি পাস করতে পারেন :--env

webpack --config webpack.config.js --env.foo=bar

ওয়েবপ্যাক.কনফিগ.জেজে ভেরিয়েবল ব্যবহার করা:

module.exports = function(env) {
    if (env.foo === 'bar') {
        // do something
    }
}

সূত্র


22

আপনি সরাসরি ব্যবহার করতে পারেন EnvironmentPluginউপলব্ধ webpacktranspilation চলাকালীন যেকোন এনভায়রনমেন্ট ভেরিয়েবল এক্সেস আছে।

আপনাকে কেবল আপনার webpack.config.jsফাইলটিতে প্লাগইন ঘোষণা করতে হবে:

var webpack = require('webpack');

module.exports = {
    /* ... */
    plugins = [
        new webpack.EnvironmentPlugin(['NODE_ENV'])
    ]
};

নোট করুন যে আপনি যে পরিবেশের পরিবর্তনশীলগুলি ব্যবহার করতে চান তার নাম অবশ্যই স্পষ্টভাবে ঘোষণা করতে হবে।


4
খুব ব্যবহারের ক্ষেত্রে ওয়েবপ্যাক ডক্সে একটি উদাহরণ রয়েছে। github.com/webpack/docs/wiki/list-of-plugins#enomotplugin
টেকনেটিয়াম

1
যদি আপনি আপনার পরিবেশের পরিবর্তনগুলি একটি .env ফাইলে রাখতে চান তবে আপনি ডটেনভ প্যাকেজটি ব্যবহার করতে পারেন এবং এটিকে ওয়েবপ্যাক.কনফিগ.জেজে শুরু করতে পারেন। npmjs.com/package/dotenv
জাস্টিন ম্যাকক্যান্ডলেস

13

ব্যক্তিগতভাবে উত্তরগুলির গুচ্ছটিতে যুক্ত করতে আমি নিম্নলিখিতগুলি পছন্দ করি:

const webpack = require('webpack');
const prod = process.argv.indexOf('-p') !== -1;

module.exports = {
  ...
  plugins: [
    new webpack.DefinePlugin({
      process: {
        env: {
          NODE_ENV: prod? `"production"`: '"development"'
        }
      }
    }),
    ...
  ]
};

এটি ব্যবহার করে কোনও মজাদার এনভ ভেরিয়েবল বা ক্রস প্ল্যাটফর্ম সমস্যা নেই (এনভি ভার্স সহ)। আপনার সমস্ত কিছুই যথাক্রমে স্বাভাবিক webpackবা webpack -pদেব বা উত্পাদনের জন্য চালানো হয়।

তথ্যসূত্র: গিথুব ইস্যু


পছন্দ যখন প্রক্রিয়ার জন্য মান সংজ্ঞা 'process.env.NODE_ENV': JSON.stringify('production')উপর process: { env: { NODE_ENV: JSON.stringify('production') } }। পরেরটি ব্যবহার করে প্রক্রিয়া অবজেক্টটি ওভাররাইট হবে যা কিছু মডিউলগুলির সাথে সামঞ্জস্যতা ভঙ্গ করতে পারে যা প্রক্রিয়া অবজেক্টের অন্যান্য মানগুলি সংজ্ঞায়িত হওয়ার প্রত্যাশা করে।
স্লোরেঞ্জো

13

যেহেতু উপরের পোস্টটিতে আমার সম্পাদনাটি অ্যানভ্যালজিস্ট দ্বারা অনুমোদিত হয়নি , অতিরিক্ত তথ্য পোস্ট করে।

আপনি যদি প্যাকেজ.জসন থেকে কোনও সংজ্ঞায়িত সংস্করণ নম্বর পছন্দ করতে চান এবং জাভাস্ক্রিপ্টের মধ্যে DefinePlugin এর মাধ্যমে এটি অ্যাক্সেস করতে চান ।

{"version": "0.0.1"}

তারপর, আমদানি package.json নিজ নিজ ভিতরে webpack.config , অ্যাক্সেস বৈশিষ্ট্য আমদানি পরিবর্তনশীল ব্যবহার করে, তারপর বৈশিষ্ট্য ব্যবহার DefinePlugin

const PACKAGE = require('../package.json');
const _version = PACKAGE.version;//Picks the version number from package.json

উদাহরণস্বরূপ ওয়েবপ্যাক.কনফিগের নির্দিষ্ট কনফিগারেশন ডিফাইনপ্লাগিনের জন্য মেটাডেটা ব্যবহার করছে:

const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, {
  host: HOST,
  port: PORT,
  ENV: ENV,
  HMR: HMR,
  RELEASE_VERSION:_version//Version attribute retrieved from package.json
});

new DefinePlugin({
        'ENV': JSON.stringify(METADATA.ENV),
        'HMR': METADATA.HMR,
        'process.env': {
          'ENV': JSON.stringify(METADATA.ENV),
          'NODE_ENV': JSON.stringify(METADATA.ENV),
          'HMR': METADATA.HMR,
          'VERSION': JSON.stringify(METADATA.RELEASE_VERSION)//Setting it for the Scripts usage.
        }
      }),

যে কোনও টাইপ স্ক্রিপ্ট ফাইলের মধ্যে এটি অ্যাক্সেস করুন:

this.versionNumber = process.env.VERSION;

স্মার্টতম উপায়টি এরকম হবে:

// webpack.config.js
plugins: [
    new webpack.DefinePlugin({
      VERSION: JSON.stringify(require("./package.json").version)
    })
  ]

রস অ্যালেনকে ধন্যবাদ


11

@ Zer0chain এর উত্তরের অনুরূপ কেবল অন্য একটি উত্তর। তবে, একটি পার্থক্য সঙ্গে।

সেটিং webpack -pযথেষ্ট।

এটি যেমন:

--define process.env.NODE_ENV="production"

এবং এই হিসাবে একই

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

module.exports = {
  //...

  plugins:[
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ]
};

সুতরাং আপনার কেবল package.jsonনোড ফাইলে এর মতো কিছু দরকার হতে পারে :

{
  "name": "projectname",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "debug": "webpack -d",
    "production": "webpack -p"
  },
  "author": "prosti",
  "license": "ISC",
  "dependencies": {    
    "webpack": "^2.2.1",
    ...
  }
}

DefinePlugin থেকে মাত্র কয়েকটি টিপস :

DefinePlugin আপনাকে বৈশ্বিক ধ্রুবক তৈরি করতে দেয় যা সংকলন সময়ে কনফিগার করা যায়। উন্নয়ন বিল্ড এবং রিলিজ বিল্ডের মধ্যে বিভিন্ন আচরণের অনুমতি দেওয়ার জন্য এটি কার্যকর হতে পারে be উদাহরণস্বরূপ, লগিং সংঘটিত হয় কিনা তা নির্ধারণের জন্য আপনি বিশ্বব্যাপী ধ্রুবক ব্যবহার করতে পারেন; সম্ভবত আপনি আপনার উন্নয়ন বিল্ডে লগিং সম্পাদন করেছেন তবে রিলিজ বিল্ডে নয়। এটি DefinePlugin সুবিধার মত দৃশ্যের সাজান।


এটি তাই আপনি টাইপ করেন কিনা তা পরীক্ষা করতে পারেন webpack --help

Config options:
  --config  Path to the config file
                         [string] [default: webpack.config.js or webpackfile.js]
  --env     Enviroment passed to the config, when it is a function

Basic options:
  --context    The root directory for resolving entry point and stats
                                       [string] [default: The current directory]
  --entry      The entry point                                          [string]
  --watch, -w  Watch the filesystem for changes                        [boolean]
  --debug      Switch loaders to debug mode                            [boolean]
  --devtool    Enable devtool for better debugging experience (Example:
               --devtool eval-cheap-module-source-map)                  [string]
  -d           shortcut for --debug --devtool eval-cheap-module-source-map
               --output-pathinfo                                       [boolean]
  -p           shortcut for --optimize-minimize --define
               process.env.NODE_ENV="production" 

                      [boolean]
  --progress   Print compilation progress in percentage                [boolean]

3

উত্তরগুলির গুচ্ছটিতে যুক্ত করতে:

DefinePlugin এর পরিবর্তে ExtendedDefinePlugin ব্যবহার করুন

npm install extended-define-webpack-plugin --save-dev.

এক্সটেন্ডডডেফাইনপ্লাগিনটি ব্যবহার করা অনেক সহজ এবং ডকুমেন্টেড :-) লিঙ্ক

যেহেতু DefinePlugin এর মধ্যে ভাল ডকুমেন্টেশন নেই, আমি এটি সাহায্য করে বলতে চাই, এটি আসলে সি # তে #DEFINE এর মতো কাজ করে ।

#if (DEBUG)
        Console.WriteLine("Debugging is enabled.");
#endif

সুতরাং, আপনি যদি DefinePlugin কীভাবে কাজ করে তা বুঝতে চান, সি # # ডেফাইন ডোকমেন্টেশন পড়ুন। লিংক


2

আমি বিভিন্ন পরিবেশের জন্য .env ফাইল ব্যবহার পছন্দ করি।

  1. env.devরুট ফোল্ডারে .env অনুলিপি করতে ওয়েবপ্যাক.দেব.কনফিগ ব্যবহার করুন
  2. .Env অনুলিপি env.prodকরতে ওয়েবপ্যাক.প্রড.কনফিগ ব্যবহার করুন

এবং কোডে

ব্যবহার

require('dotenv').config(); const API = process.env.API ## which will store the value from .env file


2

আমি ওয়েবপ্যাক 2 এর জন্য পরিবেশ পরিবর্তনশীল সেটআপ করা সবচেয়ে সহজ হিসাবে নিম্নলিখিত সমাধানটি পেয়েছি:

উদাহরণস্বরূপ আমাদের একটি ওয়েবপ্যাক সেটিংস রয়েছে:

var webpack = require('webpack')

let webpackConfig = (env) => { // Passing envirmonment through
                                // function is important here
    return {
        entry: {
        // entries
        },

        output: {
        // outputs
        },

        plugins: [
        // plugins
        ],

        module: {
        // modules
        },

        resolve: {
        // resolves
        }

    }
};

module.exports = webpackConfig;

ওয়েবপ্যাকে পরিবেশ পরিবর্তনযোগ্য যুক্ত করুন:

plugins: [
    new webpack.EnvironmentPlugin({
       NODE_ENV: 'development',
       }),
]

প্লাগিনের পরিবর্তনশীল সংজ্ঞা দিন এবং এতে যুক্ত করুন plugins:

    new webpack.DefinePlugin({
        'NODE_ENV': JSON.stringify(env.NODE_ENV || 'development')
    }),

ওয়েবপ্যাক কমান্ড চালানোর সময়, env.NODE_ENVযুক্তি হিসাবে পাস করুন :

webpack --env.NODE_ENV=development

// OR

webpack --env.NODE_ENV development

এখন আপনি NODE_ENVআপনার কোডের যে কোনও জায়গায় ভেরিয়েবল অ্যাক্সেস করতে পারবেন ।


1

যেহেতু ওয়েবপ্যাক ভি 4, কেবল modeআপনার ওয়েবপ্যাক কনফিগারেশনে সেট করা আপনার NODE_ENVজন্য (মাধ্যমে DefinePlugin) সেট করবে । এখানে ডক্স


1

এখানে এমন এক উপায় যা আমার পক্ষে কাজ করেছে এবং একটি জসন ফাইল পুনরায় ব্যবহার করে আমার পরিবেশের পরিবর্তনশীল ডিআরওয়াই রাখার অনুমতি দিয়েছে।

const webpack = require('webpack');
let config = require('./settings.json');
if (__PROD__) {
    config = require('./settings-prod.json');
}

const envVars = {};
Object.keys(config).forEach((key) => {
    envVars[key] = JSON.stringify(config[key]);
});

new webpack.DefinePlugin({
    'process.env': envVars
}),

0

আমি এর বিশাল ভক্ত নই ...

new webpack.DefinePlugin({
  'process.env': envVars
}),

... এটি কোনও ধরণের সুরক্ষা সরবরাহ করে না। পরিবর্তে, আপনি আপনার গোপন স্টাফগুলিকে উত্সাহিত করবেন, যদি না আপনি গিটিগনোর-এ কোনও ওয়েবপ্যাক যোগ না করে a‍♀️ এর থেকে আরও ভাল সমাধান পাওয়া যায়।

মূলত এই কনফিগারেশনটি দিয়ে আপনি একবার আপনার কোডটি সংকলন করে সমস্ত প্রসেস env ভেরিয়েবলগুলি পুরো কোড থেকে মুছে ফেলা হবে, সেখানে কোনও একক প্রক্রিয়া হবে না env.VAR বাবেল প্লাগইন পিএসকে ধন্যবাদ transform-inline-environment-variables যদি আপনি শেষ না করতে চান তবে পুরো গোছা অনির্দিষ্ট সংশোধন করে, ওয়েবপ্যাক বাবেল-লোডারকে কল করার আগে আপনি env.js কে কল করেছেন তা নিশ্চিত করুন, এ কারণেই এটি প্রথম জিনিস ওয়েবপ্যাক কল। babel.config.js ফাইলে vars এর অ্যারে অবশ্যই env.js- তে বস্তুর সাথে মেলে must এখন কেবল একটাই করণীয় কাজ। .envআপনার সমস্ত এনভির ভেরিয়েবলগুলিকে একটি ফাইল যুক্ত করুন , ফাইলটি অবশ্যই প্রকল্পের মূলের মধ্যে থাকা উচিত বা যেখানে আপনি চান সেখানে যুক্ত করতে দ্বিধা বোধ করবেন না, কেবল এনভি.ভি.এস ফাইলটিতে একই অবস্থান নির্ধারণ এবং এটিতে যুক্ত করার বিষয়টি নিশ্চিত করুন gitignore

const dotFiles = ['.env'].filter(Boolean);

if (existsSync(dotFiles)) {
    require("dotenv-expand")(require("dotenv").config((dotFiles)));
}

আপনি যদি পুরো ব্যাবেল + ওয়েবপ্যাকটি দেখতে চান তবে এটি হ'ল https://github.com/EnetoJara/Node-typescript-babel-webpack.git

এবং একই যুক্তি প্রতিক্রিয়া এবং অন্যান্য সমস্ত ক্ষেত্রে প্রযোজ্য 💩

config
---webpack.js
---env.js
src
---source code world
.env
bunch of dotFiles

env.js

"use strict";
/***
I took the main idea from CRA, but mine is more cooler xD
*/
const {realpathSync, existsSync} = require('fs');
const {resolve, isAbsolute, delimiter} = require('path');

const NODE_ENV = process.env.NODE_ENV || "development";

const appDirectory = realpathSync(process.cwd());

if (typeof NODE_ENV !== "string") {
    throw new Error("falle and stuff");
}

const dotFiles = ['.env'].filter(Boolean);

if (existsSync(dotFiles)) {
    require("dotenv-expand")(require("dotenv").config((dotFiles)));
}

process.env.NODE_PATH = (process.env.NODE_PATH || "")
    .split(delimiter)
    .filter(folder => folder && isAbsolute(folder))
    .map(folder => resolve(appDirectory, folder))
    .join(delimiter);

const ENETO_APP = /^ENETO_APP_/i;

module.exports = (function () {
    const raw = Object.keys ( process.env )
        .filter ( key => ENETO_APP.test ( key ) )
        .reduce ( ( env, key ) => {
                env[ key ] = process.env[ key ];
                return env;
            },
            {
                BABEL_ENV: process.env.ENETO_APP_BABEL_ENV,
                ENETO_APP_DB_NAME: process.env.ENETO_APP_DB_NAME,
                ENETO_APP_DB_PASSWORD: process.env.ENETO_APP_DB_PASSWORD,
                ENETO_APP_DB_USER: process.env.ENETO_APP_DB_USER,
                GENERATE_SOURCEMAP: process.env.ENETO_APP_GENERATE_SOURCEMAP,
                NODE_ENV: process.env.ENETO_APP_NODE_ENV,
                PORT: process.env.ENETO_APP_PORT,
                PUBLIC_URL: "/"
            } );

    const stringyField = {
        "process.env": Object.keys(raw).reduce((env, key)=> {
            env[key]=JSON.stringify(raw[key]);
            return env;
        },{}),

    };

    return {
        raw, stringyField
    }
})();

প্লাগইন ট্রল সহ ওয়েবপ্যাক ফাইল

"use strict";

require("core-js");
require("./env.js");

const path = require("path");
const nodeExternals = require("webpack-node-externals");

module.exports = env => {
    return {
        devtool: "source-map",
        entry: path.join(__dirname, '../src/dev.ts'),
        externals: [nodeExternals()],
        module: {
            rules: [
                {
                    exclude: /node_modules/,
                    test: /\.ts$/,
                    use: [
                        {
                            loader: "babel-loader",
                        },
                        {
                            loader: "ts-loader"
                        }
                    ],
                },
                {
                    test: /\.(png|jpg|gif)$/,
                    use: [
                        {
                            loader: "file-loader",
                        },
                    ],
                },
            ],
        },
        node: {
            __dirname: false,
            __filename: false,
        },
        optimization: {
            splitChunks: {
                automaticNameDelimiter: "_",
                cacheGroups: {
                    vendor: {
                        chunks: "initial",
                        minChunks: 2,
                        name: "vendor",
                        test: /[\\/]node_modules[\\/]/,
                    },
                },
            },
        },
        output: {
            chunkFilename: "main.chunk.js",
            filename: "name-bundle.js",
            libraryTarget: "commonjs2",
        },
        plugins: [],
        resolve: {
            extensions: ['.ts', '.js']
        }   ,
        target: "node"
    };
};

babel.config.js

module.exports = api => {

    api.cache(() => process.env.NODE_ENV);

    return {

        plugins: [
            ["@babel/plugin-proposal-decorators", { legacy: true }],
            ["@babel/plugin-transform-classes", {loose: true}],
            ["@babel/plugin-external-helpers"],
            ["@babel/plugin-transform-runtime"],
            ["@babel/plugin-transform-modules-commonjs"],
            ["transform-member-expression-literals"],
            ["transform-property-literals"],
            ["@babel/plugin-transform-reserved-words"],
            ["@babel/plugin-transform-property-mutators"],
            ["@babel/plugin-transform-arrow-functions"],
            ["@babel/plugin-transform-block-scoped-functions"],
            [
                "@babel/plugin-transform-async-to-generator",
                {
                    method: "coroutine",
                    module: "bluebird",
                },
            ],
            ["@babel/plugin-proposal-async-generator-functions"],
            ["@babel/plugin-transform-block-scoping"],
            ["@babel/plugin-transform-computed-properties"],
            ["@babel/plugin-transform-destructuring"],
            ["@babel/plugin-transform-duplicate-keys"],
            ["@babel/plugin-transform-for-of"],
            ["@babel/plugin-transform-function-name"],
            ["@babel/plugin-transform-literals"],
            ["@babel/plugin-transform-object-super"],
            ["@babel/plugin-transform-shorthand-properties"],
            ["@babel/plugin-transform-spread"],
            ["@babel/plugin-transform-template-literals"],
            ["@babel/plugin-transform-exponentiation-operator"],
            ["@babel/plugin-proposal-object-rest-spread"],
            ["@babel/plugin-proposal-do-expressions"],
            ["@babel/plugin-proposal-export-default-from"],
            ["@babel/plugin-proposal-export-namespace-from"],
            ["@babel/plugin-proposal-logical-assignment-operators"],
            ["@babel/plugin-proposal-throw-expressions"],
            [
                "transform-inline-environment-variables",
                {
                    include: [
                        "ENETO_APP_PORT",
                        "ENETO_APP_NODE_ENV",
                        "ENETO_APP_BABEL_ENV",
                        "ENETO_APP_DB_NAME",
                        "ENETO_APP_DB_USER",
                        "ENETO_APP_DB_PASSWORD",
                    ],
                },
            ],
        ],
        presets: [["@babel/preset-env",{
            targets: {
                node: "current",
                esmodules: true
            },
            useBuiltIns: 'entry',
            corejs: 2,
            modules: "cjs"
        }],"@babel/preset-typescript"],
    };
};

"আপনি নিজের গুপ্ত জিনিসগুলিকে উত্সাহিত করবেন, যদি না আপনি গিটিগনরে কোনও ওয়েবপ্যাক যোগ করেন না।" @ আর্নেস্টো আপনি কি এটিকে কিছুটা বাড়িয়ে দিতে পারবেন?
কেটি বায়ার্স

মূলত আপনার বান্ডিলটি প্রসেস.ইন.বি.এল.এইচ.এল.এইচ.এল.এলএইচএল আউট দিয়ে শেষ হয় এবং আসল মান রাখে। উদাহরণস্বরূপ, প্রক্রিয়া.এন.ভি.এন.ডি.এন.ডি.এনভি.র পরিবর্তে আপনি "উত্পাদন" শেষ করেন না, আমি বলতে চাইছি এটি সেরা উদাহরণ নয় তবে একটি গোপন কীটি কল্পনা করুন। আপনার বান্ডেলের আসল মান থাকবে এবং কে জানে যে তারযুক্ত স্ট্রিংটি 🤷‍♀️ এর জন্য দাঁড়িয়েছে
আর্নেস্তো

হুঁ - হ্যাঁ, এই মানগুলি বিল্ট সংস্করণে বিভক্ত হবে , তবে সম্ভবত আপনি গিটহাবের দিকে তা চাপছেন না ...
কেটি বাইয়ার্স

-4

আমি জানি না তবে কেন কেউ সহজ সরল সমাধানের কথা উল্লেখ করেনি। এটি আমার জন্য নোডেজ এবং গ্রান্টের জন্য কাজ করে। অনেক লোকের মতোই ওয়েবপ্যাকটি বিভ্রান্ত করতে পারে আপনি কেবল নীচের লাইনটি ব্যবহার করতে পারেন:

process.env.NODE_ENV = 'production';

উপরের সমাধানটির সাথে আপনার সত্যিই vর্ষা বা ওয়েবপ্যাক ব্যবহার করার দরকার নেই। কখনও কখনও সহজ হার্ডকোডযুক্ত সমাধান কিছু লোকের জন্য কাজ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.