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 文件或任何父文件夹)。只需确保遵循以下步骤:
- 在package.json中设置
"type": "module"
- 给文件一个
.js
扩展名
- 使用 shebang
#!/usr/bin/env 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 文件或任何父文件夹)。只需确保遵循以下步骤:
- 在package.json中设置
"type": "module"
- 给文件一个
.js
扩展名 - 使用 shebang
#!/usr/bin/env node