express.Router()并在Express.js中需要

时间:2017-08-28 17:26:30

标签: node.js express caching

我正在尝试根据Express 4.x新express.Router()方法组织我的项目。

正如Express' documentation所述,

  

路由器对象是中间件和路由的隔离实例。您   可以把它想象成一个“迷你应用程序”,只能执行   中间件和路由功能。

为了更好地理解,让我们考虑一下这个项目结构:

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直接通过myRouterindex.js的代码导入module.exports。如果是这样,引擎是否会以某种方式进行预编译?然后不是myRouters' requires多余的?

如果没有,它会如何影响性能?我应该为自己的任务避开路由器吗?

2 个答案:

答案 0 :(得分:1)

首先,它不会被编译,它不是es6。第二个app.js导入模块并为您的路由运行该模块,因此myRouter.js中的导入是完全必要的。 This文章肯定会帮助您理解模块。还有一件事是它确实会降低您的应用程序性能。 Express用于node.js,node.js导入使用V8引擎进行优化。所以不要担心性能。

答案 1 :(得分:1)

  

Express如何处理这种情况?

Express没有,Node确实如此。来自docs

  

模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require(' foo')将获得完全相同的返回对象,如果它将解析为同一文件。

     

多次调用require(' foo')可能不会导致模块代码多次执行。这是一个重要的特征......

因此,考虑到您的应用程序,myModule已经在路由器加载它时被缓存,因为首先需要app.js;任何表现影响都可以忽略不计。