Включение определения класса JavaScript из другого файла в Node.js
Я пишу простой сервер для 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 и "включить" его каким-то образом?
Ответы
Ответ 1
Вы можете просто сделать это:
user.js
class User {
//...
}
module.exports = User
server.js
const User = require('./user.js')
// Instantiate User:
let user = new User()
ОБНОВЛЕНИЕ 2019
Поскольку модули ES стали стандартом, некоторые авторы используют их в своих статьях, что может сбивать с толку, поскольку Node.js не позволяет использовать ESM. Тем временем Node.js имеет экспериментальную поддержку и требует наличия флага для работы ESM. Прочтите об этом в документации ESM Node.js.
Вот пример того же поведения для пояснения:
user.js
export default class User {}
server.js
import User from './user.js'
let user = new User()
Примечание
⚠️ Не используйте глобальные переменные, это создает потенциальные конфликты с будущим кодом.
Ответ 2
Используя ES6, вы можете иметь user.js
:
export default class User {
constructor() {
...
}
}
И затем используйте его в server.js
const User = require('./user.js').default;
const user = new User();
Ответ 3
Измените определение класса следующим образом:
exports.User = function (socket) {
...
};
Затем переименуйте файл в user.js
. Предполагая его в корневом каталоге вашего основного скрипта, вы можете включить его следующим образом:
var user = require('./user');
var someUser = new user.User();
Это быстрая и грязная версия. Прочтите о модулях CommonJS, если хотите узнать больше.
Ответ 4
В дополнение к тем, которые приведены здесь для 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);
Ответ 5
Если вы добавите это значение в 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');
Ответ 6
Вместо myFile.js напишите ваши файлы как myFile.mjs. Это расширение поставляется со всеми вкусностями ES6, но я имею в виду, я рекомендую вам веб-пакет и Babel