Javascript 通过命令行或ES6导入运行Node.js脚本

Javascript 通过命令行或ES6导入运行Node.js脚本,javascript,node.js,node-modules,es6-modules,Javascript,Node.js,Node Modules,Es6 Modules,如何编写可以从命令行或通过ES6导入语句运行的节点脚本 我正在使用--实验模块标志和.mjs扩展以ES6模块的形式运行脚本 例子 假设我在sayHello.mjs中有以下脚本: 导出默认函数sayHello(){ log(`Hello!`); } 我希望能够通过以下两种方式使用此脚本: 通过命令行: node --experimental-modules sayHello.mjs 通过另一个脚本中的ES6导入语句: import sayHello from./sayHello.mjs';

如何编写可以从命令行或通过ES6导入语句运行的节点脚本

我正在使用
--实验模块
标志和
.mjs
扩展以ES6模块的形式运行脚本

例子 假设我在
sayHello.mjs
中有以下脚本:

导出默认函数sayHello(){
log(`Hello!`);
}
我希望能够通过以下两种方式使用此脚本:

  • 通过命令行:

    node --experimental-modules sayHello.mjs
    
  • 通过另一个脚本中的ES6导入语句:

    import sayHello from./sayHello.mjs';
    你好;
    
  • 细节 我正在寻找一种类似于对CommonJS模块使用
    module.main
    的解决方案(这不适用于ES6导入):

    if(require.main==模块){
    log('从命令行运行');
    }否则{
    console.log(“作为模块需要”);
    }
    
    您可以尝试:

    function sayHello() { console.log("Hello"); }
    if (process.env.CL == 1){
        sayHello();
    } else {
        export default sayHello;
    }
    
    在命令行中,使用:

    CL=1 node --experimental-modules sayHello.mjs
    
    很简单,但应该能用

    另一个选项是选中
    process.argv[1]
    ,因为它应该始终是:

    if (process.argv[1].indexOf("sayHello.mjs") > -1){
        sayHello();
    } else {
        export default sayHello;
    }