nginx的JavaScript脚本语言-njs
2021-02-22 12:32:03 阿炯

njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能耗更低、更符合 nginx 应用场景的小虚拟机实现,可以理解成 nginx 为其实现了一套自己的词法解析。


njs is a subset of the JavaScript language that allows extending nginx functionality. njs is created in compliance with ECMAScript 5.1 (strict mode) with some ECMAScript 6 and later extensions. The compliance is still evolving.


作为 nginx 的插件,njs 的安装方式是重新编译 nginx,新版本可在此下载。


最新版本:0.5
v0.5.1 已经于2021年2月未发布,此版本主要变更:
nginx modules
新特性:引入实现 Fetch API 的ngx.fetch()方法
下面Response对象的属性和方法已实现:
arrayBuffer(), bodyUsed, json(), headers, ok, redirect, status, statusText, text(), type, ur
值得注意的限制:仅支持http://协议,不处理重定向
添加js_header_filter指令
Bugfix:修复在 stream 模块的 body filter 中处理缓冲数据的问题
Bugfix:修复Function构造函数中存在绕过安全模式的问题
Bugfix:修复Date.prototype.toISOString() 使用无效日期值的问题
更多信息请参看更新说明

最新版本:0.6
v0.6.2 已于2021年9月上旬发布,njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能耗更低、更符合 nginx 应用场景的小虚拟机实现,可以理解成 nginx 为其实现了一套自己的词法解析。作为 nginx 的插件,njs 的安装方式是重新编译 nginx。此版本主要更新内容:
修复js_filter双向注册时 CPU 被占用的问题
引入AggregateError实现
添加其他的Promise构造函数方法,添加了以下方法:Promise.all() , Promise.allSettled() , Promise.any() , Promise.race() .
从代码生成器中删除递归 (recursion)
修复其余参数解析没有绑定标识符的问题
修复 resolve/reject 对Promise.prototype.finally()的回调
修复%TypedArray%.prototype.join()与分离缓冲区的问题
修复交互式 shell 中的内存泄漏问题
详情查看发行说明

最新版本:0.7
v0.7.12 已于2023年4月上旬发布。主要变化如下:
Bugfix:修复了 Fetch API 中的 Headers()constructor。
Feature: 在 crypto 模块中添加了 Hash.copy()方法 。
Feature:添加了 zlib 模块。
Improvement:增加了对 export {name as default} 语句的支持。
Bugfix:根据规范修复了 Numberconstructor。
更多详情可查看发行说明

最新版本:0.8
v0.8已于2023年7月上旬发布。此版本新增用于 http 和 stream 的共享词典 (shared dictionary),以及全局 ngx 属性。作为 nginx 的插件,njs 的安装方式是重新编译 nginx。主要变化如下:
删除 0.7.10 引入的 Fetch API 中对禁止 header 的特殊处理
删除自 0.5.0 以来在 http模块中已被弃用的 r.requestBody()andr.responseBody()方法
http 模块在过滤时为 r.internalRedirect() 抛出异常
引入全局 nginx 属性 ——ngx.build,ngx.conf_file_path,ngx.error_log_path,ngx.prefix,ngx.version,ngx.version_number和 ngx.worker_id
为 http 和 stream 引入 js_shared_dict_zone 指令,用于在 worker 进程之间声明共享字典
添加 compile-time 选项以禁用 njs 模块。例如,要禁用 libxslt 相关代码:
NJS_LIBXSLT=NO ./configure .. --add-module=/path/to/njs/module
修复在 http模块中过滤时的 r.statussetter 出现的问题
修复 http模块中 Location header 的设置问题

v0.8.5 已于2024年6月下旬发布,具体更新内容包括:
nginx modules:
更改:带有 upload 或 download 事件类型的 r.variables.var、r.requestText、r.responseText、s.variables.var和 s.on()回调的 data 参数现在会将 UTF-8 编码无效的字节转换为替换字符。处理二进制数据时,建议改用 r.rawVariables.var、r.requestBuffer、 r.responseBuffer、s.rawVariables.var以及 s.on() 的 upstream 或 downstream 事件类型。
功能:为 shared dictionary 的 add()、set()和 incr()方法添加 了 timeout 参数。
错误修复:检查重复的 js_set 变量。
错误修复:修复了端口为非标准端口时的 requestHostheader。
 错误修复:修复了 ngx.fetch()和 r.subrequest()中 zero-length request body 的处理 。
错误修复:修复了 Headers.get() 中的堆缓冲区溢出。
错误修复:修复 r.subrequest() 的错误处理。

Core:
功能:为 QuickJS 引擎增加了 zlib 模块。
错误修复:已修复 zlib.inflate()。
错误修复:修复了长度为零的参数 String.prototype.replaceAll() 。
错误修复:修复了 Array.prototype.toSpliced()、Array.prototype.toReversed()、Array.prototype.toSorted() 出现异常后的 retval 处理。
错误修复:解决了 RegExp.prototype[@@replace]() 中包含 $'、$` 和 Unicode 字符的替换问题。
错误修复:修复了 decodeURI() 和 decodeURIComponent() 中的一个 one-byte overread 问题 。
错误修复:修复了参数范围的跟踪。
错误修复:修复了 Date.parse() 中的整数溢出。

详情查看发行说明


项目主页:
https://github.com/nginx/njs
https://nginx.org/en/docs/njs/