2016-03-05 63 views
4

我正在浏览Node中命令行实用程序的源代码,并看到以下代码。节点:需要模块内部功能吗?

function help() { 
    var colors = require('colors'); 
    var package = require('../package'); 
    .... 
    .... 
} 

我以前没见过要这样用在函数里面。我总是认为最好的做法是将它包含在文件的顶部。这是这个程序的入口文件,这个函数只在特定的情况下被调用,但是这些程序包在程序的其他地方使用。当我向代码作者推荐他的推理时,他只是表示他“不想一次导入所有的库”。

这是好的/不好的做法?通过不需要模块顶部的这些软件包,而是仅在调用这些函数时才会对装入时间产生重大影响?

+0

不清楚你在问什么,只是一个建议? – Farside

+0

这意味着在需要的时候随时随地包括所需的东西,而不是一次性的 –

+0

一个潜在的缺点是您将同步I/O引入到服务器的运行时行为中,这通常被认为是糟糕的设计模式。现在幸运的是,'require()'从缓存中运行,所以同步I/O只在第一次调用该函数时发生,这限制了影响,它可能是本地磁盘I/O,解析和运行JS文件潜在的依赖模块),但仍不被认为是最佳实践。通常,接受更多的加载时间比缓慢请求处理程序更好。 – jfriend00

回答

4

UPDATE: 我想一个更好的答案就在这里: Lazy loading in node.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将会很好。

+0

感谢链接。几乎是我正在寻找的。 – Kevin

+0

不客气兄弟:) –

2

在Node的情况下,它真的归结为风格的选择。

从磁盘加载模块几乎不需要任何时间,所以在性能增益方面确实没有任何东西。有些人喜欢让模块接近他们将要使用的地步,就这些。

现在,客户端,它的所有不同,并严重依赖于你的包管理器。

+0

请记住,它不只是加载一个模块。它正在加载一个模块及其所有依赖模块和所有依赖模块等。一个单独的'require()'实际上可能最终会加载很多模块,这取决于模块最终进入哪个模块。 – jfriend00

相关问题