没想到,年过七十的陈佩斯这次为了拍《戏台》,不但把家里北京四环的房子拿去抵押贷款,还差点连朱时茂投入的百万都打水漂,电影首映头三天票房才区区十几万,他...
2025-07-28 0
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
2025 年 7 月 10 日,njs 宣布自 v0.9.1 版本起引入了 QuickJS 引擎支持,其不仅兼容 ES2023,还为 NGINX 环境中的 JavaScript 脚本编写开辟了新的可能性。
按照官方的说法,njs 花费了大量时间维护和扩展为 Nginx 定制的 JavaScript 引擎,而没有更多精力专注在 JavaScript 和 NGINX 之间实现无缝集成的重要事项上。随着 Web 的发展以及开发者对现代 JavaScript 特性的依赖,局限性也愈发凸显:
给开发者代码的弊端就是:njs 最初的设计目标与 JavaScript 开发社区不断变化的需求之间存在矛盾。
njs 团队做了最新的战略决策,宣布集成 QuickJS 作为 Nginx 替代的 JavaScript 引擎,同时保留现有的 njs 引擎以实现向后兼容。
引入轻量级、可嵌入的 QuickJS 引擎具有以下几个显著优势:
import divide, {add, multiply} from "./mathUtils.js";import {user, greet} from "./user.js";// 模块化以前不支持async function* myAsyncGenerator() { yield value;}// 异步生成器以前不支持const proxy = new Proxy(target, handler);// Proxy 代理以前不支持const a = 123n;const bigNum = 9007199254740991n;const b = BigInt(123);const c = BigInt("9007199254740991");const negative = -456n;// BigInt 以前也不支持
目前 QuickJS 在 Github 通过 MIT 协议开源,有超过 10k 的 star、1k 的 fork、妥妥的前端顶级开源项目。
大多数 Linux 发行版都需要安装一些依赖项才能构建 NGINX 和 NGINX JavaScript。以下说明针对 apt 包管理器,该管理器在大多数 Ubuntu/Debian 发行版及其衍生版本中均可广泛使用。
sudo apt install gcc make// 安装编译器和 make 实用程序sudo apt install libpcre3-dev zlib1g-dev libssl-dev libxml2-dev libxslt-dev// 安装依赖
如果要使用 QuickJS 进行构建,开发者还需要构建 QuickJS 库:
git clone https://github.com/bellard/quickjscd quickjsCFLAGS='-fPIC' make libquickjs.a
下面使用 --with-cc-opt= 和 --with-ld-opt= 选项提供库路径:
auto/configure --add-dynamic-module=<NJS_SRC_ROOT_DIR>/nginx \ --with-cc-opt="-I<QUICKJS_SRC_ROOT_DIR>" \ --with-ld-opt="-L<QUICKJS_SRC_ROOT_DIR>"
切换到 QuickJS 引擎非常简单,开发者只需一个配置指令即可。js_engine 指令适用于 HTTP 和流上下文,可让开发者指定要使用的 JavaScript 引擎。
下面是基础的 HTTP 配置:
// nginx.conf 配置load_module modules/ngx_http_js_module.so;events {}http { js_import main from js/main.js; // 引入指定的文件 server { listen 8000; location /njs { js_content main.handler; } location /qjs { js_engine qjs; js_content main.handler; } }} // js/main.js 文件function handler(r) { r.return(200, `Hello from ${njs.engine}`);}export default {handler};
下面是一个更复杂的示例,展示了 QuickJS 提供的现代 JavaScript 功能:
// nginx.conf 配置信息http { js_engine qjs; js_import analytics from js/analytics.js; // 引入指定的文件 server { listen 8000; location /analytics { js_content analytics.processRequest; } }}
下面是 js/analytics.js 文件的内容:
class RequestAnalytics { // 使用生成器函数处理 HTTP 头部信息 *getHeaderMetrics(headers) { for (const [key, value] of Object.entries(headers)) { // 详细的头部信息 yield { header: key.toLowerCase(), size: key.length + value.length, type: key.startsWith("x-") ? "custom" : "standard", }; } } processRequest(r) { // 默认解构 const {method = "GET", uri = "/", httpVersion = "1.0"} = r; const headerStats = []; for (const metric of this.getHeaderMetrics(r.headersIn)) { headerStats.push(metric); } const timestamp = BigInt(Date.now()); // BigInt 保持详细时间 const headerCount = headerStats.length; const customHeaders = headerStats.filter( ({type}) => type === "custom" ).length; // 返回数据给客户端 r.return( 200, JSON.stringify( { message: `Request processed at ${timestamp}`, stats: {headerCount, customHeaders}, serverInfo: `${method} ${uri} HTTP/${httpVersion}`, }, null, 2 ) ); }}const analytics = new RequestAnalytics();export default {processRequest: (r) => analytics.processRequest(r) };
在 Nginx 中引入 QuickJS 后,在实例创建、长时间运行的脚本、内存管理、上下文重用优化等方方面面都需要综合考量,例如:性能和内存占用之间的权衡:
https://github.com/nginx/njs
https://blog.nginx.org/blog/quickjs-engine-support-for-njs
https://github.com/bellard/quickjs
https://javascript.plainenglish.io/how-javascript-became-the-super-glue-inside-nginx-2ce57cb09686
相关文章
没想到,年过七十的陈佩斯这次为了拍《戏台》,不但把家里北京四环的房子拿去抵押贷款,还差点连朱时茂投入的百万都打水漂,电影首映头三天票房才区区十几万,他...
2025-07-28 0
信任有多深,教训就会有多狠!百万级带货主播刘元杰在蒋政业的投资帮助下,于新疆直播卖货蜂蜜而走红,但是蒋政业等来的不是刘元杰的报答,而是其与女友联合对自...
2025-07-28 0
AlphaFold夺诺奖引争议!2016年,一位博士生在NeurIPS提出的研究,或许正是AlphaFold的「原型」。如今,导师Daniel Cre...
2025-07-28 0
金融界2025年7月26日消息,国家知识产权局信息显示,宣城立讯精密工业有限公司申请一项名为“一种无线充电装置、系统及方法”的专利,公开号CN1203...
2025-07-28 0
🤖 由 文心大模型 生成的文章摘要上篇文章介绍了Meta开发的在国际顶级期刊《自然》最新发表的一篇论文中,科技巨头Meta详细披露了其专为HUD眼镜与...
2025-07-28 0
积分中心不是简单的“送分工具”,而是一套围绕行为驱动、目标管理与价值闭环设计的系统工程。本文从产品设计的角度出发,梳理积分体系搭建的关键路径——包括基...
2025-07-28 0
Nothing 手机并不在中国大陆地区进行销售,但它在这里仍然有不少的拥趸。大概是因为市面上已经有很多做工精湛、工艺良善的手机,也有很多性能强劲、影像...
2025-07-28 0
2025年中国移动机器人行业市场前景预测研究报告(简版)中商产业研究院 2025-07-22 08:52中商情报网讯:移动机器人是集机械、电子、计算机...
2025-07-28 0
发表评论