ES6 模块如何成为 运行 作为 Node 中的脚本?

How can an ES6 module be run as a script in Node?

如何将 ES6 模块 运行 作为 Node 中的脚本?

当我尝试这个 shebang 时出现错误:

#!/usr/bin/env node --experimental-modules

/usr/bin/env: ‘node --experimental-modules’: No such file or directory

如果我使用这个 shebang 它有语法错误(当然):

#!/usr/bin/env node

SyntaxError: Unexpected token import

我正在使用的解决方法是使用 shell 脚本来调用模块:

#!/usr/bin/env sh

BASEDIR=$( dirname "[=13=]" )
node --experimental-modules $BASEDIR/script.mjs "$@"

是否可以在没有第二个文件的情况下使它工作?

您需要将参数传递给 shebang 上的节点。 http://sambal.org/2014/02/passing-options-node-shebang-line/.

的文章对此进行了很好的解释

代码如下

#!/bin/sh 
":" //# comment; exec /usr/bin/env node --harmony "[=10=]" "$@"

console.log("It Works!");

我用 harmony 而不是 --experimental-modules。以下是来自网站的解释。

The #!/bin/sh causes the script to be identified as a shell script, and passed to /bin/sh for execution. /bin/sh reads and executes scripts one line at a time, and we’re taking advantage of that below.

The second line, as interpreted by the shell, consists of two commands.

  • 2a. The first command is ":", which is the quoted version of the rarely-used bash command :, which means “expand arguments and no-op”. The only argument to : is //, which is a valid path. The following # is a bash comment, which is valid until the command separator ;.

  • 2b. The second command is exec /usr/bin/env node --noharmony "[=13=]" "$@" which executes the node interpreter with the desired arguments and passes argument 0 (this script file) and the rest of the arguments to the bash script ("$@")

The exec causes the bash process to be replaced by the node process, so bash does not attempt to process any further lines.

我已经修补了 解决方案以在没有 .mjs 扩展名的情况下使用 Node 13

#!/usr/bin/env bash
":" //# comment; exec /usr/bin/env node --input-type=module - "$@" < "[=10=]"

import { hostname } from 'os';

console.log(hostname());

技巧几乎相同,但使用标准输入,这是在没有 package.json.mjs 扩展名时唯一的 documented 方法。因此,一个独立的无扩展脚本。

但是__dirname__filename 等全局变量将不可用。

我不确定它到底是什么时候改变的,但在最近的 Node 版本中,如果脚本是包的一部分(即文件夹中有一个 package.json 文件或任何父文件夹)。只需确保遵循以下步骤:

  1. 在package.json中设置"type": "module"
  2. 给文件一个 .js 扩展名
  3. 使用 shebang #!/usr/bin/env node