Node18 即将支持 import HTTP资源!

83482006da9b0c8027a9d20e466dccfa.gif

作者 | 零一

来源 | 前端印象

最近看到Node官方提交了一条commit ,并且已经合入 master分支 ,如下图所示:

794b064a3239a340c13ba2df5f6032aa.png
node master commit

由此可见,Node18可能会支持一个非常 nice 的功能,那就是 支持 import 远程HTTPS资源和本地的HTTP资源,啥意思?看个例子🌰

尝鲜

现在有这样一个文件:

// demo.mjs
import sayHelloWorld from "https://example/say-helloWorld.mjs";console.log(sayHelloWorld());

可以看到,这里选择加载了一个远程的HTTPS文件资源,该文件内容如下:

// say-helloWorld.mjs
export default function sayHelloWorld () {return 'Hello,World! 零一'
}

接下来运行一下 demo.mjs看看会发生什么,因为在Node18中,该功能属于实验性功能,所以我们需要加上参数 --experimental-network-imports 来启动该特性:

node --experimental-network-imports demo.mjs

运行结果:

// Hello,World! 零一

当然了,本地起的HTTP服务上的文件资源也是可以一样导入的,例如:

import sayHelloWorld from "http://10.59.24.2:8080/say-helloWorld.mjs"   // ok

注意

我们使用该特性导入的脚本资源文件有一个前提条件,那就是该文件所在的服务器上响应此文件请求的类型 content_type 必须为 application/javascript,否则就无法加载

我们可以用 curl 来查看一下想要加载的文件响应类型,例如:

$ curl -s -o /dev/null -w '%{content_type}' 'https://example/say-helloWorld.mjs'# application/javascript

错误场景

ERR_NETWORK_IMPORT_BAD_RESPONSE:当导入的资源不存在时,即响应 404,就会报该错误

Error [ERR_NETWORK_IMPORT_BAD_RESPONSE]: import 'https://xxxx/xxxx' received a bad response: HTTP response returned status code of 404

ERR_NETWORK_IMPORT_DISALLOWED:当请求一个HTTPS资源且被重定向到一个非网络资源时,是不被允许的

Error [ERR_NETWORK_IMPORT_DISALLOWED]: import of 'ftp://xxxxx/say-helloWorld.mjs' by 'https://h3manth.com/foo.mjs' is not support: cannot redirect to non-network location

ERR_UNKNOWN_MODULE_FORMAT:当请求的资源不是 ESM 时,会报该错误

RangeError [ERR_UNKNOWN_MODULE_FORMAT]: Unknown module format: null for URL https://xxxxxx/say-helloWorld.js

ERR_UNSUPPORTED_ESM_URL_SCHEME:当加载的资源URL的协议不被支持时,会报该错误,例如 ftp:

Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file, data, https, http are supported by the default ESM loader. Received protocol 'ftp:'

实现原理

其实原理也比较简单:

先调用 fetchModule 方法检查资源模块是否缓存过(cacheForGET

function fetchModule(parsed, { parentURL }) {const { href } = parsed;const existing = cacheForGET.get(href);if (existing) {return existing;}if (parsed.protocol === 'http:') {return PromisePrototypeThen(isLocalAddress(parsed.hostname), (is) => {// Makes few checks for ERR_NETWORK_IMPORT_DISALLOWEDreturn fetchWithRedirects(parsed);});}return fetchWithRedirects(parsed);
}

若没有缓存,则调用 fetchWithRedirects

function fetchWithRedirects(parsed) {const existing = cacheForGET.get(parsed.href);if (existing) {return existing;}const handler = parsed.protocol === 'http:' ? HTTPGet : HTTPSGet;const result = new Promise((fulfill, reject) => {const req = handler(parsed, {headers: {Accept: '*/*'}}).on('error', reject).on('response', (res) => {// 错误检查// 缓存内容// 返回模块内容}
}

然后根据资源类型去调用不同的方法(HTTPGetHTTPSGet

let HTTPSAgent;
function HTTPSGet(url, opts) {const https = require('https'); // For HTTPGet, we use the `http` builtinHTTPSAgent ??= new https.Agent({keepAlive: true});return https.get(url, {agent: HTTPSAgent,...opts});
}

总结

这个功能还是很香的,谁用谁知道,但目前有一些缺点:

  1. 实验性功能,可能还会改动,而且使用需要加参数 --experimental-network-imports

  2. 本地只支持 http,一旦涉及到 https 就很淡疼

  3. 该功能的代码实现就限制死了只支持 http:https:,其它一概不支持

希望本文对你们有所帮助~

30726216bc3f43d1121b6e65131bdd6c.gif

cf09de6b2c1a2d87e7bd8b8fd05a7951.png

往期推荐

Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!

k8s集群居然可以图形化安装了?

使用这个库,让你的服务操作 Redis 速度飞起

将 k8s 制作成 3D 射击游戏,好玩到停不下来

93ec2d969133f9bed5c85324e2ba809f.gif

点分享

894af0b794e0e2fb510210e12ed7fcbb.gif

点收藏

9cc8fef02a8679570de80c9e9f135255.gif

点点赞

5fac447071d36aab051ec9f21921ac70.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL深潜 - 剖析Performance Schema内存管理

简介: 本文主要是通过对PFS引擎的内存管理的源码的阅读,解读PFS内存分配及释放原理,深入剖析其中存在的一些问题,以及一些改进思路。本文源代码分析基于Mysql-8.0.24版本。 作者 | 之枢 来源 | 阿里技术公众号 一 引言 MYSQL Pe…

基于MaxCompute SQL 的半结构化数据处理实践

简介: MaxCompute作为企业级数据仓库服务,集中存储和管理企业数据资产、面向数据应用处理和分析数据,将数据转换为业务洞察。通过与阿里云内、外部服务灵活组合,可构建丰富的数据应用。全托管的数据与分析解决方案,可简…

file_get_contents请求失败处理_SpringCloud Gateway网关处理请求过程中遇到400Bad Request问题解决方案...

大家在使用springcloud自己的gateway作为网关服务时,可能会不小心遇到自定义的Filter处理请求Request报文时出现400的错误,而且这个错误还不是每次请求都必现,额什么意思?难不成你是说请求还时好时坏?bingo&#xff01…

CSDN企业数字化之路 ——「低代码」发展研讨会北京站现场实录大放送

作者 | 千鸟 出品 | CSDN云计算(ID:CSDNcloud) 2021年底,CSDN面向行业开发者和高校学生开发者,展开了关于“低代码”的开发者调研活动。基于调研数据,CSDN提出了对低代码发展趋势的五大方向。在随后举行的 …

MaxCompute 存储设计

简介: 存储策略该怎么设计 写这篇存储规划的文章主要是想告诉大家该如何给存储做一个规划,在关系数据库的时代存储昂贵且珍惜,掰手指头花钱是存储规划的常态。但是到了大数据时代大家又立即就都变成印美元的美国政府了,感觉存储很…

Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践

简介: 当下,Serverless 概念很火,很多同学被 Serverless 的优势吸引过来,比如它的弹性伸缩,免运维,高可用,资费少。但真正使用起来去落地的时候发现问题很多,大型项目如何组织函数&a…

【CDS技术揭秘系列 总篇】阿里云的云定义存储来了

简介: 全新发布的云定义存储 CDS 和传统的存储阵列、分布式存储、软件定义存储的区别在哪里?阿里云存储团队如何看待将来存储的发展趋势?本文邀请了 CDS 研发团队的核心技术负责人为大家揭开围绕着阿里云 CDS 的种种谜团。 云定义存储&#…

TSDB时序数据库时序数据压缩解压技术浅析

简介: 目前,物联网、工业互联网、车联网等智能互联技术在各个行业场景下快速普及应用,导致联网传感器、智能设备数量急剧增加,随之而来的海量时序监控数据存储、处理问题,也为时序数据库高效压缩、存储数据能力提出了更…

Atmosic推出ATM33新品,全新的ATM33系列性能大升级

为减少各种物联网产品高昂的电池更换成本,以及降低对环境的危害,在上个月举行的媒体发布会中,Atmosic营销及业务拓展副总裁 Srinivas发布了公司的新产品——ATM33,并详细解析了ATM33的技术特性和主要应用领域。 ATM33系列产品可支…

什么是低代码(Low-Code)?

简介: 什么是低代码?我们为什么需要低代码?低代码会让程序员失业吗?本文总结了低代码领域的基本概念、核心价值与行业现状,带你全面了解低代码。 阿里云 云原生应用研发平台EMAS 彭群(楚衡) 一…

php用wordanalysis抓取姓名_利用vba查询/抓取 外部数据

考虑这么一个excel文件,路径为:"E:dataEdata.xlsx",样式如封面图片所示想要在其他excel文件中,通过代码直接抓取Edata.xlsx中想要的数据,做法如下:先在Visual Basic中勾选“工具-引用-Microsoft …

如何加速云原生数据应用?这个开源项目备受关注

简介: 自2020年9月Fluid正式对外开源,发展短短一年时间, Fluid 便一次获得两项开源界的重要认可,证明着其所专注的云原生、AI 领域也正在迎来广泛关注。这其中的意义和价值如何?我们尝试管中察豹,从 Fluid …

使用 Cilium 增强 Kubernetes 网络安全

作者 | Addo Zhang来源 | 云原生指北TL;DR在本篇,我们分别使用了 Kubernetes 原生的网络策略和 Cilium 的网络策略实现了 Pod 网络层面的隔离。不同的是,前者只提供了基于 L3/4 的网络策略;后者支持 L3/4、L7 的网络策略。通过网络策略来提升…

内含干货PPT下载|一站式数据管理DMS关键技术解读

简介: 深入解读实时数据流、库仓一体数据处理等核心技术 “数聚云端智驭未来”——阿里云数据库创新上云峰会暨第3届数据库性能挑战赛决赛颁奖典礼已圆满结束,更多干货内容欢迎大家观看峰会直播回放。 峰会直播回放📎数聚云端 智驭未来——…

好饭不怕晚,扒一下 Redis 的配置文件

作者 | 阿Q来源 | 阿Q说代码在往期的文章中我们已经对Redis的概念和基本命令进行了讲解,今天我们来看下它的配置文件,Redis的配置文件在我们的开发和实际应用中起着非常重要的作用。我们可以在安装目录下找到redis.conf配置文件,通过vim命令进…

ICBU可控文本生成技术详解

简介: 文本生成(Text Generation)是自然语言处理(Natural Language Processing,NLP)领域的一项重要且具有挑战的任务。顾名思义,文本生成任务的目的是生成近似于自然语言的文本序列,…

云拨测助力节卡机器人 全面优化海外网站性能

简介: 【案例分享云拨测】借助云拨测,节卡机器人有效挖掘性能瓶颈,经过优化,提升网站打开速度 50% 以上,提高了运营推广活动的 ROI,帮助节卡为全球用户提供更加优质的服务! 作者|白…

分享一个巨好用的 HTTP 命令行宝藏工具

作者 | Eason来源 | 程序员巴士HTTPie是一个命令行 HTTP 客户端。它的目标是使 CLI 与 Web 服务的交互尽可能人性化。HTTPie 设计用于测试、调试以及通常与 API 和 HTTP 服务器交互。http 和 https 的命令允许创建和发送任意 HTTP 请求。HTTPie 整体采用简单自然的语法&#xf…

mysql远程备份工具_innobackupex实现MySQL远程备份

一、了解innobackupex1、mysqldumpmysql逻辑备份工具,作用于服务器本地,不需要额外安装插件可以单表备份,备份为sql文件形式、方便,在多个场景通用可通过shell命令实现定时备份,但备份时如果用户有操作,容易…

技术干货 | Native 页面下如何实现导航栏的定制化开发?

简介: 通过不同实际场景的描述,供大家参考完成 Native 页面的定制化开发。 很多 mPaaS Coder 在接入 H5 容器后都会对容器的导航栏进行深度定制,本文旨在通过不同实际场景的描述,供大家参考完成 Native 页面的定制化开发。 欢迎关…