Node.js: Development vs Production

Node.js பயன்பாடுகளில் மேம்பாட்டு மற்றும் உற்பத்தி சூழல்களுக்கு இடையே உள்ள வேறுபாடுகள்

மேம்பாட்டு மற்றும் உற்பத்தி சூழல்களுக்கு இடையே உள்ள வேறுபாடுகள்

இந்தப் பக்கம் Node.js பயன்பாடுகளில் மேம்பாட்டு மற்றும் உற்பத்தி சூழல்களுக்கு இடையே உள்ள முக்கிய வேறுபாடுகளை உள்ளடக்கியது மற்றும் இரண்டையும் திறம்பட நிர்வகிப்பதற்கான சிறந்த நடைமுறைகளை வழங்குகிறது.

முக்கிய வேறுபாடுகள் ஒரு கண்ணோட்டத்தில்

மேம்பாடு

  • விரிவான பதிவு
  • விரிவான பிழை செய்திகள்
  • ஹாட்-ரிலோடிங் இயக்கப்பட்டது
  • குறைக்கப்படாத குறியீடு
  • மோக் தரவு/ஸ்டப்கள்

உற்பத்தி

  • குறைந்தபட்ச பதிவு
  • பொதுவான பிழை செய்திகள்
  • மேம்படுத்தப்பட்ட செயல்திறன்
  • குறைக்கப்பட்ட மற்றும் தொகுக்கப்பட்ட குறியீடு
  • உண்மையான தரவு/சேவைகள்

NODE_ENV சூழல் மாறி

Node.js இல், NODE_ENV சூழல் மாறி ஒரு பயன்பாடு எந்த சூழலில் இயங்குகிறது என்பதை தீர்மானிக்க பயன்படுத்தப்படும் ஒரு மரபாகும்.

இது பொதுவாக 'development' அல்லது 'production' ஆக அமைக்கப்படுகிறது, இருப்பினும் 'test' அல்லது 'staging' போன்ற பிற மதிப்புகளும் பயன்படுத்தப்படுகின்றன.

💡 குறிப்பு:

பல Node.js கட்டமைப்புகள் மற்றும் நூலகங்கள் (Express, React, Vue, முதலியன) சில அம்சங்கள் மற்றும் மேம்பாடுகளை இயக்க அல்லது முடக்க 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"
  }
}

cross-env பயன்படுத்துதல் (குறுக்கு-தளம்)

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=production ஐ அமைப்பது பயன்பாட்டு செயல்திறனை 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 Parameter Store, Vault, அல்லது Consul போன்ற வெளிப்புற சேவைகளைப் பயன்படுத்துதல்

⚠️ பாதுகாப்பு எச்சரிக்கை:

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 வடிவம்)
  • பொருத்தமான பதிவு நிலைகள் (warn/error)
  • பதிவு சுழற்சி மற்றும் தக்கவைப்புக் கொள்கைகள்
  • மையப்படுத்தப்பட்ட பதிவு ஒருங்கிணைப்பு
  • செயல்திறன் கண்காணிப்பு ஒருங்கிணைப்பு

Winston உடன் சூழல்-குறிப்பிட்ட பதிவு

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');

செயல்திறன் மேம்பாடுகள்

உற்பத்தி சூழல்கள் செயல்திறன் மற்றும் நம்பகத்தன்மைக்காக மேம்படுத்தப்பட வேண்டும்:

மேம்பாட்டு கவனம்

  • விரைவான புதுப்பிப்பு மற்றும் ஹாட் தொகுதி மாற்று
  • டீபக்கிங்கிற்கான மூல வரைபடங்கள்
  • விரிவான பிழை மேலடுக்குகள்
  • குறைக்கப்படாத குறியீடு
  • மேம்பாட்டு கருவிகள் ஒருங்கிணைப்பு

உற்பத்தி மேம்பாடுகள்

  • குறியீட்டு குறைத்தல் மற்றும் மரம்-குலுக்கல்
  • சொத்து மேம்பாடு மற்றும் சுருக்கம்
  • கண்டென்ட் டெலிவரி நெட்வொர்க் (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, அல்லது பிற கட்டமைப்பு கருவிகளைப் பயன்படுத்தும் பயன்பாடுகளுக்கு, கட்டமைப்பு செயல்முறை சூழல்களுக்கு இடையே வேறுபடுகிறது:

மேம்பாட்டு கட்டமைப்பு

  • டீபக்கிங்கிற்கான மூல வரைபடங்கள்
  • தொடர்ச்சியான தொகுப்பு
  • ஹாட் தொகுதி மாற்று
  • குறைந்த ஆக்கிரமிப்பு மேம்பாடுகள்

உற்பத்தி கட்டமைப்பு

  • குறைத்தல் மற்றும் மரம் குலுக்கல்
  • தொகுப்பு மற்றும் குறியீட்டுப் பிரிப்பு
  • முன்கூட்டியே தொகுப்பு
  • மூல வரைபடங்கள் இல்லை (அல்லது வெளிப்புற மூல வரைபடங்கள்)

வெவ்வேறு சூழல்களுக்கான 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
      }
    })
  };
};

சிறந்த நடைமுறைகள்

சூழல் மாறிகளைப் பயன்படுத்தவும்: சூழல்-குறிப்பிட்ட கட்டமைப்பை குறியீட்டில் அல்ல, சூழல் மாறிகளில் சேமிக்கவும்
சூழல் அமைப்பை தானியங்கி செய்யுங்கள்: Docker, Vagrant, அல்லது கிளவுட் வார்ப்புருக்கள் போன்ற கருவிகளைப் பயன்படுத்தி நிலையான சூழல்களை உருவாக்கவும்
அம்சக் கொடிகளை செயல்படுத்தவும்: வெவ்வேறு சூழல்களில் தேர்ந்தெடுக்கப்பட்ட அம்சங்களை இயக்க அம்சக் கொடிகளைப் பயன்படுத்தவும்
தொடர்ச்சியான ஒருங்கிணைப்பு/விநியோகத்தை செயல்படுத்தவும்: நிலைத்தன்மையை உறுதிப்படுத்த சூழல்களில் சோதனை மற்றும் விநியோகத்தை தானியங்கி செய்யுங்கள்
கண்காணித்தல் மற்றும் எச்சரிக்கை: உற்பத்தி சூழல்களில் விரிவான கண்காணிப்பு மற்றும் எச்சரிக்கையை அமைக்கவும்
சூழல் வேறுபாடுகளை ஆவணப்படுத்தவும்: சூழல்-குறிப்பிட்ட கட்டமைப்புகள் மற்றும் தேவைகளின் தெளிவான ஆவணங்களை பராமரிக்கவும்

அம்சக் கொடிகள் எடுத்துக்காட்டு

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 சூழல் மாறியைப் பயன்படுத்தவும்
கட்டமைப்பு நிர்வாகம் சூழல்-குறிப்பிட்ட கட்டமைப்பு நிர்வாகத்தை செயல்படுத்தவும்
பிழை கையாளுதல் மேம்பாட்டில் (விரிவான) மற்றும் உற்பத்தியில் (பாதுகாப்பான) பிழைகளை வித்தியாசமாக கையாளவும்
பதிவு உத்திகள் சூழலை அடிப்படையாகக் கொண்ட பதிவு உத்திகளை சரிசெய்யவும்
செயல்திறன் மற்றும் பாதுகாப்பு உற்பத்தியில் செயல்திறன் மேம்பாடுகள் மற்றும் பாதுகாப்பு நடவடிக்கைகளைப் பயன்படுத்தவும்
கட்டமைப்பு மற்றும் விநியோகம் ஒவ்வொரு சூழலுக்கும் வெவ்வேறு கட்டமைப்பு மற்றும் விநியோக செயல்முறைகளைப் பயன்படுத்தவும்

பயிற்சி

உற்பத்தி பயன்முறையை சரிபார்க்க சரியான சூழல் மாறியைத் தேர்ந்தெடுக்கவும்: if (process.env.______ === 'production') { // ... }

NODE_ENV
✓ சரி! NODE_ENV என்பது Node.js பயன்பாடுகளில் சூழலை தீர்மானிக்க பயன்படும் நிலையான சூழல் மாறியாகும். இது 'development', 'production', அல்லது 'test' ஆக அமைக்கப்படலாம்.
ENVIRONMENT
✗ தவறு! ENVIRONMENT என்பது Node.js இல் ஒரு நிலையான சூழல் மாறி அல்ல. சூழலை சரிபார்க்க NODE_ENV பயன்படுத்தப்படுகிறது.
NODE_MODE
✗ தவறு! NODE_MODE என்பது Node.js இல் ஒரு நிலையான சூழல் மாறி அல்ல. சூழலை சரிபார்க்க NODE_ENV பயன்படுத்தப்படுகிறது.
APP_ENV
✗ தவறு! APP_ENV என்பது Node.js இல் ஒரு நிலையான சூழல் மாறி அல்ல, இருப்பினும் சில கட்டமைப்புகள் இதைப் பயன்படுத்தலாம். நிலையானது NODE_ENV ஆகும்.