Node.js में किसी अन्य फ़ाइल से जावास्क्रिप्ट वर्ग परिभाषा को शामिल करना


115

मैं Node.js के लिए एक सरल सर्वर लिख रहा हूं और मैं अपनी कक्षा का उपयोग कर रहा हूं जिसे बुलाया जाता है User:

function User(socket) {
    this.socket = socket;
    this.nickname = null;

    /* ... just the typical source code like functions, variables and bugs ... */

    this.write = function(object) {
        this.socket.write(JSON.stringify(object));
    }
};

और फिर बाद में इस प्रक्रिया में मैं इसे बहुत तेज़ कर रहा हूँ:

var server = net.createServer(function (socket) {
    /* other bugs */
    var user = new User(socket);
    /* more bugs and bad practise */
});

क्या मैं अपनी Userकक्षा की परिभाषा को दूसरी जावास्क्रिप्ट फ़ाइल में स्थानांतरित कर सकता हूं और इसे किसी तरह "शामिल" कर सकता हूं ?

जवाबों:


202

आप बस यह कर सकते हैं:

user.js

class User {
    //...
}

module.exports = User

server.js

const User = require('./user.js')

// Instantiate User:
let user = new User()

इसे कॉमनजस मॉड्यूल कहा जाता है ।

कई मान निर्यात करें

कभी-कभी यह एक से अधिक मूल्य के निर्यात के लिए उपयोगी हो सकता है। उदाहरण के लिए यह वर्ग, कार्य या स्थिरांक हो सकते हैं:

user.js

class User {}

exports.User = User
exports.ROLE_ADMIN = 'admin'
exports.ROLE_USER = 'user'
export.isValidUser = function isValidUser() {
    // ...
}

server.js

const {User, ROLE_ADMIN, ROLE_USER, isValidUser} = require('./user.js')

// Instantiate User:
let user = new User()

ईएस मॉड्यूल

Node.js संस्करण 14 के बाद से कॉमनजस के साथ ES मॉड्यूल का उपयोग करना संभव है। ईएसएम प्रलेखन में इसके बारे में और पढ़ें ।

यहाँ यह ESM के साथ लागू किए गए समान व्यवहार का एक उदाहरण है:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

ध्यान दें

⚠️ ग्लोबल्स का उपयोग न करें, यह भविष्य के कोड के साथ संभावित टकराव पैदा करता है।


क्या हो सकता है, अगर उपयोगकर्ता के पास कुछ इनपुट पैरामीटर थे, जैसे मॉड्यूल.एक्सपोर्ट्स = फ़ंक्शन उपयोगकर्ता (डेटा)। फिर var उपयोगकर्ता = नया उपयोगकर्ता (); whould को var user = new User (data) में बदल दिया गया है ?;
सी ग्राफिक्स

हाँ। Userसामान्य js फ़ंक्शन है।
पॉल रुमकिन

2
आपको server.js में निरंतर उपयोगकर्ता बनाने की आवश्यकता नहीं है। module.exports = new User();हर बार मॉड्यूल की आवश्यकता होने पर उपयोगकर्ता की अंतिम पंक्ति को बदलें। इसमें उपयोगकर्ता का एक नया उदाहरण होगा। तो आप बस इस तरह से प्रत्येक चर के लिए मॉड्यूल की आवश्यकता कर सकते हैं let user = require('./user.js');:।
नादव

1
@ बर्नैक मेरे कई जवाब हैं। कौन सा गलत है और कौन सा सही है?
पॉल रुमकिन

1
@pashaRumkin इंस्टेंटिएट ऑब्जेक्ट स्थानीय रूप से, लेकिन मुझे टाइप टाइप मिला: <ClassName> कोई निर्माता नहीं है
Md Alamin

13

ES6 का उपयोग करना, आपके पास हो सकता है user.js:

export default class User {
  constructor() {
    ...
  }
}

और फिर इसमें इस्तेमाल करें server.js

const User = require('./user.js').default;
const user = new User();

SyntaxError: Unexpected token exportजब आपको वर्णित किया जाता है तो मुझे मिलता है ... मेरे पास नोड संस्करण हैv10.16.3
थोमस

6

इस तरह पढ़ने के लिए अपनी कक्षा परिभाषा को संशोधित करें:

exports.User = function (socket) {
  ...
};

फिर फ़ाइल का नाम बदलें user.js। इसे अपनी मुख्य स्क्रिप्ट की मूल निर्देशिका में मानते हुए, आप इसे इस तरह शामिल कर सकते हैं:

var user = require('./user');
var someUser = new user.User();

यह त्वरित और गंदा संस्करण है। यदि आप अधिक जानना चाहते हैं, तो कॉमनजेएस मॉड्यूल के बारे में पढ़ें ।


2
सॉकेट का क्या हुआ? यह var someUser = new user.User (सॉकेट) होना चाहिए;
सी ग्राफिक्स 21

5

ES6 के लिए यहां दिए गए लोगों के अलावा एक और तरीका

module.exports = class TEST{
    constructor(size) {
        this.map = new MAp();
        this.size = size;

    }

    get(key) {
        return this.map.get(key);
    }

    length() {
        return this.map.size;
    }    

}

और के रूप में ही शामिल हैं

var TEST= require('./TEST');
var test = new TEST(1);

1

यदि आप इसे करने के लिए कहते हैं user.js:

exports.User = User;

तो server.jsआप में कर सकते हैं:

var userFile = require('./user.js');
var User = userFile.User;

http://nodejs.org/docs/v0.4.10/api/globals.html#require

एक और तरीका है:

global.User = User;

तब यह पर्याप्त होगा server.js:

require('./user.js');

1

मैं केवल यह बताना चाहता हूं कि यहां अधिकांश उत्तर काम नहीं करते हैं, मैं NodeJS और IDK के लिए नया हूं, अगर पूरे समय में "मॉड्यूल.exports.yourClass" विधि बदल गई, या यदि लोग सिर्फ गलत उत्तर दर्ज करते हैं।

// MyClass

module.exports.Ninja = class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}
//Using MyClass in seprate File


const ninjaFw = require('./NinjaFw');

let ninja = new ninjaFw.Ninja();
ninja.test();
  • यह वह विधि है जिसका मैं वर्तमान में उपयोग कर रहा हूं। मुझे यह वाक्यविन्यास पसंद है, becuase मॉड्यूल.exports वर्ग घोषणा के रूप में एक ही लाइन पर बैठता है और जो कोड को थोड़ा इमो को साफ करता है। दूसरा तरीका जो आप कर सकते हैं वह इस प्रकार है:
//  Ninja Framework File


class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}


module.exports.Ninja = Ninja;
  • दो अलग वाक्यविन्यास लेकिन, अंत में, एक ही परिणाम। सिंटेक्स एनेस्थेटिक्स की बात है।

0

MyFile.js के बजाय myFile.mjs की तरह अपनी फ़ाइलें लिखें। यह विस्तार es6 की सभी अच्छाइयों के साथ आता है, लेकिन मेरा मतलब है कि मैं आपको वेबपैक और बैबिल की सलाह देता हूं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.