Node.js: Development vs Production

Node.js

উন্নয়ন এবং উৎপাদন পরিবেশের মধ্যে পার্থক্য

এই পৃষ্ঠাটি Node.js অ্যাপ্লিকেশনগুলিতে উন্নয়ন এবং উত্পাদন পরিবেশের মধ্যে মূল পার্থক্যগুলিকে কভার করে এবং উভয়কেই কার্যকরভাবে পরিচালনা করার জন্য সর্বোত্তম অনুশীলন প্রদান করে৷

এক নজরে মূল পার্থক্য

উন্নয়ন

  • বিস্তারিত রেকর্ড
  • বিস্তারিত ত্রুটি বার্তা
  • হট-রিলোডিং সক্ষম করা হয়েছে৷
  • অপরিবর্তিত কোড
  • উপহাস তথ্য/স্টাব

উৎপাদন

  • ন্যূনতম নিবন্ধন
  • সাধারণ ত্রুটি বার্তা
  • উন্নত কর্মক্ষমতা
  • সংক্ষিপ্ত এবং সংকলিত কোড
  • প্রকৃত তথ্য/পরিষেবা

NODE_ENV পরিবেশ পরিবর্তনশীল

Node.js , NODE_ENV .

এটি সাধারণত 'উন্নয়ন' বা 'উৎপাদন'-এ সেট করা হয়, যদিও অন্যান্য মান যেমন 'পরীক্ষা' বা 'মঞ্চায়ন' ব্যবহার করা হয়।

💡দ্রষ্টব্য:

অনেক Node.js ফ্রেমওয়ার্ক এবং লাইব্রেরি (এক্সপ্রেস, রিঅ্যাক্ট, ভিউ, ইত্যাদি) নির্দিষ্ট বৈশিষ্ট্য এবং বর্ধনগুলি সক্ষম বা অক্ষম করতে NODE_ENV ব্যবহার করে।

NODE_ENV সেট করা হচ্ছে

কমান্ড লাইন

# Windows Command Prompt
set NODE_ENV=production
node app.js

# Windows PowerShell
$env:NODE_ENV="production"
node app.js

# Linux/macOS
export NODE_ENV=production
node app.js

package.json

{
  "scripts": {
    "start": "NODE_ENV=production node app.js",
    "dev": "NODE_ENV=development nodemon app.js",
    "test": "NODE_ENV=test jest"
  }
}

ক্রস-এনভি ব্যবহার করা (ক্রস-প্ল্যাটফর্ম)

npm install --save-dev cross-env

{
  "scripts": {
    "start": "cross-env NODE_ENV=production node app.js"
  }
}

আপনার অ্যাপ্লিকেশনে NODE_ENV ব্যবহার করা হচ্ছে

// Simple environment check
const isProduction = process.env.NODE_ENV === 'production';
const isDevelopment = !isProduction;

// Environment-specific configuration
const config = {
  port: process.env.PORT || 3000,
  db: {
    host: isProduction ? 'prod-db.example.com' : 'localhost',
    name: isProduction ? 'myapp_prod' : 'myapp_dev'
  },
  logging: {
    level: isProduction ? 'warn' : 'debug',
    prettyPrint: !isProduction
  }
};

// Express.js example
const express = require('express');
const app = express();

🚀কর্মক্ষমতা উন্নতি:

NODE_ENV=উৎপাদন সেট করা 35% পর্যন্ত অ্যাপ্লিকেশন কর্মক্ষমতা উন্নত করতে পারে, কারণ কিছু প্যাকেজ এই সেটিং এর উপর ভিত্তি করে বর্ধিতকরণ ব্যবহার করে।

স্ট্রাকচার ম্যানেজমেন্ট

বিভিন্ন পরিবেশে ডাটাবেস, API, লগিং এবং অন্যান্য পরিষেবার জন্য সাধারণত বিভিন্ন আর্কিটেকচারের প্রয়োজন হয়।

প্রসঙ্গ-নির্দিষ্ট কনফিগারেশন

// Install dotenv: npm install dotenv
require('dotenv').config(); // Loads .env file contents into process.env

// config.js
module.exports = {
  development: {
    port: 8080,
    database: 'mongodb://localhost:27017/myapp_dev',
    logLevel: 'debug',
    apiKeys: {
      thirdPartyService: process.env.DEV_API_KEY
    }
  },
  test: {
    port: 3001,
    database: 'mongodb://localhost:27017/myapp_test',
    logLevel: 'info',
    apiKeys: {
      thirdPartyService: process.env.TEST_API_KEY
    }
  },
  production: {
    port: process.env.PORT || 8080,
    database: process.env.DATABASE_URL,
    logLevel: 'error',
    apiKeys: {
      thirdPartyService: process.env.PROD_API_KEY
    }
  }
};

const env = process.env.NODE_ENV || 'development';
module.exports.current = module.exports[env];

কনফিগারেশন ফাইল

কাঠামো ব্যবস্থাপনার সাধারণ পদ্ধতি:

প্রসঙ্গ ফাইল:dotenv প্যাকেজের সাথে .env ফাইল ব্যবহার করা
কাঠামোগত বস্তু:প্রসঙ্গ-নির্দিষ্ট কাঠামোগত বস্তু তৈরি করা
কাঠামোগত পরিষেবা:বাহ্যিক পরিষেবাগুলি যেমন AWS প্যারামিটার স্টোর, ভল্ট বা কনসাল ব্যবহার করা

⚠️নিরাপত্তা সতর্কতা:

সংবেদনশীল তথ্য যেমন API কী, ডাটাবেস শংসাপত্র বা গোপনীয়তা সংস্করণ নিয়ন্ত্রণে জমা দেবেন না। সংবেদনশীল ডেটার জন্য সর্বদা পরিবেশ ভেরিয়েবল বা সুরক্ষিত কনফিগারেশন পরিষেবাগুলি ব্যবহার করুন৷

ত্রুটি হ্যান্ডলিং

ত্রুটি পরিচালনার কৌশলগুলি উন্নয়ন এবং উত্পাদন পরিবেশের মধ্যে পৃথক হওয়া উচিত:

উন্নয়ন পরিবেশ

  • বিস্তারিত ত্রুটি বার্তা এবং স্ট্যাক ট্রেস দেখান
  • ডিবাগিং করতে সাহায্য করার জন্য বিস্তারিত লগিং ব্যবহার করুন
  • ত্রুটি দ্রুত ক্র্যাশ
  • ভাল ডিবাকলিং এর জন্য উৎস মানচিত্র সক্ষম করুন
  • ইন্টারেক্টিভ ডিবাগিং টুল প্রদান করুন

উৎপাদন পরিবেশ

  • ত্রুটি প্রতিক্রিয়া থেকে বাস্তবায়ন বিবরণ লুকান
  • অভ্যন্তরীণ ব্যবহারের জন্য ত্রুটিগুলি লগ করুন তবে জেনেরিক ত্রুটি বার্তাগুলি ফেরত দিন৷
  • সঠিক ত্রুটি পুনরুদ্ধার প্রক্রিয়া বাস্তবায়ন
  • ভাল বিশ্লেষণের জন্য কাঠামোগত লগিং ব্যবহার করুন
  • বাহ্যিক পরিষেবাগুলির জন্য সার্কিট ব্রেকার সক্রিয় করুন

প্রসঙ্গ-নির্দিষ্ট ত্রুটি পরিচালনা

const express = require('express');
const app = express();

app.get('/api/data', (req, res) => {
  try {
    // Some operation that might fail
    throw new Error('Something went wrong');
  } catch (error) {
    // Log the error internally (always do this)
    console.error('Error occurred:', error);

    // Provide different responses based on environment
    if (process.env.NODE_ENV === 'production') {
      // In production: generic error message
      return res.status(500).json({
        error: 'An unexpected error occurred'
      });
    } else {
      // In development: detailed error information
      return res.status(500).json({
        error: error.message,
        stack: error.stack,
        details: 'This detailed error is only shown in development'
      });
    }
  }
});

app.listen(8080);

নিবন্ধন কৌশল

নিবন্ধন প্রয়োজনীয়তা উন্নয়ন এবং উত্পাদন মধ্যে উল্লেখযোগ্যভাবে পার্থক্য:

উন্নয়ন রেজিস্টার

  • বিস্তারিত তথ্য সহ বিস্তারিত রেকর্ড
  • রঙ সহ মানব-পাঠযোগ্য বিন্যাস
  • তাত্ক্ষণিক প্রতিক্রিয়ার জন্য কনসোল আউটপুট
  • ডিবাগ এবং ট্রেস স্ট্যাটাস লগিং সক্ষম করা হয়েছে
  • কোন নিবন্ধন চক্র প্রয়োজন

উৎপাদন নিবন্ধন

  • স্ট্রাকচার্ড লগ (JSON ফর্ম্যাট)
  • উপযুক্ত লগিং অবস্থা (সতর্ক/ত্রুটি)
  • নিবন্ধন চক্র এবং ধরে রাখার নীতি
  • কেন্দ্রীভূত নিবন্ধন একীকরণ
  • কর্মক্ষমতা পর্যবেক্ষণ ইন্টিগ্রেশন

উইনস্টনের সাথে প্রসঙ্গ-নির্দিষ্ট রেকর্ডিং

const winston = require('winston');

// Define different logging configurations per environment
const logger = winston.createLogger({
  level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
  format: process.env.NODE_ENV === 'production'
    ? winston.format.json()
    : winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      ),
  defaultMeta: { service: 'user-service' },
  transports: [
    // Always log errors to a file
    new winston.transports.File({
      filename: 'error.log',
      level: 'error'
    }),

    // In production, save all logs to a file
    ...(process.env.NODE_ENV === 'production'
      ? [new winston.transports.File({ filename: 'combined.log' })]
      : []),

    // In development, log to the console
    ...(process.env.NODE_ENV !== 'production'
      ? [new winston.transports.Console()]
      : [])
  ],
});

logger.info('Application started');
logger.debug('This debug message appears only in development');

কর্মক্ষমতা উন্নতি

উত্পাদন পরিবেশগুলি কর্মক্ষমতা এবং নির্ভরযোগ্যতার জন্য অপ্টিমাইজ করা উচিত:

উন্নয়ন ফোকাস

  • দ্রুত আপডেট এবং গরম মডিউল প্রতিস্থাপন
  • debuckling জন্য উৎস মানচিত্র
  • বিস্তারিত ত্রুটি ওভারলে
  • অপরিবর্তিত কোড
  • উন্নয়ন সরঞ্জাম একীকরণ

উৎপাদনশীলতার উন্নতি

  • সূচক হ্রাস এবং গাছ-কাঁপানো
  • সম্পত্তি উন্নয়ন এবং কম্প্যাকশন
  • কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) অ্যাপ্লিকেশন
  • ব্রাউজার ক্যাশে হেডার
  • কর্মক্ষমতা নিরীক্ষণ

উৎপাদনে ক্লাস্টার মোডে চলছে

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (process.env.NODE_ENV === 'production' && cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
    // Replace the dead worker
    cluster.fork();
  });
} else {
  // Workers can share a TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello World\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

নিরাপত্তা বিবেচনা

উত্পাদন পরিবেশে সুরক্ষা অনুশীলনগুলি আরও কঠোর হওয়া উচিত:

পণ্য নিরাপত্তা ব্যবস্থা

Helmet:নিরাপত্তা-সম্পর্কিত HTTP শিরোনাম সেট করুন
হার পরিসীমা:নৃশংস শক্তি এবং DoS আক্রমণ থেকে রক্ষা করুন
CSRF নিরাপত্তা:ক্রস-সাইট দাবি জালিয়াতি প্রতিরোধ করুন
ইনপুট বৈধতা:সমস্ত ব্যবহারকারীর ইনপুট সাফ করুন
HTTPS:সমস্ত যোগাযোগ এনক্রিপ্ট করুন
নির্ভরশীল স্ক্যানিং:নির্ভরতা মধ্যে দুর্বলতা জন্য পরীক্ষা

উৎপাদনের জন্য নিরাপত্তা মিডলওয়্যার

const express = require('express');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const app = express();

// Apply security middleware in production
if (process.env.NODE_ENV === 'production') {
  // Set security headers
  app.use(helmet());

  // Enable rate limiting
  const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
    message: 'Too many requests from this IP, please try again later'
  });
  app.use('/api/', limiter);

  // Force HTTPS
  app.use((req, res, next) => {
    if (req.header('x-forwarded-proto') !== 'https') {
      res.redirect(`https://${req.header('host')}${req.url}`);
    } else {
      next();
    }
  });
}

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(8080);

কাঠামোগত প্রক্রিয়া

TypeScript, Babel, বা অন্যান্য ফ্রেমওয়ার্ক টুল ব্যবহার করে এমন অ্যাপ্লিকেশনগুলির জন্য, কনফিগারেশন প্রক্রিয়া পরিবেশের মধ্যে আলাদা হয়:

উন্নয়ন কাঠামো

  • debuckling জন্য উৎস মানচিত্র
  • ক্রমাগত সংগ্রহ
  • হট ব্লক প্রতিস্থাপন
  • কম আক্রমণাত্মক উন্নতি

উত্পাদন কাঠামো

  • ছাঁটাই এবং গাছ কাঁপানো
  • সমষ্টি এবং সূচক পৃথকীকরণ
  • প্রিপ্যাকেজড
  • কোন উৎস মানচিত্র (বা বহিরাগত উৎস মানচিত্র)

বিভিন্ন পরিবেশের জন্য webpack.config.js

const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = (env, argv) => {
  const isProduction = argv.mode === 'production';

  return {
    entry: './src/index.js',
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: isProduction
        ? 'bundle.[contenthash].js'
        : 'bundle.js'
    },
    mode: isProduction ? 'production' : 'development',
    // Generate source maps in development but not production
    devtool: isProduction ? false : 'eval-source-map',
    optimization: {
      minimize: isProduction,
      minimizer: isProduction ? [
        new TerserPlugin({
          terserOptions: {
            compress: true,
            mangle: true
          }
        })
      ] : [],
    },
    // Add development server configuration for non-production
    ...(isProduction ? {} : {
      devServer: {
        contentBase: './dist',
        hot: true
      }
    })
  };
};

সর্বোত্তম অনুশীলন

পরিবেশ ভেরিয়েবল ব্যবহার করুন:প্রসঙ্গ-নির্দিষ্ট কনফিগারেশন প্রসঙ্গ ভেরিয়েবলে সংরক্ষণ করুন, কোড নয়
পরিবেশ স্বয়ংক্রিয় করুন:ডকার, ভ্যাগ্রান্ট বা ক্লাউড টেমপ্লেটের মতো টুল ব্যবহার করে স্থিতিশীল পরিবেশ তৈরি করুন
বৈশিষ্ট্য পতাকা সক্ষম করুন:বিভিন্ন প্রসঙ্গে নির্বাচিত বৈশিষ্ট্যগুলি সক্ষম করতে বৈশিষ্ট্য পতাকা ব্যবহার করুন৷
ক্রমাগত ইন্টিগ্রেশন/ডেলিভারি সক্ষম করুন:ধারাবাহিকতা নিশ্চিত করতে পরিবেশ জুড়ে স্বয়ংক্রিয় পরীক্ষা এবং স্থাপনা
পর্যবেক্ষণ এবং সতর্কতা:উত্পাদন পরিবেশে বিশদ পর্যবেক্ষণ এবং সতর্কতা সেট আপ করুন
প্রসঙ্গ পার্থক্য নথিভুক্ত করুন:প্রসঙ্গ-নির্দিষ্ট আর্কিটেকচার এবং প্রয়োজনীয়তার স্পষ্ট ডকুমেন্টেশন বজায় রাখুন

বৈশিষ্ট্য পতাকা উদাহরণ

const featureFlags = {
  development: {
    newUserInterface: true,
    experimentalFeature: true,
    betaAnalytics: true
  },
  production: {
    newUserInterface: false,
    experimentalFeature: false,
    betaAnalytics: true
  }
};

const env = process.env.NODE_ENV || 'development';
const features = featureFlags[env];

if (features.newUserInterface) {
  // Enable the new UI
}

সারাংশ

মূল পয়েন্ট ব্যাখ্যা
NODE_ENV অ্যাপ্লিকেশন উন্নয়ন এবং উৎপাদন পরিবেশের মধ্যে পার্থক্য করতে NODE_ENV পরিবেশ পরিবর্তনশীল ব্যবহার করুন
স্ট্রাকচার ম্যানেজমেন্ট প্রসঙ্গ-নির্দিষ্ট কনফিগারেশন পরিচালনা সক্ষম করুন
ত্রুটি হ্যান্ডলিং উন্নয়ন (বিস্তারিত) এবং উৎপাদন (নিরাপদ) এ ত্রুটিগুলিকে ভিন্নভাবে পরিচালনা করুন।
নিবন্ধন কৌশল প্রেক্ষাপটের উপর ভিত্তি করে লগিং কৌশলগুলি সামঞ্জস্য করুন
কর্মক্ষমতা এবং নিরাপত্তা উৎপাদনে দক্ষতার উন্নতি এবং নিরাপত্তা ব্যবস্থা প্রয়োগ করুন
গঠন এবং বন্টন প্রতিটি পরিবেশের জন্য বিভিন্ন কনফিগারেশন এবং বিতরণ প্রক্রিয়া ব্যবহার করুন

অনুশীলন করুন

প্রোডাকশন মোড চেক করতে সঠিক পরিবেশ পরিবর্তনশীল নির্বাচন করুন: যদি (process.env.______ === 'উৎপাদন') { // ... }

NODE_ENV
✓ ঠিক আছে! NODE_ENV হল একটি স্ট্যাটিক এনভায়রনমেন্ট ভেরিয়েবল যা Node.js অ্যাপ্লিকেশনে পরিবেশ নির্ধারণ করতে ব্যবহৃত হয়। এটি 'উন্নয়ন', 'উৎপাদন', বা 'পরীক্ষা' এ সেট করা যেতে পারে।
ENVIRONMENT
✗ ভুল! ENVIRONMENT Node.js-এ একটি স্থির পরিবেশ পরিবর্তনশীল নয়। পরিবেশ পরীক্ষা করতে NODE_ENV ব্যবহার করা হয়।
NODE_MODE
✗ ভুল! NODE_MODE Node.js-এ একটি স্থির পরিবেশ পরিবর্তনশীল নয়। পরিবেশ পরীক্ষা করতে NODE_ENV ব্যবহার করা হয়।
APP_ENV
✗ ভুল! APP_ENV Node.js-এ একটি আদর্শ পরিবেশ পরিবর্তনশীল নয়, যদিও কিছু ফ্রেমওয়ার্ক এটি ব্যবহার করতে পারে। ধ্রুবক হল NODE_ENV।