我正在尝试根据Express 4.x新express.Router()
方法组织我的项目。
路由器对象是中间件和路由的隔离实例。您 可以把它想象成一个“迷你应用程序”,只能执行 中间件和路由功能。
为了更好地理解,让我们考虑一下这个项目结构:
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直接通过myRouter
将index.js
的代码导入module.exports
。如果是这样,引擎是否会以某种方式进行预编译?然后不是myRouters' requires
多余的?
如果没有,它会如何影响性能?我应该为自己的任务避开路由器吗?
答案 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
;任何表现影响都可以忽略不计。