网站策划包括哪些内容,南海最新军事,华为云 搭建网站,网站建设工作会议作者 | 零一来源 | 前端印象最近看到Node官方提交了一条commit #xff0c;并且已经合入 master分支 #xff0c;如下图所示#xff1a;node master commit由此可见#xff0c;Node18可能会支持一个非常 nice 的功能#xff0c;那就是 支持 import 远程HTTPS资源和本地的H… 作者 | 零一来源 | 前端印象最近看到Node官方提交了一条commit 并且已经合入 master分支 如下图所示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 404ERR_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 locationERR_UNKNOWN_MODULE_FORMAT当请求的资源不是 ESM 时会报该错误RangeError [ERR_UNKNOWN_MODULE_FORMAT]: Unknown module format: null for URL https://xxxxxx/say-helloWorld.jsERR_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 方法检查资源模块是否缓存过cacheForGETfunction 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);
}若没有缓存则调用 fetchWithRedirectsfunction 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) {// 错误检查// 缓存内容// 返回模块内容}
}然后根据资源类型去调用不同的方法HTTPGet、HTTPSGetlet 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});
}总结这个功能还是很香的谁用谁知道但目前有一些缺点实验性功能可能还会改动而且使用需要加参数 --experimental-network-imports本地只支持 http一旦涉及到 https 就很淡疼该功能的代码实现就限制死了只支持 http: 和 https:其它一概不支持希望本文对你们有所帮助~往期推荐Android 13 第一个开发者版本来了网友直呼Android 12 还没玩透k8s集群居然可以图形化安装了使用这个库让你的服务操作 Redis 速度飞起将 k8s 制作成 3D 射击游戏好玩到停不下来点分享点收藏点点赞点在看