写点什么

五分钟了解 Node.js Shebang

  • 2020-09-11
  • 本文字数:2018 字

    阅读完需:约 7 分钟

五分钟了解 Node.js Shebang

本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。



JavaScript是一种解释性语言,需要将其源代码提供给某些解释器才能运行。如果要使用Node.js运行 JavaScript 文件,通常会运行以下命令:


$ node yourfile.js
复制代码


输入解释器(node)的名称后,你就明确告诉了外壳如何运行脚本。


但是这些知识可以放在脚本本身中,这样就可以像运行二进制文件一样直接运行它:


$ ./yourfile.js
复制代码


仅当你对该文件有执行权限(例如,可以使用 chmod u+x yourfile.js 设置)并设置了正确的“Shebang”时,此方法才有效。

Shebang

Shebang 或 hashbang(#!代码的英文发音)是文件的第一行,它告诉 OS 使用哪个解释器。它通常看起来像这样:


#!/absolute/path/to/the/interpreter [optional params]
复制代码


Shebang 是一项操作系统特性,可用于运行任何解释语言:Python、Perl 等。对于 Node.js,它可以(但通常不会)看起来像这样:


#!/usr/bin/node
复制代码


只有 Shebang 在文件的第一行时,Node.js 才会高兴地将其忽略为注释(即使它前面有空行或//comment 行也不会起作用)。浏览器也会将其忽略(Chrome74+,FF67+)。


多数人在/usr/bin/node 上都有一个 Node.js 二进制文件或符号链接。如果 Node.js 不在/usr/bin/node 上,操作系统就会抱怨了。例如 bash 会说 bad interpreter: No such file or directory script won’t execute。但有没有办法告诉操作系统使用 Node.js 运行脚本,而不用在乎它安装在哪里呢?


#!node是没用的,因为 Shebang 需要绝对路径。

认识一下 env 吧

env 主要用于在修改后的环境中运行命令。这里的重点是“命令”,因为 env 几乎总是位于/usr/bin/env,而“命令”可以是 PATH 上的任何内容。


如果我们不是写/usr/bin/node 而是写/usr/bin/env node,我们就会告诉 OS 运行 env,而 env 将运行 node,最后 node 将依次执行脚本。

简单来说

这是 Node 脚本最常见的 Shebang:


#!/usr/bin/env node
复制代码


但是,env 还可以使用其他一些技巧。

将参数传递给 Node.js

将-S 选项传递给 env 会使它解析之后发生的一切,从而打开一扇新的大门:将参数传递给命令。


例如,假设我们要运行带有特殊标志的 node,以在运行当前文件时启用 ESM 模块。我们可以使用这个 Shebang:


#!/usr/bin/env -S node --experimental-module
复制代码


再举一个例子:如果我们想在运行当前脚本之前运行另一个脚本,可以使用 Node 的-r 选项:


#!/usr/bin/env -S node -r ./my/other/file.js
复制代码


或打开检查口:


#!/usr/bin/env -S node --inspect
复制代码


请注意,如果你运行诸如 nodeyourfile.js 之类的脚本,Node.js 将不会尝试解析 Shebang 中的参数,而只会忽略它。内核在运行文件之前使用 Shebang 来确定如何运行它。

设置环境变量

还记得我们说过 env 可以在修改后的环境中运行命令吗?实际上这就是它名称的来源,而且它的功能非常强大。假设我们希望脚本以生产模式运行,我们可以设置 NODE_ENV 环境变量:


#!/usr/bin/env -S NODE_ENV=production node
复制代码


否则,运行脚本时 NODE_ENV 将为 undefined 或使用用户终端的设置。


Node.js支持许多环境变量。例如,我们可以使用 NODE_OPTIONS 传递下列 CLI 标志:


#!/usr/bin/env -S NODE_OPTIONS=--experimental-modules node
复制代码

从一个空环境开始

如果我们希望脚本在运行时不访问用户终端上的任何环境变量,则可以使用-i 标志来运行它,该标志代表“忽略环境”:


#!/usr/bin/env -S -i node
复制代码


符号-相当于-i,所以我们也可以这样写:


#!/usr/bin/env -S - node
复制代码

强制禁用 DEBUG

也许我们不想清除所有环境变量,但要屏蔽其中一些。例如 DEBUG(如果你使用的是流行的 debug 包)。也许我们不希望脚本用户将 DEBUG 作为脚本运行时设置标志。那么我们使用-u 标志代表未设置的环境变量。


#!/usr/bin/env -S -u=DEBUG - node
复制代码


如果用户以DEBUG=* ./yourfile.js运行脚本,他们将看不到任何调试信息,但你还是可以用DEBUG=* node ./yourfile.js运行脚本,从而看到 DEBUG 输出。

锁定 Node.js 运行时版本

有时你想锁定用于运行脚本的 node 版本。在 NPM@3 之前,我们可以使用 engineStrict,但是该功能已移除,现在我们只能在package.json中设置engines,它可能位于脚本旁边也可能不在,取决于 engine-strictconfig 配置标志的设置。


但是有一种更简单的方法。由于 node 也是 NPM 包,并且 npx 允许运行任何 NPM 包,因此你可以编写:


#!/usr/bin/env -S npx node@6
复制代码


这可能会在运行脚本后尝试下载请求的 Node 版本(因此,如果 NPX 缓存中不存在所请求版本的 Node,则无法在没有互联网连接的情况下运行)。


提示:你可以使用 process.version 检查节点版本

使用 TypeScript 运行它

没有规则说我们必须运行 node。假设TypeScript和 TS Node 全局可用(npm -i g typescript ts-node),我们可以指定 ts-node 作为解释器:


#!/usr/bin/env ts-node
复制代码


并让它作为 TypeScript 程序运行文件。


在这些示例中,文件都可以使用.js 扩展名或你喜欢的其他任何文件类型,甚至可以没有扩展!


原文链接:《Node Shebang》


2020-09-11 09:575023

评论

发布
暂无评论
发现更多内容

和鲸科技出席第五届空间数据智能学术会议,执行总裁殷自强受邀发表主题报告

ModelWhale

人工智能 数据模型 空间数据

算子开发到推理加速,一位00后开发者的“升级打怪”之旅

Alter

开发者 昇腾AI大赛 #大模型

总结反思 持续进步-开源即时通讯(IM)项目OpenIM 新版本release-v3.7发布

Geek_1ef48b

鸿蒙HarmonyOS实战-ArkUI组件(Menu)

蜀道山

鸿蒙 前端 HarmonyOS 鸿蒙卡片 menu

Linux设备驱动系列(五)——字符驱动设备文件

Linux内核拾遗

Linux内核 设备驱动

长期看好Celestia,质押TIA教程分享,以bitget为例

股市老人

支付系统概述(十一):运营能力

agnostic

支付系统设计与实现

2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。 给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。 需要注意

福大大架构师每日一题

福大大架构师每日一题

鸿蒙HarmonyOS实战-ArkUI组件(页面路由)

蜀道山

鸿蒙 架构 前端 HarmonyOS 鸿蒙系统

LED显示屏与LCD显示屏的9个区别

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 lcd

Lucene环境下基于NGram分词的中文高级检索

alexgaoyh

中文分词 lucene 高级检索 ngram 知网高级检索

Penpad 再获 Animoca Brands 投资,全新生态历程

加密眼界

Penpad 再获 Animoca Brands 投资,全新生态历程

大瞿科技

释放Stable Diffusion 无限可能

亚马逊云科技 (Amazon Web Services)

Amazon Lambda Amazon S3 Glacier

以太网口硬件知识分享

芯动大师

Mac 以太网 PHY

EasyExcel导出-自适应图像尺寸

alexgaoyh

EasyExcel 自适应 图像 等比缩放 导出

Adobe Photoshop动作导入方法详解,PS动作安装教程

Rose

ps动作

五分钟了解 Node.js Shebang_语言 & 开发_Alex Ewerlöf_InfoQ精选文章