【问题标题】:Import a Node.js module function, without invoking it导入 Node.js 模块函数,而不调用它
【发布时间】:2019-08-03 13:26:36
【问题描述】:

我有一个带有导出函数的 Node.js 模块,并设计为在从命令行运行脚本时调用:

function init() {
  console.log('initializing');
}
init();

module.exports = { init };

我想在另一个模块中要求/导入底层方法,而不评估 init。不幸的是 require 似乎在评估它:

> require('./test.js').init;
initializing
{ init: [Function: init] }

是否有可能需要这种方法,而不在这种情况下对其进行评估?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    How about 将从命令行调用脚本时需要运行的部分放入检查require.main === module?这样,init() 只有在您使用node test.js 调用该脚本时才会被调用。所以:

    function init() {
        console.log('initializing');
    }
    
    if (require.main === module) {
        init();
    }
    
    module.exports = { init };
    

    这有点反过来回答你的问题,但我认为这可能接近你正在寻找的。​​p>

    关于--experimental-modules 标志,您可能需要留意changes to this feature

    【讨论】:

      【解决方案2】:

      这意味着init()不应该被自动执行,应该有不同的入口点。

      编程使用的一个入口点 (test.js)。另一个用作命令行可执行文件(test-cli.js):

      require('./test.js').init()
      

      这是 NPM 包的常见场景。 CLI 入口点可以在包bin 中指定。

      【讨论】:

        【解决方案3】:

        您的问题与您自己调用 init 函数有关。 只是不要在包含实现的模块中调用它,而是在任何其他模块中需要它之后调用该函数。

        function init() {
          console.log('initializing');
        }
        // warning! do not call invoke init function here
        // init()
        
        module.exports = { init };
        

        【讨论】:

        • 我特别需要在这个用例中调用它
        • 介意扩展用例吗?就目前而言,如果不解析每个语句,就无法解析模块,其中包括对init()的调用
        • 在这种情况下,它将始终被调用,因为它位于模块全局范围内。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 2013-04-05
        • 2015-11-12
        相关资源
        最近更新 更多