【问题标题】:How can an ES6 module be run as a script in Node?ES6 模块如何在 Node 中作为脚本运行?
【发布时间】:2018-06-19 04:02:29
【问题描述】:

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

当我尝试这个 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 "$@"

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

【问题讨论】:

  • 您使用的是什么版本的节点?除了几个很少使用的特性和尾调用递归之外,node.js 自 2017 年 7 月以来几乎默认完全支持 ES6。最简单的解决方案可能是升级 node.js。我个人使用n 包(npm install -g n 然后n stable
  • @slebetman 您仍然必须传递 --experimental-modules 标志。他们预计这将仅在 Node v10 中默认启用。

标签: node.js executable es6-modules shebang


【解决方案1】:

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

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

import { hostname } from 'os';

console.log(hostname());

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

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

【讨论】:

  • 谢谢!我还设法使用process.cwd() 解决了__dirname 问题
【解决方案2】:

您需要将参数传递给 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 进程被 node 进程替换, 所以 bash 不会尝试处理任何进一步的行。

【讨论】:

  • 这也很棒,因为即使该行永远不会被 JavaScript 运行,语法也是有效的。 // 让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多