Будет ли файл анализироваться несколько раз, если мне потребуется несколько раз? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть файл .js, который содержит определение класса (с синтаксисом класса, а не с функцией, на случай, если это имеет значение). Затем я хочу иметь папку с несколькими файлами, каждый из которых будет функцией, которая создает другой экземпляр указанного класса с различными свойствами и возвращает экземпляр. Конечно, файл, создающий один экземпляр, не может получить доступ к информации о классе, если у каждого из этих файлов нет своих собственных «require (« class definition.js »);» линия. Дело в том, что, поскольку у меня будут сотни файлов для создания экземпляров, будет ли повторное «требование» снижать мою производительность? Я не доверяю JavaScript, я в основном боюсь, что он будет анализировать и заменять определение класса каждый раз, когда появляется «require». Кто-нибудь знает, если это произойдет? Если это так, есть ли обходной путь? Спасибо.


Пример соответствующего кода:

class_definition.js

class myclass
    {
    constructor(a)
        {
        this.a = a;
        }
    }

instantiate_0.js

require("class_definition.js");
module.exports = function()
    {
    return new myclass(0);
    }

instantiate_1.js

require("class_definition.js");
module.exports = function()
    {
    return new myclass(1);
    }

test.js

var arr = [];
for(var i=0; i<2; i++)
    {
    arr[i] = require("instantiate_" + i)();
    }

Что я хотел бы иметь, так это что-то вроде .h файлов в c ++, что-то вроде директивы "#pragma Once" для файла определения класса.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

ТЛ; др

Не будет. Файл будет доступен, проанализирован и выполнен только один раз.

Функция require, используемая в nodeJS для импорта кода из других «модулей», использует кэширование. Всякий раз, когда модуль / файл требуется с первого раза, он считывается с диска и «выполняется». Значение, присвоенное module.exports в файле, возвращается из вызова функции require, а также кэшируется в require.cache. Всякий раз, когда тот же самый модуль / файл требуется снова, в процессе, вместо этого возвращается кэшированная копия.

Пример кода, который вы предоставили, не будет работать так, как вы ожидаете. Ни один из var s, function s или class es, объявленный в файле JS, не добавляется в глобальную область (в nodeJS). Требуя файл, автоматически не добавляет символы, объявленные в этом файле, в «текущую» область (в отличие от Python). В файле, который потребуется в другом месте, вы должны явно экспортировать один или несколько «объектов», назначив его module.exports или exports. В свете этого ваш class_definition.js должен выглядеть примерно так:

class myclass
{
    constructor(a)
    {
        this.a = a;
    }
}
module.exports = myclass;

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

const MyClassLocally = require("class_definition.js");
module.exports = function()
    {
        return new MyClassLocally(1); 
    };

Обратите внимание, что для построения объекта в этом файле вы будете использовать имя, которое вы дали локальной переменной, в которой хранилось возвращаемое значение из require("class_definition.js"). Символ myclass как таковой никогда не добавлялся в текущую область, только объект (все, что содержит класс, является внутренним объектом), который символ myclass указывал на кэширование и возвращение по требованию. Вы, конечно, можете заменить const MyClassLocally = require("class_definition.js"); на const myclass = require("class_definition.js");, если хотите использовать то же имя.

0 голосов
/ 03 мая 2018

Модули и файлы в javascript являются синглетонами, что означает, что если вам потребуется один файл 50 раз, все они будут указывать на отдельный экземпляр. Возьмите для примера этот код:

`// file a.js
module.exports = Math.random()`

`// file main.js
console.log(require('./a'));
console.log(require('./a'));
console.log(require('./a'));
console.log(require('./a'));`

Вы можете подумать, что вы будете console.log 4 разных случайных числа, но оно действительно выйдет из одного и того же числа 4 раза, потому что каждый оператор require будет указывать на один экземпляр файла a.js.

Дальнейшее чтение: https://willi.am/blog/2014/10/12/understanding-nodes-require-function/

...