Javascript 如果一个文件需要多次解析,它会被多次解析吗?

Javascript 如果一个文件需要多次解析,它会被多次解析吗?,javascript,node.js,require,Javascript,Node.js,Require,我有一个.js文件,其中包含一个类定义(如果需要的话,使用类语法,而不是函数)。然后我希望有一个包含多个文件的文件夹,每个文件都是一个函数,用于创建具有不同属性的所述类的不同实例,并返回该实例。 当然,单实例创建文件无法访问类信息,除非这些文件中的每个文件都有自己的“require”(“class definition.js”);”行。 问题是,既然我将有数百个这样的实例创建文件,那么重复的“require”会扼杀我的性能吗?我不信任JavaScript,我基本上害怕每次出现“require”时

我有一个.js文件,其中包含一个类定义(如果需要的话,使用类语法,而不是函数)。然后我希望有一个包含多个文件的文件夹,每个文件都是一个函数,用于创建具有不同属性的所述类的不同实例,并返回该实例。 当然,单实例创建文件无法访问类信息,除非这些文件中的每个文件都有自己的“require”(“class definition.js”);”行。 问题是,既然我将有数百个这样的实例创建文件,那么重复的“require”会扼杀我的性能吗?我不信任JavaScript,我基本上害怕每次出现“require”时它都会解析并替换类定义。有人知道会不会发生这种情况吗?如果有,有什么解决办法吗?谢谢


相关代码示例:

class_definition.js

class myclass
    {
    constructor(a)
        {
        this.a = a;
        }
    }
实例化_0.js

require("class_definition.js");
module.exports = function()
    {
    return new myclass(0);
    }
实例化_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)();
    }
var arr=[];

例如,javascript中的(var i=0;i模块和文件是单例的,这意味着如果您需要一个文件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 out 4个不同的随机数,但实际上它将注销相同的数4次,因为每个require语句将指向文件
a.js
的一个实例

进一步阅读:

tl;dr

不会。文件将只被访问、解析和执行一次

nodeJS中用于从其他“模块”导入代码的
require
函数使用缓存。每当第一次需要一个模块/文件时,它就会从磁盘读取并“执行”。文件中分配给
module.exports
的值会从require函数调用返回,并缓存在
require.cache
中>。每当在进程内再次需要相同的模块/文件时,将返回缓存副本

您提供的示例代码将无法按预期工作。JS文件中声明的
var
s、
function
s或
class
es都不会添加到全局范围(在nodeJS中)。需要文件时,也不会自动将该文件中声明的符号添加到“当前”范围(与Python不同)。在其他位置需要的文件中,您必须通过将一个或多个“对象”指定给
模块显式导出。导出
导出
。鉴于此,您的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); 
    };
然后,您需要在各种实例文件中使用它,如下所示:

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”)
返回的“value”。
myclass
符号本身从未添加到当前范围,只有对象(包括类在内的所有内容在内部都是对象)指向require的
myclass
符号被缓存并返回。当然,您可以将
const MyClassLocally=require(“class_definition.js”)
替换为
const myclass=require(“class_definition.js”)
如果您想使用相同的名称。

require
将看到您在代码中已经需要它,并且应该将缓存的所需版本取回(文档中有更多内容)。在需要之后,它将被缓存在
require.cache