7

节点 v0.10.20 提供了许多与和谐有关的选项,

--harmony_typeof (enable harmony semantics for typeof)
--harmony_scoping (enable harmony block scoping)
--harmony_modules (enable harmony modules (implies block scoping)
--harmony_proxies (enable harmony proxies)
--harmony_collections (enable harmony collections (sets, maps, and weak maps))
--harmony (enable all harmony features (except typeof))

我知道这些不是生产就绪的功能并且它们正在开发中,但其中许多已经足够好了。

有没有办法在运行时启用它们?

"use strict";
"use harmony collections";

类似上面的东西。即使不只是模块级启用这些功能,最好确保它们在模块内部启用,而不是假设它们已启用。

4

3 回答 3

10

不,你不能。事实上,如果你试图在同一个 V8 实例中潜入这些标志的多个不同设置,那么在 V8 内部,有些事情可能会出现可怕的错误(披露:我实现了大多数这些标志)。

于 2013-10-18T16:04:01.437 回答
1

没有办法做到这一点,解释器读取模块的内容,然后验证它们,然后评估它们。如果您将使用某些 ES6 特定语法,则验证将失败并且不会评估代码。

您只能隔离 ES6 语法文件并将它们作为子进程运行(使用必要的选项),但我想这不是您想要这样做的方式。

于 2013-10-18T09:04:18.280 回答
1

如果您可以处理在子进程中运行它的想法,那么对于模块(在 exec/child 进程中隔离 ES6 文件)来说,前面的答案并不是一个坏主意。

看起来最好的答案是,如果您是一个模块,请记录您需要这些功能并在运行时对其进行测试,并在出现有用的错误时放弃。我自己还没有完全弄清楚如何很好地测试这个(让我休息一下,我已经使用节点 3 天了)

如果您正在编写应用程序,答案会略有不同。就我而言,我正在编写的应用程序可能会使用这些功能 - 并且由于只能在 shebang 行中使用单个参数的限制,因此无法在运行时更改 JS 版本(其中,当然,如上所述,完全有意义),并且不想执行子进程(我的服务器已经是多线程的) - 我被迫编写一个脚本来运行我的节点服务器,这样我的用户就不必计算使用正确的节点命令行来运行我的应用程序(丑陋),如果我想使用更多--harmony"use strict";我可以使用脚本来完成,因为它只是一个调用节点和我的应用程序的 shell 脚本。

建议#!/usr/bin/env node用作 shebang(它会为您找到节点,无论它安装在哪里)但是,您只能在 shebang 中使用一个参数,因此这将不适用于--harmony(或任何其他参数)

当然 - 你总是可以运行node --harmony --use_strict --blah_blah yourScript.js,但如果你需要某些选项,你必须每次都输入它,因此建议使用 shell 脚本(我!)。我想你可以在你的模块中包含这个(或这样的)脚本,并推荐它用于执行使用你的模块的应用程序。

这是一个与我用于服务器的 shell 脚本类似的实现,它将找到节点并使用您需要的任何参数运行您的脚本:

#!/bin/bash

if [ "$myScript" == "" ]; then
  myScript="./src/myNodeServer.js"
fi

if [ "$myNodeParameters" == "" ]; then
  myNodeParameters="--harmony --use_strict"
fi

if [ "$myNode" = "" ]; then
    myNode=`which node`
fi

if [ "$myNode" = "" ]; then
    echo node was not found! this app requires nodeJS to be installed in order to run.
    echo if you have nodeJS installed but is not found, please make sure the 'which'
    echo command is available. alternatively, you can forcibly specify the location of
    echo node with the $myNode environment variable, or editing this file.
else
    echo Yay! node binary was found at $myNode
fi

if [ "$1" = "start" ]; then 
  echo you asked to start..
  echo calling $myNode $myParameters $myScript $2
  $myNode $myParameters $myScript $2
  exit 
elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then 
  echo you asked for help..
  echo usage:
  echo $0 start [script.js] [parameters for script]
  echo parameters for node and node location can be
  echo set with the \$myParameters and \$myNode env
  echo variables (or edit the top of this file).
  exit
else 
  echo no valid command specified - use $0 --help to see help.
fi 

值得注意的是,如果您只想使用 Harmony 和 strict,而不能在 shebang 中同时指定两者,您可以硬编码节点的位置并使用“use strict”;别名:

#!/usr/bin/node --harmony
"use strict";
于 2013-12-05T08:36:41.793 回答