[英]express.Router() and requires in Express.js
我正在尝试根据Express 4.x新的express.Router()
方法组织项目。
正如Express的文档中所述,
路由器对象是中间件和路由的隔离实例。 您可以将其视为“微型应用程序”,仅能够执行中间件和路由功能。
为了更好地理解,让我们考虑以下项目结构:
project/
index.js
routes/
myRouter.js
...
...
和文件本身:
index.js
const express = require('express');
const app = express();
const path = require('path');
const myModule = require('myModule');
app.use('/myRouter', require('routes/myRouter'));
// some more code using myModule set of functions
路线/ myRouter.js
const express = require('express');
const path = require('path');
const router = express.Router();
const myModule = require('myModule');
router.get('/', function(req, res){
// some more code using myModule set of functions
});
module.exports = router;
如您所见,这两个文件都需要使用myModule
的函数,因此AFAIK这两个文件都需要使用myModule
。
Express如何处理这种情况?
如我所见,Express通过module.exports
直接将myRouter
的代码导入index.js
。 如果是这样,引擎会以某种方式进行预编译吗? 然后myRouters' requires
冗余?
如果不是,它将如何影响性能? 我应该避免使用路由器吗?
第一件事是它没有被编译,不是es6。 第二个app.js导入模块并为您的路由运行该模块,因此完全有必要在myRouter.js中导入。 这个文章肯定会帮助你理解模块。 还有一件事是,它确实会降低您的应用程序性能。 Express用于node.js,并且使用V8引擎优化了node.js导入。 因此,不必担心性能。
Express如何处理这种情况?
Express不能,Node可以。 来自文档
第一次加载模块后将对其进行缓存。 这意味着(除其他事项外)每次对require('foo')的调用都将返回完全相同的对象,如果它可以解析为相同的文件。
多次调用require('foo')可能不会导致模块代码多次执行。 这是一个重要功能。
因此,考虑到您的应用程序,在路由器首先将myModule
加载为app.js
时已经myModule
进行了缓存; 对性能的影响可以忽略不计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.