Node.js v17.6.0 發(fā)布,允許從 HTTP 和 HTTPS URL 導(dǎo)入模塊
Node.js v17.6.0 版本于 2022-02-23 發(fā)布,一個(gè)顯著的特性是試驗(yàn)性支持從 HTTP 和 HTTPS 導(dǎo)入模塊,這里面也包括很多問(wèn)題,包括從安全方面考慮,目前在 Node.js 中使用還是有一些限制及一些其它的常規(guī)小錯(cuò)誤修復(fù)。
允許從 HTTP 和 HTTPS URL 導(dǎo)入模塊
Node.js v17.6.0 一個(gè)新的實(shí)驗(yàn)性功能是允許我們從 HTTP 或 HTTPS URL 導(dǎo)入 ES Module。這使得一些類似于 Web 瀏覽器導(dǎo)入的工作也可以在 Node.js 中完成,同時(shí)也消除了一些 Node.js 與 Deno 之間的差異,即 Deno 允許使用 HTTPS 導(dǎo)入包。因?yàn)橐恍┌踩院头€(wěn)定性的問(wèn)題和瀏覽器相比還是有些差異的。
以下是一個(gè)導(dǎo)入 HTTP 資源的簡(jiǎn)單示例,該功能現(xiàn)在處于實(shí)驗(yàn)性狀態(tài),運(yùn)行時(shí)需添加 標(biāo)志。--experimental-network-imports
// hello.mjs
export default function hello(message) {
console.log(`Hello ${message}`);
}
$ http-server
Starting up http-server, serving ./
Available on:
http://127.0.0.1:8080
// index.mjs
import hello from 'http://127.0.0.1:8080/hello.mjs';
console.log(hello('codingMay')); // Hello codingMay
當(dāng)前并非所有的 ES Modules 模塊都可以加載,以下兩個(gè) Example,第一個(gè)盡管是加載的 HTTPS 資源,但不是 HTTP/1,實(shí)施例 2 導(dǎo)入了非網(wǎng)絡(luò)依賴資源。
// Example1: 加載 HTTPS 資源
import hello from 'https://gitee.com/qufei1993/esmodule-https-import-example/blob/master/hello.mjs';
console.log(hello('codingMay'));
輸出錯(cuò)誤:RangeError [ERR_UNKNOWN_MODULE_FORMAT]: Unknown module format: null for URL https://gitee.com/qufei1993/esmodule-https-import-example/blob/master/hello.mjs
// Example2: 加載其它非網(wǎng)絡(luò)資源
// hello.mjs
import fsPromise from 'fs/promises';
export const readFile = filename => fsPromise.readFile(filename);
// index.mjs
import hello from 'http://127.0.0.1:8080/hello.mjs';
輸出錯(cuò)誤:TypeError [ERR_INVALID_URL_SCHEME]: The URL must be of scheme file
HTTP 和 HTTPS 導(dǎo)入的一些限制:
- 僅支持 HTTP/1,不支持 HTTP2/HTTP3。
- HTTP 僅限于環(huán)回地址。
- 身份驗(yàn)證不會(huì)發(fā)至服務(wù)器,例如 Authorization、Cookie 和 Proxy-Authorization 標(biāo)頭不會(huì)發(fā)送到服務(wù)。
- 永遠(yuǎn)不會(huì)在目標(biāo)服務(wù)器上檢查 CORS。
- 無(wú)法加載非網(wǎng)絡(luò)依賴項(xiàng)。
- 默認(rèn)情況下不啟用基于網(wǎng)絡(luò)的加載,需要通過(guò) 標(biāo)志打開加載 HTTP 或 HTTPS 資源。--experimental-network-imports
Process 獲取活躍具柄和請(qǐng)求方法廢棄通知
這個(gè)改變主要是在文檔記錄了 和 的棄用通知,以便支持更好的公共API。_getActiveHandles_getActiveRequests
這兩個(gè)以下劃線開頭的 API 被代替的公共 API 方法 在 Node.js v17.3.0 所添加,該方法返回事件循環(huán)活動(dòng)狀態(tài)的資源類型。process.getActiveResourcesInfo()
import { getActiveResourcesInfo } from 'process';
import { createServer } from 'http';
console.log('Before:', getActiveResourcesInfo()); // Before: [ 'CloseReq', 'TTYWrap', 'TTYWrap', 'TTYWrap' ]
setTimeout(() => {
console.log('After:', getActiveResourcesInfo()); // After: [ 'TTYWrap', 'TTYWrap', 'TTYWrap', 'TCPServerWrap', 'Timeout' ]
}, 5000);
createServer((req, res) => res.end('OK')).listen(3000);
其它的一些升級(jí)事項(xiàng)
- stream:恢復(fù) map 規(guī)范合規(guī)性。
- build:移除損壞的 x32 arch 支持。
- fetch:當(dāng) fetch 啟用時(shí)(),全局對(duì)象添加 FormData。--experimental-fetch
- fs:cp 和 cpSync 支持相對(duì)鏈接復(fù)制。
- 流程:廢棄多重解決。
- deps: 更新 npm 到 8.5.1。