有关Node.js的安全更新以及Node.js v15的信息
有一个 Node.js 安全更新可用。
https://nodejs.org/en/ 的中文翻译为:
2月23日,由于发布了Node.js的新版本,所以让我们来进行检查吧。
https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/
10.x、12.x、14.x和15.x的安全更新
重要(1), 高度(1), 低度(1)
-
- 当HTTP/2的unknownProtocol过多时,可能会遭受DoS攻击的问题。
-
- 存在文件系统泄露的可能性。
-
- 可能引发内存泄漏。
-
- 当localhost6包含在白名单中时,可能会遭受DoS攻击的问题。
-
- 如果/etc/hosts包含localhost6,则可能会受到此攻击的影响。
- 通过Node.js利用OpenSSL的漏洞可能会发生问题。
我们应该适当地遵循(如果只是前端的话,感觉没什么大不了的)。
※Node.js 10.x 预计将于2021年4月30日结束支持,12.x系列预计于2022年4月30日结束支持。
※奇数版本用于功能开发,偶数版本用于长期支持。除了最新的15.x版本,不存在其他奇数版本。
关于Node.js的错误报告
nodejs-sec 群组
https://groups.google.com/g/nodejs-sec?pli=1
如何报告Bug
https://github.com/nodejs/node/blob/master/SECURITY.md
报告 Nodejs 的错误即可获得报酬的计划:错误赏金计划
https://hackerone.com/nodejs
关于Node.js v15的相关信息
由于我对Node.js v15没有跟得上,所以进行了一次复习。
https://nodejs.org/en/ 的中文释义如下:
v15 的发布日期是2020年10月21日。v16 会在2021年4月发布吧?
Node.js v15.0.0 正式发布
codedamn さんのまとめ YouTube のリンクは、https://www.youtube.com/watch?v=OIzGI5wFiXg です。
很整齐有条理
1. 包含 npm 7
我安装了npm 7。
以下是npm官方网站的链接:https://www.npmjs.com/package/npm
workspace という概念が入った
monorepo で作りたい時とかは便利そう
acceptDependencies という概念も入った
peerDependencies の挙動変更
npx が実行前に確認されるようになった
npm audit の表示方法が変更
package.exports が npm の内部モジュールを参照できないようになった
npm test の表示内容が変更
npm build と npm unbuild が廃止
以下是对《NPM v7的主要变更总结》一文的中文本地化版本:
https://blog.watilde.com/2020/10/14/npm-v7的主要变更总结/
2. 更改 unhandledRejection 的行为。
突破性变革!
unhandledRejection の挙動が変わった。default warn だったのが throw になった。
只是起初,当这件事发生的时候,以下是发生的时机。
Promise を使った非同期処理において想定外のエラーが起きた
エラーハンドリングが漏れている
単純なコードのエラー
由于程序变得糟糕,因此改变了行为,从而能够编写更安全的代码。
请提供一个只需要一种选项的句子翻译,这样助手才能更好地帮助您。
关于未处理的拒绝情况
关于”UnhandledRejection”的问题,请参考这篇文章:https://medium.com/@hagevvashi/unhandledrejectionについて-70739d2b6a60。
我认为当运营网站时,会使用Sentry来处理错误。
https://sentry.io/welcome/ 的欢迎界面。
window.onerror 不会捕获通过 Promise.reject() 抛出的错误(但会以 console.error() 的形式显示)
在检测和处理 Promise 错误时使用,例如在 Node.js 中进行文件操作或进行与浏览器中的 API 通信失败相关的 I/O 处理。
try {
await axios.post("/some-resources");
} catch(e) {
// error handling
throw e; // this causes unhandled rejection
}
window.addEventListener("unhandledrejection", (e: PromiseRejectionEvent): void => {
// an error loginng
logError(e.reason);
});
process.on("unhandledRejection", (error: {} | null | undefined, promise: Promise<any>) => {
// an error loging
logError(error);
})
有关UnhandledRejection的内容,请参考以下链接:https://medium.com/@hagevvashi/unhandledrejectionについて-70739d2b6a60
3. 支持 ES2021
JavaScript引擎V8已升级至v8.6。虽然在浏览器中已经可以使用,所以并不稀奇。
任何一个承诺
当所有的 promise 都变为 resolved 状态时,或者任何一个 promise 变为 rejected 状态时,发生错误。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'foo');
});
Promise.all([promise1, promise2, promise3])
.then((values) => {
console.log(values);
})
.catch(() => {
console.log("error");
});
// expected output: Array [3, 42, "foo"]
Promise.race是在任何一个Promise被解决或被拒绝时出现错误。
Promise.allSettled是在所有Promise被解决或被拒绝时,不会出现错误。
Promise.any是在任何一个Promise被解决时,或所有Promise被拒绝时出现错误。
在同时运行10个Promise时,即使有9个失败,只要最后一个成功,就视为成功(使用race会导致任何一个Promise被拒绝都会引发错误)。
弱引用
在垃圾回收过程中,能够创建可被销毁的对象。
以下是网站链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef
var ref = new WeakRef(element)
ref.deref() // 参照元を取り出す
我尝试简单地制作了一个样本。↓
https://playcode.io/740665/
计时器仍在运行。使用另一个计时器,在5秒后移除DOM元素。在原始计时器函数中仍可以引用。当进行垃圾回收时,引用将被清除并停止运行。
能写出防止内存泄漏的代码。
聚合错误
在需要整理多个错误时使用。
try {
throw new AggregateError([
new Error("some error"),
], 'Hello');
} catch (e) {
console.log(e instanceof AggregateError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "AggregateError"
console.log(e.errors); // [ Error: "some error" ]
}
在中国,可以通过数组方式提供错误信息。
論理代入演算子是指邏輯運算符。
希望你停止,因为这样很难阅读。
let a = true
a &&= false // x && (x = y): x と y が true な値の場合、y の値が代入される
// false
a
// false
a ||= true // x || (x = y): x が false な値の場合、y の値が代入される
// true
a
// true
a = null
a ??= 1 // x ?? (x = y): x が null or undefined な値の場合、y の値が代入される
// 1
a
// 1
a ??= 2
// 1
a
// 1
数值分隔符
因为使用它能使数字更易读,所以要积极使用。
123 === 1_2_3
// true
1_000_000_000.000_001
// 1000000000.000001
我不想处理这么大的神奇数字,也感觉没有处理它的机会。
字符串原型中的所有替换
那個可以在瀏覽器上使用的東西。
以下是关于`String.replaceAll()`方法的文档链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll
此外,你可以参考该链接了解有关`String.replaceAll()`方法的浏览器兼容性:https://caniuse.com/mdn-javascript_builtins_string_replaceall
如果使用Babel工具,IE 11可以将使用replaceAll方法的代码进行转译。通过使用preset-env (core-js),可以在IE 11上实现兼容。
https://v8.dev/features/string-replaceall 的功能是替换字符串的全部匹配项。
顺便提一下,Next.js 没有安装 @babel/preset-env,所以如果要支持 IE11,需要在配置文件中指定。
4. 网络加密API
一种基于Web标准的JavaScript API可以实现加密、解密、签名和验证功能。
可以使用的加密库
(https://caniuse.com/cryptography)
在浏览器中,早就能使用的功能。
Node 最近可以在浏览器中使用一些过去可以使用的功能,这是一个好消息。
5. 中止控制器
在 Node.js 15 中,可以使用 AbortController 这个全局工具对象来中止 Web 请求。
const ac = new AbortController();
ac.signal.addEventListener('abort', () => console.log('Aborted!'),
{ once: true });
ac.abort();
console.log(ac.signal.aborted); // Prints True
取消下载视频的事例
请以中文使用原生语言将以下内容改述:
https://developer.mozilla.org/en-US/docs/Web/API/AbortController
var controller = new AbortController();
var signal = controller.signal;
var downloadBtn = document.querySelector('.download');
var abortBtn = document.querySelector('.abort');
downloadBtn.addEventListener('click', fetchVideo);
abortBtn.addEventListener('click', function() {
controller.abort();
console.log('Download aborted');
});
function fetchVideo() {
...
fetch(url, {signal}).then(function(response) {
...
}).catch(function(e) {
reports.textContent = 'Download error: ' + e.message;
})
}
虽然Fetch在Node.js中尚未实现,但是嘛。
在前端 UI 开发中,如果我们在按钮上使用 `mousedown/mouseup` 事件进行 `addEventListen`,并且由于点击后会触发页面跳转,我们想要在点击后取消事件监听,可以使用 `abortController` 来解除,这个技巧在某处被介绍过。
6. 事件目标
在浏览器上可用的EventTarget现在也可以在Node.js中使用了。事件的发布和传播在浏览器中使用EventTarget,在Node.js中使用EventEmitter。
请提供一个选项来以中文本地化地释义以下网址:https://nodejs.org/api/events.html#events_eventtarget_and_event_api。
const target = new EventTarget();
target.addEventListener("foo", (event) => {
console.log("foo is called");
});
const ev = new Event("foo");
target.dispatchEvent(ev);
尽管事件的传播在DOM树中可能有所不同,但我们已经能够编写出通用的程序。
7. N-API已更新
Node.js的原生扩展Node API(也称为N-API)已经更新。它使用C语言接口。嗯,可能不太常用吧。
请提供一个中文选项: https://nodejs.org/api/n-api.html#n_api_node_api
8. QUIC(实验性功能)
现在可以使用基于UDP的通信协议“QUIC”了。它基于TLS 1.3,具备安全性、流量控制、错误校正、连接和多路复用等等功能。
TLS 1.3 是什么:https://kinsta.com/jp/blog/tls-1-3/
可以创建HTTP/3服务器。
https://blog.leko.jp/post/http-over-quic-on-nodejs15/
太难理解了,实在搞不明白呢。
感想
- せめて Node.js 14.x にはしとこう