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

时间:2018-01-10 03:08:31

标签: node.js executable es6-modules shebang

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 "$@"

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

2 个答案:

答案 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之类的全局变量将不可用。