在Node.js中从另一个文件包含JavaScript类定义

160

我正在为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文件中并以某种方式“包含”它吗?

6个回答

291

你可以简单地这样做:

user.js

class User {
  //...
}

module.exports = User //  Export class

server.js

的翻译:

server.js

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

let user = new User()

这被称为 CommonJS 模块。

ES模块

自Node.js 14版本以来,可以在CommonJS中使用ES模块。请在ESM文档中了解更多信息。

user.mjs(扩展名很重要)

export default class User {}

server.mjs

的翻译是:

server.mjs

import User from './user.mjs'

let user = new User()

是的。User 是常见的 JavaScript 函数。 - Paul Rumkin
2
你不需要在server.js中创建常量User。将users.js的最后一行改为module.exports = new User();,这将在每次需要该模块时创建一个新的User实例。然后,你可以像这样简单地为每个变量要求该模块:let user = require('./user.js'); - Nadav
这是不正确的。它只会在模块被引用时创建一次用户实例。 - Paul Rumkin
1
@Barnack 我有几个回答。哪一个是错误的,哪一个是正确的? - Paul Rumkin
1
@pashaRumkin 在本地实例化对象,但是我得到了 TypeError:<ClassName> 不是构造函数。 - Md Alamin
显示剩余3条评论

16

使用 ES6,你可以拥有 user.js 文件:

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

然后在 server.js 中使用它。

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

当我按照你所描述的方式操作时,我遇到了“SyntaxError:Unexpected token export”的错误。我的node版本是“v10.16.3”。 - dcts

7

将您的类定义修改为以下内容:

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

然后将文件重命名为user.js。假设它位于您的主要脚本的根目录中,您可以像这样包含它:

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

那就是简短粗暴的版本。如果您想了解更多,请阅读有关CommonJS模块的内容。

2
套接字发生了什么?应该是var someUser = new user.User(socket);吗? - C graphics

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

2
如果您将以下内容添加到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');

0

在Paul Rumkin的答案(第一个答案)的基础上,您可以使用ES模块类与.js扩展名,并且不必使用.mjs扩展名

要做到这一点,请确保您有package.json文件。如果没有,请运行以下命令创建它:

npm init -y

在你的package.json文件的结尾添加"type": "module":
{
 ...
 "type": "module" 
}

创建 user.js 文件并从中导出一个类:
export default class User {}

server.js 中导入该类:

import User from './user.js'

let user = new User()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接