在编译像C这样的语言时,我们有一个预处理器可以用来跳过部分程序而不编译它们,实际上只是将它们从源代码中排除:
#ifdef SHOULD_RUN_THIS
/* this code not always runs */
#endif
因此,如果未定义SHOULD_RUN_THIS
,则代码将永远不会运行。
在node.js中,我们没有直接相当于此,所以我能想到的第一件事就是
if (config.SHOULD_RUN_THIS) {
/* this code not always runs */
}
但是在节点中无法保证config.SHOULD_RUN_THIS
永远不会改变,因此每次都会进行if (...)
检查。
重写它最有效的方法是什么?我能想到
a)创建一个单独的函数以允许v8优化:
function f(args) {
if (config.SHOULD_RUN_THIS) {
/* this code not always runs */
}
}
// ...
f(args);
b)创建一个变量来存储函数,并在不需要时将其设置为空函数:
var f;
if (config.SHOULD_RUN_THIS) {
f = (args) => {
/* this code not always runs */
}
}
else {
f = function () {} // does nothing
}
// ...
f(args);
c)不要创建单独的功能,只需将其保留到位:
if (config.SHOULD_RUN_THIS) {
/* this code not always runs */
}
最高效的方式是什么?也许还有其他方式...
答案 0 :(得分:1)
我个人会采纳......
if (config.SHOULD_RUN_THIS) {
require('/path/for/conditional/module');
}
仅在需要时才需要模块代码,否则它甚至不会被加载到内存中,更不用说了。
唯一的缺点是,由于您的require语句并非全部位于文件的顶部,因此不太清楚需要哪些模块。
es6模块化采用这种动态模块请求方法。
PS使用这样的配置非常好,因为您可以使用环境变量来确定您的代码路径。例如,根据传递给docker run语句的env变量,你想要表现出不同行为的一堆docker容器,这很棒。
如果你不是一个码头迷,请为此见识道歉:)道歉我现在胡扯!答案 1 :(得分:1)
如果您正在为Javascript寻找预处理器,为什么不使用a preprocessor for your Javascript?它与节点兼容,似乎可以满足您的需求。您还可以考虑为Babel或其他一些JS修改工具编写插件(或者v8本身!)
如果您正在寻找一种在语言本身内执行此操作的方法,我会避免针对像v8这样的单个引擎的任何优化,除非您确定这是唯一的放置你的代码将运行。否则,如上所述,尝试将条件代码分解为单独的模块,以便仅在必要时才加载它。