代码之家  ›  专栏  ›  技术社区  ›  Allyl Isocyanate

导入一个节点。js模块函数,而不调用它

  •  0
  • Allyl Isocyanate  · 技术社区  · 7 年前

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

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

    我想在另一个模块中要求/导入底层方法,而不计算init。不幸的是,似乎需要对其进行评估:

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

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   sleighty Alex    7 年前

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

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

    它倒过来回答了你的问题,但我认为这可能接近你想要的。

    你可能想留意一下 changes to this feature 关于 --experimental-modules 旗帜

        2
  •  2
  •   Alex    7 年前

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

    function init() {
      console.log('initializing');
    }
    // warning! do not call invoke init function here
    // init()
    
    module.exports = { init };
    
        3
  •  1
  •   Estus Flask    7 年前

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

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

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

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

    推荐文章