Development va production


ULASHISH

Rivojlanish va ishlab chiqarish o‘rtasidagi farqlar

Bu sahifada Node.js ilovalaridagi ishlab chiqish va ishlab chiqarish muhitlari o‘rtasidagi asosiy farqlar hamda ikkalasini ham samarali boshqarish bo‘yicha eng yaxshi amaliyotlar yoritilgan.

Bir qarashda asosiy farqlar

Rivojlanish

  • Batafsil ro‘yxatga olish
  • Batafsil xato xabarlari
  • Issiq qayta yuklash yoqilgan
  • Kichiklashtirilmagan kod
  • Soxta ma’lumotlar/stublar

Ishlab chiqarish

  • Minimal ro‘yxatga olish
  • Umumiy xato xabarlari
  • Optimallashtirilgan ishlash
  • Kichkinalashtirilgan va to‘plangan kod
  • Haqiqiy ma’lumotlar/xizmatlar

NODE_ENV muhit o‘zgaruvchisi

Node.js da NODE_ENV muhit o‘zgaruvchisi dastur ishlayotgan muhitni aniqlash uchun ishlatiladigan konventsiyadir.

U odatda "ishlab chiqish" yoki "ishlab chiqarish" ga o‘rnatiladi, ammo "sinov" yoki "staging" kabi boshqa qiymatlar ham qo‘llaniladi.

Eslatma: Ko‘pgina Node.js ramkalari va kutubxonalari (masalan, Express, React, Vue va boshqalar) muayyan funksiyalar va optimallashtirishlarni yoqish yoki o‘chirish uchun NODE_ENV dan foydalanadi.

NODE_ENV sozlamalari

Buyruqlar qatori

# 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 skriptlari

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

cross-env’dan foydalanish (kross-platforma)

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

Ilovangizda NODE_ENV dan foydalanish

// 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();

Eslatma: NODE_ENV=production sozlanishi ilova unumdorligini 35% gacha yaxshilashi mumkin, chunki ba’zi paketlar ushbu sozlama asosida optimallashtirishni qo‘llaydi.



Konfiguratsiya boshqaruvi

Turli muhitlar odatda ma’lumotlar bazalari, API’lar, jurnallar va boshqa xizmatlar uchun turli xil konfiguratsiyalarni talab qiladi.

Muhitga xos konfiguratsiya

dotenv bilan konfiguratsiya

// 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];

Konfiguratsiya fayllari

Konfiguratsiyani boshqarishning umumiy yondashuvlari quyidagilarni o‘z ichiga oladi:

  • Muhit fayllari: dotenv paketi bilan .env fayllardan foydalanish
  • Konfiguratsiya obyektlari: Muhitga xos konfiguratsiya obyektlarini yaratish
  • Konfiguratsiya xizmatlari: AWS Parameter Store, Vault yoki Consul kabi tashqi xizmatlardan foydalanish

Xavfsizlik bo‘yicha ogohlantirish: Hech qachon API kalitlari, ma’lumotlar bazasi hisob ma’lumotlari yoki sirlar kabi maxfiy ma’lumotlarni versiya boshqaruviga topshirmang. Nozik ma’lumotlar uchun har doim muhit o‘zgaruvchilari yoki xavfsiz konfiguratsiya xizmatlaridan foydalaning.


Xato bilan ishlash

Xatolarni bartaraf etish strategiyalari ishlab chiqish va ishlab chiqarish muhitida farq qilishi kerak:

Rivojlanish muhiti

  • Batafsil xato xabarlari va stek izlarini ko‘rsatish
  • Nosozliklarni tuzatishga yordam berish uchun batafsil jurnaldan foydalaning
  • Muammolarni tezda aniqlash uchun xatolarni erta yo‘q qiling
  • Nosozliklarni tuzatish uchun manba xaritalarini yoqing
  • Interaktiv debug vositalarini taqdim eting

Ishlab chiqarish muhiti

  • Amalga oshirish tafsilotlarini xato javoblaridan yashirish
  • Ichki foydalanish uchun xatolarni qayd qiling, lekin umumiy xato xabarlarini qaytaring
  • Tegishli xatolarni tiklash mexanizmlarini joriy qiling
  • Yaxshiroq tahlil qilish uchun tizimli jurnallardan foydalaning
  • Tashqi xizmatlar uchun elektron to‘xtatuvchilarni amalga oshirish

Muhitga xos xatolarni boshqarish

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

Ro‘yxatga olish strategiyalari

Ro‘yxatga olish talablari ishlab chiqish va ishlab chiqarish o‘rtasida sezilarli darajada farqlanadi:

Rivojlanish jurnali

  • Batafsil ma’lumotlarga ega bo‘lgan batafsil jurnal
  • Ranglar bilan inson o‘qiy oladigan format
  • Darhol fikr-mulohaza uchun konsol chiqishi
  • Nosozliklarni tuzatish va kuzatuv darajasidagi jurnallar yoqilgan
  • Jurnalni aylantirish shart emas

Ishlab chiqarish jurnali

  • Structured logging (JSON format)
  • Appropriate log levels (warn/error)
  • Jurnalni aylantirish va saqlash siyosati
  • Markazlashtirilgan jurnallarni yig‘ish
  • Ishlash monitoringi integratsiyasi

Uinston bilan muhitga xos jurnallar

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

Jurnalga kirish haqida qo‘shimcha ma’lumot olish uchun Node.js Logging qo‘llanmasiga qarang.


Ishlashni optimallashtirish

Ishlab chiqarish muhiti ishlash va ishonchlilik uchun optimallashtirilgan bo‘lishi kerak:

Rivojlanish yo‘nalishi

  • Tez yangilash va modulni issiq almashtirish
  • Nosozliklarni tuzatish uchun manba Map’lar
  • Batafsil xato qoplamalari
  • Kichiklashtirilmagan kod
  • Rivojlanish vositalari integratsiyasi

Ishlab chiqarishni optimallashtirish

  • Kodni minimallashtirish va daraxtlarni silkitish
  • Aktivlarni optimallashtirish va siqish
  • Content Delivery Network (CDN) usage
  • Brauzer sarlavhalarini keshlash
  • Ishlash monitoringi

Ishlash bo‘yicha mulohazalar

  • Optimallashtirilgan kodlarni birlashtirish va minimallashtirish
  • Keshlash strategiyalari
  • Bir nechta CPU yadrolaridan foydalanish uchun klaster rejimi
  • Xotira va protsessorni optimallashtirish
  • Tarkibni siqish

Ishlab chiqarishda Klaster rejimida ishlash

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`);
}

Xavfsizlik masalalari

Ishlab chiqarish muhitida xavfsizlik amaliyotlari yanada qattiqroq bo‘lishi kerak:

Ishlab chiqarish xavfsizligi chora-tadbirlari

  • Dulg‘ich: Xavfsizlik bilan bog‘liq HTTP sarlavhalarini o‘rnating
  • So‘rovlarni cheklash (Rate limiting): Shafqatsiz kuch va DoS hujumlaridan himoya qiling
  • CSRF himoyasi: Saytlararo so‘rovlarni qalbakilashtirishning oldini oling
  • Kirishni tekshirish: Barcha foydalanuvchi kiritishlarini sanitarizatsiya qiling
  • HTTPS: Barcha aloqalarni shifrlash
  • Tobelikni skanerlash: Bog‘liklarda zaifliklarni tekshiring

Ishlab chiqarish uchun xavfsizlik o‘rta dasturi

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

Qurilish jarayoni

TypeScript, Babel yoki boshqa qurish vositalaridan foydalanadigan ilovalar uchun qurish jarayoni muhitlar orasida farq qiladi:

Rivojlanish qurilishi

  • Nosozliklarni tuzatish uchun manba Map’lar
  • Incremental kompilyatsiya
  • Issiq modulni almashtirish
  • Kamroq agressiv optimallashtirish

Ishlab chiqarish qurilishi

  • Kichiklashtirish va daraxtlarni silkitish
  • To‘plam va kodni ajratish
  • Oldindan tuzilgan kompilyatsiya
  • Source map’lar yo‘q (yoki tashqi source map’lar)

Turli muhitlar uchun 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
     }
    })
  };
};

Package.json skriptlari

{
  "scripts": {
    "start": "node dist/server.js",
    "dev": "nodemon src/server.ts",
    "build": "tsc",
    "build:prod": "tsc && webpack --mode=production",
    "lint": "eslint src/**/*.ts",
    "test": "jest"
  }
}

Joylashtirish masalalari

Rivojlanish

  • Mahalliy rivojlanish serveri
  • Bog‘liqlar uchun docker konteynerlari
  • Integrated development environment (IDE) tools

Ishlab chiqarish

  • Process managers (PM2, Forever)
  • Container orchestration (Kubernetes, Docker Swarm)
  • Yuklarni muvozanatlash
  • Sog‘liqni saqlash nazorati va nazorati
  • Avtomatlashtirilgan tarqatish payplar (pipes)i
  • Orqaga qaytarish strategiyalari

Ishlab chiqarish uchun PM2 ekotizim fayli

// ecosystem.config.js
module.exports = {
  apps: [{
    name: "my-app",
    script: "./dist/server.js",
    instances: "max",
    exec_mode: "cluster",
    env_development: {
      NODE_ENV: "development",
      PORT: 8080
    },
    env_production: {
      NODE_ENV: "production",
      PORT: 8080
    }
  }]
};

Joylashtirish haqida batafsil ma’lumot olish uchun Node.js Deployment qo‘llanmasiga qarang.


Sinov muhitlari

Turli muhitlarda turli xil sinov talablari mavjud:

Rivojlanish testi

  • Rivojlanish jarayonida birlik sinovlari
  • Integratsiya testlari
  • Tez qayta aloqa zanjirlari
  • Tashqi bog‘liqliklarni mock qilish

Staging/QA muhiti

  • Oxir-oqibat sinovlar
  • Ishlash testi
  • Konfiguratsiya ishlab chiqarishga o‘xshash
  • Soxta ma’lumotlar yoki tozalangan ishlab chiqarish ma’lumotlari

Ishlab chiqarish sinovi

  • Tutun sinovlari
  • Kanareykalarni joylashtirish
  • Haqiqiy foydalanuvchi monitoringi
  • Load testing (during off-peak hours)

Eng yaxshi amaliyotlar

1. Muhit o‘zgaruvchilaridan foydalaning

Muhitga xos konfiguratsiyani kodda emas, balki muhit o‘zgaruvchilarida saqlang.

2. Muhitni sozlashni avtomatlashtirish

Barqaror muhit yaratish uchun Docker, Vagrant yoki bulut shablonlari kabi vositalardan foydalaning.

3. Xususiyatlar bayroqlarini amalga oshirish

Turli muhitlarda funksiyalarni tanlab yoqish uchun xususiyat bayroqlaridan foydalaning.

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
}

4. Uzluksiz integratsiya/uzluksiz joylashtirishni (CI/CD) joriy qiling

Muvofiqlikni ta’minlash uchun sinov va muhitlar bo‘ylab joylashtirishni avtomatlashtiring.

5. Monitor va ogohlantirish

Ishlab chiqarish muhitida keng qamrovli monitoring va ogohlantirishni o‘rnating.

6. Hujjat muhitidagi farqlar

Muhitga xos konfiguratsiyalar va talablarning aniq hujjatlarini saqlang.


Xulosa

  • Ishlab chiqarish va ishlab chiqarish muhitini farqlash uchun NODE_ENV muhit o‘zgaruvchisidan foydalaning
  • Muhitga xos konfiguratsiya boshqaruvini amalga oshirish
  • Xatolarni development (batafsil) va production (xavfsiz) muhitlarida turlicha qayta ishlang
  • Muhitga asoslangan jurnallarni yozish strategiyalarini sozlang
  • Ishlab chiqarishda ishlashni optimallashtirish va xavfsizlik choralarini qo‘llang
  • Har bir muhit uchun turli xil qurish va joylashtirish jarayonlaridan foydalaning
  • Muhitni boshqarish bo‘yicha eng yaxshi amaliyotlarga, shu jumladan avtomatlashtirish va hujjatlarga rioya qiling


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!