Используйте статический файл JavaScript на клиенте и сервере nodejs - PullRequest
1 голос
/ 01 апреля 2019

У меня работает сервер node.js, в котором есть папка со статическим содержимым.У меня есть код модели, который я хотел бы иметь на сервере и на клиенте, поэтому я поместил его в папку со статическим содержимым.Я использовал module.exports = {MyClass}, чтобы на сервере я мог импортировать его с const MyClass = require('./static-content/MyClass.js');.Это работает для сервера, однако, клиент не может сделать require, и если я помещаю скрипт в html с <script language="javascript" src="MyClass.js" > </script>, то я получаю ошибку:

ReferenceError: модуль не определен

Есть ли способ, как для клиента, так и для сервера, использовать файл javascript без создания дубликатов кода модели?Контекст заключается в том, что у меня есть объект на сервере, который должен передаваться между сервером и клиентом.Так как он имеет циклические ссылки и функции, я не могу просто JSON.stringify объект, поэтому я вручную принимаю его состояние, превращаю его в объект JSON, отправляю его через WebSocket и обращаю его на клиент.

1 Ответ

0 голосов
/ 02 апреля 2019

Вы можете просто проверить, существует ли module в области видимости. Если да, экспортируйте его, иначе ничего не делайте. Рассмотрим следующий пример:

статический / Testclass.js

class TestClass {
    constructor(someParam = 'initial state') {
        this.someField = someParam;
    }
    doStuff() {
        return `${this.someField}`;
    }

}

const testClassInstance = new TestClass('some other state');

if (typeof (module) !== 'undefined' && module.exports) {
    module.exports = {
        TestClass,
        testClassInstance
    };
}

статический / test.html

<!DOCTYPE html>
<head>
    <script src="/static/TestClass.js"></script>
</head>

<body>
    <p id="test"></p>
    <p id="test2"></p>
    <script>
        document.getElementById("test").innerText = new TestClass().doStuff();
        document.getElementById("test2").innerText = testClassInstance.doStuff();
    </script>
</body>

server.js

const TestClass = require('./static/TestClass').TestClass;
const testClassInstance = require('./static/TestClass').testClassInstance;
let  testObj = new TestClass();
console.log(testObj.doStuff());
console.log(testClassInstance.doStuff());

const express = require('express')
const app = express()
const port = 3000

app.use('/static', express.static('static'));
app.listen(port);

Это будет лог

initial state
some other state

к консоли при запуске сервера, и два абзаца на html-странице также будут содержать это содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...