这是节点需要缓存!因此,第一次需要models/index.js
时,它实际运行文件并点击readdirSync的调用,该调用将被执行。
然后,下次我们需要models/index.js
时,它只是从缓存中提取它 - 不需要再次点击磁盘确认它为什么不是完全无效率。
============
这与Sequelize ORM项目提供的Express示例有关。 GitHub回购是https://github.com/sequelize/express-example
我很困惑为什么每次需要fs.readdirSync
文件时都不调用models/index.js
。任何人都可以解释原因吗?
从models
目录开始,您会找到一个index.js
,它会引导模型并调用fs.readdirSync
,它会读取该目录中的其余模型并加载它们(更多准确地调用sequelize.import
)。
我在文件中添加了一个控制台日志。
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf(".") !== 0) && (file !== "index.js");
})
.forEach(function(file) {
var model = sequelize.import(path.join(__dirname, file));
db[model.name] = model;
console.log('######### INSIDE FS #########');
});
定义了另外两个模型,即task.js
和user.js
,它们定义了模式并设置了一些关系。
接下来,routes
目录中会找到两个文件。
index.js
文件定义索引路由(单个获取列出用户及其任务)。
users.js
文件定义具有一些REST端点的用户,以创建新用户或为用户创建/删除任务。
两条路线均以var models = require('../models');
在app.js
文件中,包含和使用路由。
当我运行npm start
并加载应用程序时,我会看到控制台中显示的readdirSync的console.log两次。
但是,如果2个路由都需要models/index.js
来调用fs.readdirSync
来加载2个文件,为什么fs.readdirSync不会被调用4次? (或者,如果我有更多的路线,包括模型/ index.js,那么许多乘以模型的数量)
或者问另一种方式 - 为什么在应用程序启动时只显示控制台日志?
答案 0 :(得分:1)
这更像是一个node.js问题,
在初始加载后的node.js中,模块被缓存,所以当你第一次点击时,它会被缓存,不会再按顺序执行所有函数
请参阅有关节点如何工作或参考的问题,如http://fredkschott.com/post/2014/06/require-and-the-module-system/