node.js跳过部分代码的最佳方式

时间:2016-03-10 13:04:29

标签: node.js optimization

在编译像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 */
}

最高效的方式是什么?也许还有其他方式...

2 个答案:

答案 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这样的单个引擎的任何优化,除非您确定这是唯一的放置你的代码将运行。否则,如上所述,尝试将条件代码分解为单独的模块,以便仅在必要时才加载它。