首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Express中直接使用require(),而不是将其放置在变量中

在Express中直接使用require(),而不是将其放置在变量中
EN

Stack Overflow用户
提问于 2020-01-27 03:11:24
回答 1查看 39关注 0票数 0

我正在构建一个使用express的应用程序,使用护照的facebook登录

示例应用程序是:https://github.com/passport/express-4.x-facebook-example/blob/master/server.js

因此我注意到我可以跳过const/var=require.格式化并直接执行此操作,如果不再需要引用它,例如:

代码语言:javascript
复制
const createError = require('http-errors'),
session = require('cookie-session');

..。

代码语言:javascript
复制
app.use(session({ secret: process.env.cookie_secret, resave: true, saveUninitialized: true }));
app.use(function(req, res, next) {
    next(createError(404));
});

变成了

代码语言:javascript
复制
app.use(require('cookie-session')({ secret: process.env.cookie_secret, resave: true, saveUninitialized: true }));
app.use(function(req, res, next) {
    next(require('http-errors')(404));
});

很好,我的文件现在有一半长了,但是..。我担心这对表演的影响?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-27 03:19:24

require()是一个同步操作,并阻塞事件循环。因此,您通常不希望在服务器中的实际请求处理程序中间执行模块的第一个require(),因为这会暂时阻塞事件循环。

现在,由于模块是缓存的,只有第一次require()模块才会花费很长时间。但是,在同步I/O不是什么大不了的时候,在启动时加载依赖项被认为是一个很好的编码实践,而不是在运行时。

如果加载依赖项有任何问题,您可能还希望在服务器启动时发现这些依赖项,而不是在服务器已经为客户提供服务之后。

所以,我认为你问题的答案是“是”和“否”。是的,直接将require()分配给启动代码中的变量是很好的。不,不建议在请求处理程序或中间件中这样做。最好在启动时加载您的依赖项。现在,如果您碰巧在请求处理程序中执行了一个require(),那么您的代码不会受到很大的伤害,因为只有第一次实际从磁盘加载并花费了很长时间,但作为一般实践,这并不是推荐的编码方式,因为您试图在某个地方保存一个变量名。

就我个人而言,我还想知道,一旦我的服务器启动,所有依赖项也都已成功加载,因此在启动服务请求后发现不完善的安装(可能不太明显,错误的地方和用户会看到后果)没有危险。

还有一件事要考虑。随着时间的推移,Javascript正在从require()迁移到import,除了模块的顶层之外,您不能使用import。你不能在语句中使用它。

摘要:

您希望在启动时加载依赖项,以便在requests.

  • You的实际处理过程中不阻塞事件循环,希望在启动时加载依赖项,因此您在服务器启动时发现缺少的依赖项,而不是在服务器run-time.

  • Code期间,通常认为如果依赖关系对于处理此模块的任何人来说都是显而易见且易于看到的,则
  1. 更容易阅读。将来,当我们都在使用import而不是require()时,
  2. 只允许在顶层使用import
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59924777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档