节点:需要模块内部功能
Node: requiring module inside function?
我正在Node中浏览命令行实用程序的源代码,并看到了以下代码。
function help() {
var colors = require('colors');
var package = require('../package');
....
....
}
我以前从未见过需要以这种方式在函数中使用。我一直认为最佳做法是将其包含在文件的顶部。这是此程序的入口文件,此函数仅在特定情况下调用 - 但这些包在程序的其他位置使用。当我向代码作者询问他的理由时,他只是说他"不想一次导入所有库"。
这是好做法还是坏做法?不需要在模块顶部使用这些包,而仅在调用这些函数时,对加载时间是否有重大影响?
更新:我认为更好的答案在这里:节点中的延迟加载.js
我最初的评论:好吧,这是一个练习问题,有些人喜欢顶部,而有些人喜欢懒惰加载。在我看来两者都很好,应该根据需要使用,所以我认为作者就在这里,因为在启动时加载一大堆库会使模块过载许多从未使用过的东西,因此会增加加载时间。尽管按需加载库是一种同步操作,但如果我们将help
方法视为实体,那么它将产生异步模块加载效果(请参阅 AMD,这是一种流行的模式)。
如果您必须在特定情况下加载哪些库之间进行选择,延迟加载也是一个不错的选择,例如
var isOSX;
// some code here which finds if this is OSX
// then this
if (isOSX === true) {
var platformHelper = require('supercoolosxhelper');
} else {
var platformHelper = require('yetanothercoolhelper');
}
简而言之,您应该在代码中预测使用方法的概率是否高甚至中等,那么您应该在顶部要求,否则如果它很低,那么如果模块是根据需要required
的,那就太好了。
在 Node 的情况下,它实际上主要归结为一种风格选择。
从磁盘加载模块几乎不需要任何时间,因此在性能提升方面实际上没有任何内容。 有些人喜欢将模块保持在接近使用它们的位置,仅此而已。
现在,客户端,它完全不同,并且在很大程度上基于您的包管理器。
它有自己的优点和缺点。但一般来说,你应该避免它。这里有一个很好的解释为什么:
第一种情况:假设我只有模块 a.js 和 b.js。模块 a.js需要 B.js 模块 B.js需要 C.js。如果他们要求在模块顶部,当我启动我的应用程序时,我会收到警报找不到模块 C.js,服务器会在我之前崩溃去部署它。如果函数中需要 b.js 和 c.js在部署服务器之前,错误可能未被发现,此时当 Node 尝试加载模块 c 时,整个服务器将崩溃.js如果需要该模块的路由是一个,则可能几天后很少使用。
第二种情况:假设我有一个需要 30 分钟才能加载的模块,这是不合理的,但只是想象一下。如果只需要该模块在一个路由处理程序中,可能需要一些时间才能有人触发该路由和节点必须需要该模块。当这种情况发生时,服务器实际上将在 30 分钟内无法访问,因为该模块已加载。如果这种情况发生在高峰时段,我的几个用户可能会变得不快乐并离开。最终需要该模块在函数与模块顶部的函数消耗相同数量的内存,但是在模块的顶部要求意味着它将始终准备好当有人请求该路线时,您会将其考虑在内部署时间额外增加 30 分钟,而不是凌晨 3 点当客户打电话抱怨他们的网站已关闭时。
- 需要原型内部或外部的功能
- 数组长度 内部功能不同
- 角度控制器功能不;在指令内部调用时,似乎无法始终如一地工作
- 访问内部功能范围的元素,而不是敲除中的外部
- AngularJS控制器内部的功能
- 重用if语句中的代码.(功能内部的功能是不良做法吗?)
- javascript:“;这个“;在内部功能中
- 在 velocit 内部的功能.js序列
- 节点:需要模块内部功能
- Javascript:在内部站点中添加搜索功能
- JavaScript while 循环不执行内部功能
- ES2015导出内部功能
- 使用AndroidDriver运行内部功能测试
- 无法运行内部功能测试.错误:[POST http://localhost:4444/wd/hub/session] co
- 清除标记基于缩放,内部功能
- JQuery弹出$.后内部功能不工作
- 如何使用Jasmine测试内部功能,这些功能用于内部目的
- Durandal小部件的内部功能范围和上下文
- 如何在内部功能测试中使用dijit/ registry ?
- JQuery显示隐藏Div命令的内部功能