【问题标题】:Run a node shell script in --harmony mode在 --harmony 模式下运行节点 shell 脚本
【发布时间】:2023-03-31 18:05:01
【问题描述】:

如何运行全局安装的节点模块,该模块以--harmony 模式公开 shell 脚本?

【问题讨论】:

  • 你控制shell脚本吗?
  • 是的,我正在编写一个其他人将使用的模块,并且正在公开一个 shell 脚本并希望使用生成器。
  • 如果您正在编写一个要被节点用户包含的库,那么首先您应该检查您的库中是否设置了和谐标志/环境。如果不要求用户使用标志运行。这种方式更容易。尽量不要强制用户给出的选项。

标签: javascript node.js ecmascript-harmony


【解决方案1】:

您可以创建一个“node-harnomy”可执行文件:

/usr/local/bin/node-harmony

#!/bin/bash
node --harmony "$@"

harmony-cmd.js

#!/usr/bin/env node-harmony

function* foo() {
}

【讨论】:

    【解决方案2】:

    TL;DR:只需使用 Node 5+,大部分 ES6 功能将立即可用。


    2016 年回答

    这更像是对 2015 年答案的修正。
    The reason is because Node.js and io.js have converged,该项目现在更加强大,在保留长期支持 (LTS) 和 supporting lots of ES6 features 的同时进行了大量更新对于那些 io.js 也确实支持的人。

    Node.js 5.0.0+ 中可用的显着功能:


    2015 年回答

    我们现在有io.js 可用。它可靠、快速且符合稳定的 ES6 规范。

    根据您想要的 ES6 功能,您可以使用它根本不需要标记From their website:

    • 块范围
      • 常量
      • 功能块

        从 v8 3.31.74.1 开始,块范围 声明是故意用不合规的 严格模式代码的限制。开发人员应该意识到这 随着 v8 继续向 ES6 规范合规性发展,将会发生变化。

    • 集合
      • 地图
      • 弱地图
      • 设置
      • 弱集
      • 发电机
    • 二进制和八进制文字
    • 承诺
    • 新的字符串方法
    • 符号
    • 模板字符串

    2014 年回答

    用你的东西生成第二个 Node 进程怎么样?

    #!/usr/bin/env node
    
    var spawn = require("child_process").spawn;
    var child = spawn(process.execPath, [ "--harmony", "yourscript.js" ], {
      cwd: __dirname
    });
    
    child.stdout.on("data", function( data ) {
      console.log(data);
    });
    
    child.stderr.on("data", function( data ) {
      console.error(data);
    });
    

    编辑:相信process.execPath在这种情况下返回节点路径,而不是全局脚本路径。
    但是,您始终可以直接将其更改为 node,但这可能会破坏 PATH 中没有节点的安装。

    【讨论】:

    【解决方案3】:

    在发现 a hack 使用参数启动节点后,我编写了这个脚本来启动我的应用程序并支持生成器,如果不可用,则会失败并显示明显错误。 --harmony 如果不受支持,则不执行任何操作。如果您想支持较早的节点版本,也可以回退到使用 gnode

    #!/bin/sh
    ":" //# comment; exec /usr/bin/env node --harmony "$0" "$@"
    
    var generators = require('generator-supported');
    if (generators) {
      require('../lib');
    } else {
      console.log('ERROR: node >= v0.11.3 is required for generators');
      process.exit(1);
    }
    

    https://gist.github.com/raine/ab56a90442ea1f61a97d

    【讨论】:

      【解决方案4】:

      使用 Node.js v5.0,您可以使用严格模式使用最新的 ES2015

      /bin/server

      #!/usr/bin/env node --use_strict
      
      //node.js code.
      

      然后把 package.json 脚本放在下面

      scripts: {
         "start": "./bin/server"
      }
      

      注意:它适用于 Mac OS,但不确定是否适用于 Ubuntu 等。

      【讨论】:

        【解决方案5】:

        截至本答案发布时,唯一可行的解​​决方案是使用 gnode 的编程 API 并将 bash 脚本分成两个单独的文件。

        shellScript.js

        #!/usr/bin/env node
        
        require('gnode');
        require('./main');
        

        ma​​in.js

        // main shell script logic using generators
        

        【讨论】:

        • 这可行,但根据我对编程 API 的经验,gnode 不会检测到节点中的和谐生成器,并且会始终编译您的代码,从而使启动有点慢。
        • 为了记录,这就是我最终做的:gist.github.com/raine/ab56a90442ea1f61a97d
        • 或者你可以使用io.js :)
        【解决方案6】:

        只需将#!/usr/bin/env node --harmony 放在脚本顶部即可。但是您应该记住,和谐标志在不同的 v8 版本中公开了不同的功能集,因此您可能没有,例如,节点 0.10 等可用的生成器。

        更新 这可能不适用于某些系统。在 OS X 上测试

        【讨论】:

        • 你不能给节点shebang添加标志。
        • 生成器从 0.10.22 开始可用,我相信
        • 同样,您不能将标志添加到节点 shebang。这个答案不正确。
        • 是的,你可以,它至少可以在 OS X 上运行。使用它是否有缺点,如果它静默失败,是否会退回到其他方法?
        • @rane 我能想到两个缺点。如果你有后备方法,你就会失去 shebang 的便利,你突然有两个地方指定解释器而不是一个(这可能会导致维护问题)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多