ES6模块如何作为Node中的脚本运行?
当我尝试这个shebang时,我收到一个错误:
#!/usr/bin/env node --experimental-modules
/ usr / bin / env:'node --experimental-modules':没有这样的文件或目录
如果我使用这个shebang它有语法错误(当然):
#!/usr/bin/env node
SyntaxError:意外的令牌导入
我正在使用的工作是使用shell脚本来调用模块:
#!/usr/bin/env sh
BASEDIR=$( dirname "$0" )
node --experimental-modules $BASEDIR/script.mjs "$@"
是否可以在没有第二个文件的情况下使其工作?
答案 0 :(得分:3)
您需要将参数传递给shebang上的节点。这在http://sambal.org/2014/02/passing-options-node-shebang-line/的文章中得到了很好的解释。
代码如下。
#!/bin/sh
":" //# comment; exec /usr/bin/env node --harmony "$0" "$@"
console.log("It Works!");
我使用harmony
代替--experimental-modules
。网站上的解释如下。
#!/ bin / sh导致脚本被识别为shell脚本, 并传递给/ bin / sh执行。 / bin / sh读取并执行 每次脚本一行,我们正在利用下面的内容。
第二行由shell解释,由两行组成 命令。
2a上。第一个命令是":",这是引用的版本 很少使用的bash命令:,意思是“扩展参数和无操作”。 唯一的参数是://,这是一个有效的路径。下列 # 是一个bash注释,它在命令分隔符之前有效;。
2B。第二个命令是exec / usr / bin / env node --noharmony" $ 0" " $ @" 它使用所需的参数执行节点解释器 传递参数0(此脚本文件)和其余参数 bash脚本(" $ @")
exec导致bash进程被节点进程替换, 所以bash不会尝试处理任何其他行。
答案 1 :(得分:1)
我为Ishan Thilina Somasiri解决方案打了补丁,使其可以与Node 13
扩展名一起使用,.mjs
:
#!/usr/bin/env bash
":" //# comment; exec /usr/bin/env node --input-type=module - "$@" < "$0"
import { hostname } from 'os';
console.log(hostname());
技巧几乎相同,但是使用stdin,这是没有package.json
或.mjs
扩展名时唯一的documented方法。因此,一个独立的无扩展脚本。
但是,诸如__dirname
或__filename
之类的全局变量将不可用。