web-dev-qa-db-ja.com

Node.js ES6クラスとrequire

これまでのところ、私はnode.jsで次のようにクラスとモジュールを作成しました:

    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;

ES6では、次のように「実際の」クラスを作成できます。

class Animal{

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

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

さて、まず第一に、私はこれが大好きです:)しかしそれは質問を提起します。これをnode.jsのモジュール構造とどのように組み合わせて使用​​しますか?

デモ用にモジュールを使いたいクラスがあり、fsを使いたいとします。

それであなたはあなたのファイルを作成します:


Animal.js

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

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

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

これは正しい方法でしょうか。

また、このクラスを自分のノードプロジェクト内の他のファイルにどのように公開するのですか。別のファイルで使用している場合でも、このクラスを拡張することはできますか?

私はあなたの何人かがこれらの質問に答えられることを願っています:)

75
Marc Rasmussen

はい、あなたの例はうまくいくでしょう。

クラスを公開することに関しては、他のものと同じようにクラスをexportすることができます。

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

または短いです:

module.exports = class Animal {

};

別のモジュールにインポートしたら、そのファイルで定義されているかのように扱うことができます。

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

class Cat extends Animal {
    ...
}
106
rossipedia

ES6のクラス名は、ES5の方法でコンストラクタ名を処理した場合と同じようにしてください。彼らは一つで同じです。

ES6の構文は単なる構文上の糖であり、まったく同じ基礎となるプロトタイプ、コンストラクタ関数、およびオブジェクトを作成します。

だから、あなたのES6の例では:

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

var a = new Animal();

module.exports = {Animal: Animal};

あなたはAnimalをあなたのオブジェクトのコンストラクタのように扱うことができます(ES5でしたのと同じです)。あなたはコンストラクタをエクスポートすることができます。コンストラクタはnew Animal()で呼び出すことができます。使い方はすべて同じです。宣言の構文だけが異なります。まだすべてのメソッドが含まれているAnimal.prototypeがあります。 ES6の方法では、より見栄えのする、より良い構文で、まったく同じコーディング結果が得られます。


インポート側では、これは次のように使用されます。

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

let a = new Animal();

このスキームはAnimalコンストラクタを.Animalプロパティとしてエクスポートします。これにより、そのモジュールから複数のものをエクスポートできます。

複数のものをエクスポートする必要がない場合は、これを実行できます。

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

module.exports = Animal;

そして、それからそれをインポートしてください:

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

let a = new Animal();
7
jfriend00

ES6のrequireの方法はimportです。 import { ClassName } from 'path/to/ClassName'syntaxを使用して、クラスをexportにして他の場所にインポートすることができます。

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';
3
Fan Jin

ノードでクラスを使う -

ここでは、ReadWriteモジュールが必要で、ReadWriteクラスのオブジェクトを返すmakeObject()を呼び出しています。メソッドを呼び出すために使用しているもの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

ここではmakeObjectメソッドを作成します。これは、オブジェクトが使用できない場合にのみ、オブジェクトが確実に返されるようにします。

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;

詳細については、 https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74 を参照してください。

0
Nayan Patel