Kelas Node.js ES6 dengan membutuhkan

103

Jadi sampai saat ini, saya telah membuat kelas dan modul node.jsdengan cara sebagai berikut:

    var fs = require('fs');

var animalModule = (function () {
    /**
     * Constructor initialize object
     * @constructor
     */
    var Animal = function (name) {
        this.name = name;
    };

    Animal.prototype.print = function () {
        console.log('Name is :'+ this.name);
    };

    return {
        Animal: Animal
    }
}());

module.exports = animalModule;

Sekarang dengan ES6, Anda dapat membuat kelas "sebenarnya" seperti ini:

class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

Sekarang, pertama-tama, saya suka ini :) tetapi ini menimbulkan pertanyaan. Bagaimana Anda menggunakan ini yang dikombinasikan dengan node.jsstruktur modul?

Katakanlah Anda memiliki kelas di mana Anda ingin menggunakan modul untuk kepentingan demonstrasi, katakanlah Anda ingin menggunakannya fs

jadi Anda membuat file Anda:


Animal.js

var fs = require('fs');
class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

Apakah ini cara yang benar?

Juga, bagaimana Anda mengekspos kelas ini ke file lain dalam proyek node saya? Dan apakah Anda masih dapat memperluas kelas ini jika Anda menggunakannya dalam file terpisah?

Saya harap beberapa dari Anda dapat menjawab pertanyaan-pertanyaan ini :)

Marc Rasmussen
sumber
3
Perlakukan saja nama kelas ES6 sama seperti Anda akan memperlakukan nama konstruktor dengan cara ES5. Mereka satu dan sama. Sintaks ES6 hanyalah gula sintaksis dan membuat prototipe dasar, fungsi dan objek konstruktor yang sama persis.
jfriend00
IIFE yang membuat Anda animalModulecukup berguna dalam modul node yang memiliki ruang lingkup modulnya sendiri.
Bergi

Jawaban:

156

Ya, teladan Anda akan bekerja dengan baik.

Adapun untuk mengekspos kelas Anda, Anda dapat exportmembuat kelas seperti yang lainnya:

class Animal {...}
module.exports = Animal;

Atau lebih pendek:

module.exports = class Animal {

};

Setelah diimpor ke modul lain, Anda dapat memperlakukannya seolah-olah itu didefinisikan dalam file itu:

var Animal = require('./Animal');

class Cat extends Animal {
    ...
}
rossipedia
sumber
8
Anda juga bisa melakukan sesuatu seperti module.exports = class Animal {}
Paul
itu benar, saya selalu lupa Anda dapat memberi nama hal-hal selama tugas.
rossipedia
Itu tergantung pada gaya dan kejelasan kode. module.exportsbiasanya digunakan untuk ekspor anonim, sedangkan exportdigunakan untuk ekspor bernama. Ini adalah kesopanan pengkodean dasar (bisa Anda katakan), yang dapat membantu orang lain untuk mengetahui cara mengimpor kelas Anda, modul dan lain-lain.
greg.arnott
7
module.exports = Animal;akan menjadi jawaban atau paling langsung setara dengan pertanyaan dan valid bersama dengan const Animal = require('./animal');kode panggilan. Bisakah Anda memperbarui jawaban Anda untuk memasukkannya?
sun
1
Terima kasih kawan, saya telah berjuang agar impor kelas berfungsi dengan benar selama 2 jam.
kiwicomb123
11

Perlakukan saja nama kelas ES6 sama seperti Anda akan memperlakukan nama konstruktor dengan cara ES5. Mereka satu dan sama.

Sintaks ES6 hanyalah gula sintaksis dan membuat prototipe dasar, fungsi dan objek konstruktor yang sama persis.

Jadi, dalam contoh ES6 Anda dengan:

// animal.js
class Animal {
    ...
}

var a = new Animal();

module.exports = {Animal: Animal};

Anda bisa memperlakukan Animalseperti konstruktor objek Anda (sama seperti yang Anda lakukan di ES5). Anda dapat mengekspor konstruktor. Anda dapat memanggil konstruktor dengan new Animal(). Semuanya sama untuk menggunakannya. Hanya sintaks deklarasi yang berbeda. Bahkan masih ada Animal.prototypeyang memiliki semua metode Anda di atasnya. Cara ES6 benar-benar membuat hasil pengkodean yang sama, hanya dengan sintaks yang lebih bagus / lebih bagus.


Di sisi impor, ini kemudian akan digunakan seperti ini:

const Animal = require('./animal.js').Animal;

let a = new Animal();

Skema ini mengekspor konstruktor Animal sebagai .Animalproperti yang memungkinkan Anda mengekspor lebih dari satu hal dari modul itu.

Jika Anda tidak perlu mengekspor lebih dari satu hal, Anda dapat melakukan ini:

// animal.js
class Animal {
    ...
}

module.exports = Animal;

Dan, kemudian impor dengan:

const Animal = require('./animal.js');

let a = new Animal();
jfriend00
sumber
Saya tidak tahu mengapa tetapi ini tidak berhasil untuk saya. module.exports = Animaladalah satu-satunya solusi yang berhasil.
Sam
1
@ Sam - Apa yang ditunjukkan ekspor saya membutuhkan yang berbeda require()dari apa yang ditunjukkan ekspor Anda, jadi itulah sebabnya yang satu akan berhasil dan yang lainnya tidak. Anda harus mencocokkan cara kerja impor dengan cara ekspor didefinisikan. Lebih detail untuk menjelaskan ini ditambahkan ke jawaban saya.
jfriend00
6

Cara kebutuhan ES6 adalah import. Anda dapat exportkelas Anda dan mengimpornya di tempat lain menggunakan import { ClassName } from 'path/to/ClassName'sintaks.

import fs from 'fs';
export default class Animal {

  constructor(name){
    this.name = name ;
  }

  print(){
    console.log('Name is :'+ this.name);
  }
}

import Animal from 'path/to/Animal.js';
Fan Jin
sumber
4
Sebaiknya klarifikasi bahwa ini adalah opsi, tetapi bukan persyaratan. Ini adalah sintaks modul ES6, tetapi Anda masih dapat menggunakan kelas ES6 dengan ekspor CommonJS normal Node. Tidak ada persyaratan bahwa Anda menggunakan sintaks ekspor ES6 dengan kelas. Menyebutnya The ES6 wayagak menyesatkan.
loganfsmyth
2
Itu benar, itu pilihan pribadi. Secara pribadi, saya akan menggunakan importlebih requirehanya demi konsistensi sintaksis.
Fan Jin
2
Ya, ini adalah pendekatan yang solid dan saya juga melakukannya, namun perlu diingat bahwa cara Babel bekerja sama importdengan modul CommonJS kemungkinan besar tidak akan berfungsi di Node, jadi mungkin diperlukan perubahan kode di masa mendatang agar kompatibel dengan Node tanpa Babel .
loganfsmyth
4
Modul ES6 (impor dan ekspor) masih eksperimental di Node 10 dan perlu diaktifkan saat meluncurkan node
dcorking
Untuk menambah poin @ dorking. Node 10.15.3 adalah versi LTS (dukungan jangka panjang) dan akan berlangsung hingga April 2020. Detail tambahannya ada di sini: nodejs.org/en/about/releases
gtzilla
1

Menggunakan Kelas di Node -

Di sini kita membutuhkan modul ReadWrite dan memanggil makeObject (), yang mengembalikan objek kelas ReadWrite. Yang kami gunakan untuk memanggil metode. index.js

const ReadWrite = require('./ReadWrite').makeObject();
const express = require('express');
const app = express();

class Start {
  constructor() {
    const server = app.listen(8081),
     host = server.address().address,
     port = server.address().port
    console.log("Example app listening at http://%s:%s", host, port);
    console.log('Running');

  }

  async route(req, res, next) {
    const result = await ReadWrite.readWrite();
    res.send(result);
  }
}

const obj1 = new Start();
app.get('/', obj1.route);
module.exports = Start;

ReadWrite.js

Di sini kami membuat metode makeObject, yang memastikan bahwa suatu objek dikembalikan, hanya jika objek tidak tersedia.

class ReadWrite {
    constructor() {
        console.log('Read Write'); 
        this.x;   
    }
    static makeObject() {        
        if (!this.x) {
            this.x = new ReadWrite();
        }
        return this.x;
    }
    read(){
    return "read"
    }

    write(){
        return "write"
    }


    async readWrite() {
        try {
            const obj = ReadWrite.makeObject();
            const result = await Promise.all([ obj.read(), obj.write()])
            console.log(result);
            check();
            return result
        }
        catch(err) {
            console.log(err);

        }
    }
}
module.exports = ReadWrite;

Untuk penjelasan lebih lanjut, buka https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74

Nayan Patel
sumber
0

Dalam file kelas, Anda dapat menggunakan:

module.exports = class ClassNameHere {
 print() {
  console.log('In print function');
 }
}

atau Anda dapat menggunakan sintaks ini

class ClassNameHere{
 print(){
  console.log('In print function');
 }
}

module.exports = ClassNameHere;

Di sisi lain untuk menggunakan kelas ini di file lain, Anda perlu melakukan langkah-langkah ini. Pertama, minta file itu menggunakan sintaks ini: const anyVariableNameHere = require('filePathHere');

Kemudian buatlah sebuah objek const classObject = new anyVariableNameHere();

Setelah ini, Anda dapat menggunakan classObjectuntuk mengakses variabel kelas yang sebenarnya

Burhan Maseel
sumber