我正在构建一个使用express的应用程序,使用护照的facebook登录
示例应用程序是:https://github.com/passport/express-4.x-facebook-example/blob/master/server.js
因此我注意到我可以跳过const/var=require.格式化并直接执行此操作,如果不再需要引用它,例如:
const createError = require('http-errors'),
session = require('cookie-session');..。
app.use(session({ secret: process.env.cookie_secret, resave: true, saveUninitialized: true }));
app.use(function(req, res, next) {
next(createError(404));
});变成了
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));
});很好,我的文件现在有一半长了,但是..。我担心这对表演的影响?
发布于 2020-01-27 03:19:24
require()是一个同步操作,并阻塞事件循环。因此,您通常不希望在服务器中的实际请求处理程序中间执行模块的第一个require(),因为这会暂时阻塞事件循环。
现在,由于模块是缓存的,只有第一次require()模块才会花费很长时间。但是,在同步I/O不是什么大不了的时候,在启动时加载依赖项被认为是一个很好的编码实践,而不是在运行时。
如果加载依赖项有任何问题,您可能还希望在服务器启动时发现这些依赖项,而不是在服务器已经为客户提供服务之后。
所以,我认为你问题的答案是“是”和“否”。是的,直接将require()分配给启动代码中的变量是很好的。不,不建议在请求处理程序或中间件中这样做。最好在启动时加载您的依赖项。现在,如果您碰巧在请求处理程序中执行了一个require(),那么您的代码不会受到很大的伤害,因为只有第一次实际从磁盘加载并花费了很长时间,但作为一般实践,这并不是推荐的编码方式,因为您试图在某个地方保存一个变量名。
就我个人而言,我还想知道,一旦我的服务器启动,所有依赖项也都已成功加载,因此在启动服务请求后发现不完善的安装(可能不太明显,错误的地方和用户会看到后果)没有危险。
还有一件事要考虑。随着时间的推移,Javascript正在从require()迁移到import,除了模块的顶层之外,您不能使用import。你不能在语句中使用它。
摘要:
您希望在启动时加载依赖项,以便在requests.
import而不是require()时,import。https://stackoverflow.com/questions/59924777
复制相似问题