包括来自Node.js中另一个文件的JavaScript类定义


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类定义移动到另一个javascript文件并以某种方式“包括”它吗?

Answers:


202

您可以简单地做到这一点:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

这称为CommonJS模块。

导出多个值

有时,导出多个值可能很有用。例如,它可以是类,函数或常量:

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

ES模块

从Node.js版本14开始,可以将ES模块与CommonJS一起使用。在ESM文档中阅读有关它的更多信息。

这是用ESM实现的相同行为的示例:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

注意

⚠️不要使用全局变量,它会与将来的代码产生潜在冲突。


如果用户有一些输入参数,例如module.exports = function User(data),该怎么办?然后,var user = new User(); 谁应该更改为var user = new User(data);?
C图形

是。User是通常的js函数。
Paul Rumkin 2014年

2
您无需在server.js中创建常量User。将user.js的最后一行更改为,module.exports = new User();这将在每次需要该模块时创建一个新的User实例。然后,你可以简单地需要这样每个变量的模块:let user = require('./user.js');
纳达夫

1
@Barnack我有几个答案。哪个是错误的,哪个是正确的?
Paul Rumkin

1
@pashaRumkin在本地实例化对象,但是我得到TypeError:<ClassName>不是构造函数
Md Alamin 18/12/20

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

那是又快又脏的版本。如果您想了解更多信息,请阅读有关CommonJS模块的信息。


2
插座发生了什么事?应该是var someUser = new user.User(socket);
C图形

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

我只想指出,这里的大多数答案都行不通,如果在整个过程中“ module.exports.yourClass”方法发生更改,或者人们输入的答案错误,我对NodeJS和IDK都是陌生的。

// 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();
  • 这是我目前正在使用的方法。我喜欢这种语法,因为module.exports与类声明位于同一行,因此可以将代码清理一些imo。您可以执行的另一种方式是这样的:
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • 两种不同的语法,但最终得到相同的结果。只是语法麻醉的问题。

0

代替myFile.js编写类似myFile.mjs的文件。该扩展附带了es6的所有功能,但我的意思是我向您推荐webpack和Babel

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.