网站首页 > 技术文章 正文
作者 | Alex Ewerl?f
译者 | 王强
策划 | 李俊辰
转发链接:https://mp.weixin.qq.com/s/6ascDu9z99nhUlEfnEMB0g
本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。
前言
JavaScript 是一种解释性语言,需要将其源代码提供给某些解释器才能运行。如果要使用 Node.js 运行 JavaScript 文件,通常会运行以下命令:
nbsp;node yourfile.js
输入解释器(node)的名称后,你就明确告诉了外壳如何运行脚本。但是这些知识可以放在脚本本身中,这样就可以像运行二进制文件一样直接运行它:
nbsp;./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+)。
https://github.com/tc39/proposal-hashbang
多数人在 /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 配置标志的设置。
https://docs.npmjs.com/files/package.json#engines
但是有一种更简单的方法。由于 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 扩展名或你喜欢的其他任何文件类型,甚至可以没有扩展!
作者 | Alex Ewerl?f
译者 | 王强
策划 | 李俊辰
转发链接:https://mp.weixin.qq.com/s/6ascDu9z99nhUlEfnEMB0g
猜你喜欢
- 2024-10-04 nodejs配置和环境的搭建(nodejs 配置)
- 2024-10-04 广州蓝景分享—Webpack 基础教学,正在自学前端的你赶快收藏起来
- 2024-10-04 怎么解决koa写server发布的噩梦(koa server)
- 2024-10-04 Node直出方案的实现及性能测试(node技术)
- 2024-10-04 webpack5入门到实战(5-处理 js 资源)
- 2024-10-04 Node-red Function&注入功能介绍
- 2024-10-04 Linux实战017:Ubuntu搭建NodeJS开发环境
- 2024-10-04 手把手告诉你如何安装多个版本的node
- 2024-10-04 Node编程基本语法(nodejs基础语法)
- 2024-10-04 vue开发者vite多环境配置,终于搞明白了
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)