函数计算新功能— 支持 Node.js 18 、Node.js 20 运行时

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。

从2024年2月起,函数计算正式发布 Node.js 18 运行时和 Nodejs.20 运行时,函数计算2.0和函数计算3.0都支持新的运行时,目前新运行时处在公测状态,欢迎大家来体验。


目前支持 Node.js 18 和 Nodejs.js 20 运行时的地域,参考文档:Node.js 环境说明


下面介绍 Node.js 18 和 Nodejs.js 20 运行时的主要变化。

新特性介绍

支持 ECMAScript (ES) 模块

函数计算从 Node.js 18 运行时开始支持 ECMAScript(ES)模块。在此之前(Node.js 16及以前的版本),函数计算仅支持使用 CommonJS 模块。


您可以通过以下两种方式将代码指定为 ES 模块。


第一种方法是将函数的 package.json 文件中将 type指定为 module,这种方式会将所有.js文件指定为 ES 模块。例如:CommonJS 模块:

// package.json
{
  "name": "fc-es-module-example",
  "type": "module",
  "description": "This package will be treated as an ES module.",
  "version": "1.0.0",
  "main": "index.js",
  "author": "Aliyun FC",
  "license": "ISC"
}


// index.js – this file will inherit the type from 
import { hello } from './lib.mjs';
export const handler = async (event, context) => {
  let result = hello("FC"); // Hello FC
  return result;
}
// lib.mjs
export function hello(name) {
    return `Hello ${name}!`;
}


第二种方法是使用.mjs文件扩展名,这种方式会将.mjs文件视为 ES 模块,.js文件仍然视为 CommonJS 模块。您可以通过将文件分别命名为.mjs.cjs来混合 ES 模块和 CommonJS 模块,因为.mjs文件始终是 ES 模块,.cjs文件始终是 CommonJS模块。


// this file is named index.mjs – it will always be treated as an ES module
import { square } from './lib.mjs';
export const handler = async (event, context) => {
  let result = hello("FC"); // Hello FC
  return result;
}
// lib.mjs
export function hello(name) {
    return `Hello ${name}!`;
}

异步编程接口优化

如果您的代码是执行异步任务,推荐使用 Async/await 的异步编程方式来确保处理程序执行完成。Async/await 是一种简洁、易读的 Node.js 异步编程方式,不需要使用嵌套回调或链式调用。使用 Async/await 的方式,编写的代码与同步代码类似,同时仍然能实现异步和非阻塞的功能。

async 关键字会将函数标记为异步, await 关键字会暂停函数的执行,直到 Promise 完成解析为止。


相比于回调函数 callback ,Async/await 方式具有以下优点:

  • 可读性更好:Async/Await方式的代码更加线性和同步,更易于理解和维护。它避免了回调函数嵌套过深的情况,使代码结构更清晰。
  • 调试和错误处理更简单:可以使用try-catch块更方便地捕获和处理异步操作中的错误,错误堆栈更加清晰,可以更准确地追踪错误发生的位置。
  • 效率更高:回调函数通常需要在代码的不同部分之间切换。Async/Await方式可以减少上下文切换的数量,从而提高代码效率。

使用 return 代替 callback 返回响应结果

在 Node.js 16 运行时版本之前,在请求处理程序(Handler)中必须显式使用回调函数 callback 来返回结果,不支持使用 return ,比如:

exports.handler = function(event, context, callback) {
  callback(null, 'hello world');
};


如果没有显示调用 callback,函数计算会一直等待,直到请求超时返回报错

{
    "errorMessage": "Function timed out after 6 seconds (maxMemoryUsage: 0MB)"
}


从 Node.js 18 开始,Node.js 运行时支持直接使用 return 返回结果,无论是 ES 模块还是 CommonJS 模块都支持这种方式,比如

// ES Module
export const handler = async (event, context) => {
  console.log("event: \n" + event);
  return "Hello World!";
};
// CommonJS Module
exports.handler = async function(event, context) {
  console.log("event: \n" + event);
  return "Hello World!";
};

我们强烈推荐使用 return 来返回结果,而不是 callback返回结果。

实例冻结机制

在编写异步的处理程序时仍需要注意一点,在函数返回之前,要确保等待异步事件执行完成,否则该函数可能会失败或者出现意外行为。


这里的主要是因为函数的实例冻结机制,当函数实例没有请求处理时,实例会被 冻结(Freeze) ,当新的请求到来时,函数计算会将实例恢复(Thaw)。在实例冻结期间,程序的后台任务会被暂停运行,如果有异步调用还未执行完成,函数可能会出现失败。

实例冻结机制使用 CGroup freeze 实现。当进程被冻结时,会暂停进程在CPU上运行,但其状态仍然保存在内存中,可以在需要时快速恢复。


例如下面的示例

var count = 0;
async function calc(num) {
  let result = count + num;
  await new Promise((resolve) => setTimeout(resolve, 100)); // 模拟异步操作
  count = result;
}
export const handler = async (event, context) => {
  count = 0;
  calc(100);
  return "count: " + count;
}

当没有使用await calc(100)时,收到的响应结果是 count: 0,所以,一定要 await 异步任务执行结束再返回。

支持使用环境变量 TZ 设置日志时区

在使用Node.js 运行时打印日志时,默认是使用UTC时间,比如以下代码打印日志

console.log('Hello World!');


输入日志如下所示(北京时间为 2024-02-29 11:46:02)

2024-02-29 03:46:02.259 1-65dffdfa-xxxxxxx [info] Hello World!


使用 Node.js 18 和 Nodejs.js 20 运行时,我们支持通过环境变量 TZ 设置日志时区,例如设置为 TZ=Asia/Shanghai 时,输出日志如下所示:

2024-02-29 11:50:03.387 1-65dffeeb-xxxxxxx [info] Hello World!

注意:Node.js 16 运行时及之前的版本不支持使用 TZ 设置日志时区。


总结

本文简单介绍函数计算新支持的Node.js 18 和 Nodejs.js 20 运行时的主要变化,以及使用新运行时开发时的技巧和注意事项。在使用中有任何疑问或建议,欢迎加入钉钉用户群(钉钉群号:11721331)联系我们


附 - 函数计算 Node.js 运行时文档

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
1月前
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
233 29
|
27天前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
99 9
|
6月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
154 1
|
1月前
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
193 0
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
|
5月前
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
109 9
|
6月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
6月前
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
6月前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
97 1
|
19天前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
178 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用

相关产品

  • 函数计算