Электронное приложение дублирует переменные при импорте из двух разных классов ...? - PullRequest
0 голосов
/ 06 января 2020

У меня есть электронное приложение (Запуск машинописного текста, скомпилированного в es6), и я пытаюсь сделать относительно простое управление окнами. Моя единственная проблема в том, что, похоже, дублируется переменная, в которой я пытаюсь сохранить все windows in.

Упрощенная версия системы классов выглядит следующим образом:

// index.js
const { app } = require('electron');
const { Project } = require('./project');
const { Window } = require('./Window');

function createWindow() {
    console.log("");
}

app.on('ready', createWindow);
// window.js
console.log("Creating new map!!!!");
const windows = new Map();

class Window {
    static createWindow(name) {
        windows.set(name, "0");
    }
}
module.exports = {
    Window
};
// project.js
const { Window } = require("./window");
class Project {

}
module.exports = {
    Project
};

Я ожидаю, что результат будет просто:

Creating new Map!!!!

Но вместо этого я получаю две карты:

Creating new Map!!!!
Creating new Map!!!!

В итоге получается странное поведение потому что я хочу, чтобы переменная карты windows действовала как переменная stati c, которая присоединена к классу Window, то есть существует только один ее экземпляр, но я пробовала так много разных способов и не могу показаться чтобы заставить это работать.

Кто-нибудь знает, как избежать этого странного дублирования переменных при использовании нескольких операторов require?

Вот пакет. json на случай, если кто-то захочет продублировать это поведение .

// package.json
{
  "name": "testproj",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/node": "^12.12.2",
    "electron": "^7.1.7"
  }
}

1 Ответ

2 голосов
/ 07 января 2020

Это происходит потому, что для Node.js require

  • './window и
  • './Window (с заглавной буквы W в начале)

отличается.

Кэширование учитывает регистр и считает их различными. Таким образом, файл анализируется дважды, как вы заметили.

Вы можете проверить, что происходит с

console.log(require.cache)

. Вы увидите window и Window как клавиши . для двух разных объектов

{ ...
  'path/to/window.js': Module { ... }
  'path/to/Window.js': Module { ... }
}

Некоторые чтения о топи c

...