成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node.js 正在衰退嗎?通過一些關鍵指標告訴你事實如何!

開發 前端
關于 Node.js 衰退的傳言被大大夸大了。深入研究這些指標后,可以清楚地看到:Node.js 不僅不會消失,而且正在積極進化以滿足現代 Web 開發的需求。

關于 “Node.js 涼了嗎?” 類似話題大家平常在某乎上也有看到過。

圖片圖片

近日 Node.js 官方 Twitter 上轉載了一則帖子,看來國外也有此討論。Node.js TSC 成員 & fastifyjs 首席維護者 @Matteo Collina 對此進行了回復,表示關于 Node.js 衰退的傳言被大大夸大了。Node.js 不僅不會消失,而且正在積極進化以滿足現代 Web 開發的需求。

圖片圖片

以下內容翻譯自 @Matteo Collina 的博文:

在過去的 15 年里,Node.js 一直是 Web 開發的基石。自 2009 年發布以來,它從一個簡單的小眾技術,發展到如今支持超過 630 萬個網站、無數的 API,并被財富 500 強中的 98% 所使用。

作為一個強大的開源運行時環境,Node.js 非常適合數字化轉型的挑戰。基于熟悉的 JavaScript 基礎,Node.js 擁有輕量且事件驅動的架構,這使其非常適合構建可擴展的實時應用程序,能夠處理大量并發請求——這是當今 API 驅動世界的關鍵需求。

結合其活躍且不斷增長的開源社區以及 OpenJS 基金會的強力支持,Node.js 已成為當代 Web 開發的支柱。

但最近,有關 Node.js 衰落的傳言開始流傳。這些說法有多少可信度呢?

在這篇博客中,我們將深入探討一些關鍵指標,這些指標描繪了一個繁榮的 Node.js 生態系統,并展現了其光明的未來。我們還將看看已經發布并即將在 Node.js 上推出的主要功能。

技術是永無止境的循環

有些人可能認為新技術不可避免地會使舊技術過時。但事實上,進步往往是建立在現有基礎之上的。以 COBOL 為例,這種編程語言創建于 1959 年,今天仍在積極使用。雖然它可能不是前沿 Web 開發的首選,但 COBOL 在銀行、金融和政府機構的核心業務系統維護中仍然至關重要。根據最新的 Tiobe 指數,COBOL 正在上升,其受歡迎程度在 Ruby 和 Rust 之間。其持久的相關性突顯了一個關鍵點:技術進步并不總是意味著拋棄過去。

COBOL 正在崛起(來源:tiobe.com/tiobe-index)COBOL 正在崛起(來源:tiobe.com/tiobe-index)

讓我們考慮另一個 Web 開發領域的老將:jQuery。這款 JavaScript 庫比 Node.js 早三年發布,擁有令人印象深刻的使用統計數據——超過 95% 的 JavaScript 網站和 77% 的所有網站都在使用它。jQuery 的持久受歡迎程度表明,技術的年齡并不一定決定其相關性。就像 jQuery 一樣,Node.js 盡管更年輕,但也有潛力保持其作為 Web 開發人員寶貴工具的地位。

94.4% 支持 JS 的網站都使用了 jQuery -(來源:w3techs.com/techno94.4% 支持 JS 的網站都使用了 jQuery -(來源:w3techs.com/techno

Node.js 目前的勢頭

根據 StackOverflow 的調查,Node.js 是最受歡迎的技術。這種成功依賴于 Node.js 和 npm 注冊表的強大組合。這個創新的二人組解決了大規模軟件復用的挑戰,這是以前無法實現的。

來源:StackOverflow來源:StackOverflow

因此,預先編寫的代碼模塊的使用激增,鞏固了 Node.js 作為開發強國的地位。

圖片圖片

Readable-stream 的下載量從 2022 年的略高于 30 億增長到 2023 年的接近 70 億,意味著使用量在三年內翻了一番。

Node.js 的總下載量:Node.js 每月有高達 1.3 億的下載量。

然而,理解這一數字包含什么很重要。這些下載量中的很大一部分實際上是頭文件。在 npm i 命令期間,這些頭文件是臨時下載的,用于編譯二進制插件。編譯完成后,插件會存儲在系統上供以后使用。

來源:nodedownloads.nodeland.dev來源:nodedownloads.nodeland.dev

按操作系統劃分的下載量中,Linux 位居榜首。這是有道理的,因為 Linux 通常是持續集成(CI)的首選——軟件在開發過程中經過的自動化測試過程。雖然 Linux 主導 CI,但開源項目(OSS)通常在 Windows 上進行額外測試以確保萬無一失。

這種高下載量的趨勢轉化為實際使用。在 2021 年,Node.js 二進制文件的下載量為 3000 萬,到 2024 年這一數字躍升至 5000 萬。在 2023 年,Docker Hub 上的 Node.js 鏡像獲得了超過 8 億次下載,提供了 Node.js 在生產環境中使用情況的寶貴洞察。

保持應用程序安全:更新你的 Node.js 版本

許多開發人員和團隊無意中讓他們的應用程序面臨風險,因為他們沒有更新 Node.js。以下是保持最新版本的重要性。

Node.js 提供了長期支持(LTS)計劃,以確保關鍵應用程序的穩定性和安全性。然而,版本最終會到達其生命周期的終點,這意味著它們不再接收安全補丁。使用這些過時版本構建的應用程序將面臨攻擊風險。

例如,Node.js 版本 14 和 16 現在已經被棄用。盡管如此,這些版本每月仍有數百萬次下載 —— Node 16 在 2 月份被下載了 2500 萬次,而 Node 14 則約為 1000 萬次*。令人震驚的是,一些開發人員甚至在使用更舊的版本,如 Node 10 和 12。

LTS 計劃LTS 計劃

好消息是:更新 Node.js 很容易。推薦的方法是每隔兩個 LTS 版本進行升級。例如,如果你當前使用的是 Node.js 16(已不再支持),你應該遷移到最新的 LTS 版本,即目前的 Node.js 20。不要讓過時的軟件使你的應用程序暴露于安全威脅中。

Node.js 努力確保你的安全

Node.js 非常重視安全性。安全提交會由 Node 技術指導委員會(TSC)進行徹底評估,以確定其有效性。該團隊努力確保快速響應時間,目標是在提交報告后 5 天內做出初步響應,通常在 24 小時內實現。

初次響應平均時間初次響應平均時間

安全修復每季度批量發布。去年,TSC 總共收到了 80 個提交。

Node.js 安全提交Node.js 安全提交

沒有 Open Source Security Foundation(OpenSSF)的支持,這種對安全性的承諾是不可能實現的。通過 OpenSSF 領導的 Alpha-Omega 項目,由微軟、谷歌和亞馬遜資助,Node.js 獲得了專門用于提高其安全態勢的撥款。該項目于 2022 年啟動,旨在通過促進更快的漏洞識別和解決,使關鍵的開源項目更加安全。這一合作以及 Node.js 對安全工作的專門資金,展示了其保護用戶安全的強烈承諾。

安全工作總資金安全工作總資金

近年來發布的主要功能

讓我們來看看過去幾年引入的一些功能。

ESM

Node.js 已經采用了 ECMAScript 模塊(ESM)。ESM 提供了一種現代的代碼結構方式,使其更清晰和易于維護。

ESM 的一個關鍵優勢是能夠在 import 語句中顯式聲明依賴項。這改善了代碼的可讀性,并幫助你跟蹤項目的依賴關系。因此,ESM 正迅速成為新 Node.js 項目的首選模塊格式。

以下是如何在 Node 中使用 ESM 模塊的演示:

// addTwo.mjs
function addTwo(num) {
  return num + 2;
}

export { addTwo };

// app.mjs
import { addTwo } from './addTwo.mjs';

// 打印:6
console.log(addTwo(4));

線程

Node 還推出了工作線程,允許用戶將復雜的計算任務卸載到獨立的線程。這釋放了主線程來處理用戶請求,從而帶來更流暢和響應更快的用戶體驗。

const {
  Worker,
  isMainThread,
  setEnvironmentData,
  getEnvironmentData,
} = require('node:worker_threads');

if (isMainThread) {
  setEnvironmentData('Hello', 'World!');
  const worker = new Worker(__filename);
} else {
  console.log(getEnvironmentData('Hello'));  // 打印“World!”。
}

Fetch

Node.js 現在內置了 Fetch API 的實現,這是一種現代且符合規范的方式來通過網絡獲取資源。這意味著你可以編寫更清晰和一致的代碼,而不必依賴外部庫。

Node.js 還引入了幾個與 Fetch 一起的新功能,以增強 Web 平臺的兼容性。這些功能包括:

  • Web Streams:高效處理大數據流,而不會使應用程序不堪重負。
  • FormData:輕松構建和發送表單數據用于 Web 請求。
  • StructuredClone():創建復雜數據結構的深拷貝。
  • textEncoder() 和 textDecoder():無縫處理文本編碼和解碼任務。
  • Blob:表示各種用途的原始二進制數據。

結合 Fetch,這些新增功能使你能夠在 Node.js 環境中完全構建現代 Web 應用程序。

const res = await fetch('https://example.com');
const json = await res.json();
console.log(json);

Promises

Node.js 提供了內置的 Promise 功能,提供了一種更清晰和結構化的方式來處理異步任務的結果(成功或失敗)。

與回調地獄相比,使用 Promises 可以編寫更自然、更易于理解的代碼。

以下是使用 fs/promises 模塊中的 readFile 方法的實際示例,展示了 Promises 如何簡化異步文件讀取:

import { readFile } from 'node:fs/promises';

try {
  const filePath = new URL('./package.json', import.meta.url);
  const contents = await readFile(filePath, { encoding: 'utf8' });
  console.log(contents);
} catch (err) {
  console.error(err.message);
}

Node 獨有的核心模塊

Node.js 引入了核心模塊和用戶引入模塊的明確區分,使用 "node:" 前綴來標識核心模塊。

這個前綴像是一個標簽,立即將模塊標識為 Node.js 的核心構建塊。這種區分有幾個好處:

  • 減少混淆:不再將核心模塊誤認為是用戶創建的模塊。
  • 簡化選擇:使用 "node:" 前綴輕松選擇所需的特定核心模塊。

這種變化還防止用戶使用可能與未來核心模塊沖突的名稱注冊到 npm 注冊表中,如下所示:

import test from 'node:test';
import assert from 'node:assert';

Watch

在引入此功能之前,nodemon 是文件更改監視中最流行的包。

現在,--watch 標志提供了:

  • 自動文件監視:它監視您導入的文件,準備在發生任何更改時立即采取行動。
  • 即時重啟:每當修改監視的文件時,Node.js 自動重啟,確保您的應用程序反映最新更新。
  • 測試協同作用:--watch 標志與測試運行器友好地協作,在文件更改后自動重新運行測試。這使得開發工作流程變得流暢,提供持續反饋。
  • 為了更精細的控制,--watch-path 標志允許您指定要監視的確切文件。

AsyncLocalStorage

AsyncLocalStorage 允許在 Web 請求或任何其他異步持續時間內存儲數據。它類似于其他語言中的線程本地存儲。

AsyncLocalStorage 增強了開發人員創建像 React 服務器組件這樣的功能,并作為 Next.js 請求存儲的基礎。這些組件簡化了 React 應用程序的服務器端渲染,最終提高了開發者體驗。

import http from 'node:http';
import { AsyncLocalStorage } from 'node:async_hooks';

const asyncLocalStorage = new AsyncLocalStorage();

function logWithId(msg) {
  const id = asyncLocalStorage.getStore();
  console.log(`${id !== undefined ? id : '-'}:`, msg);
}

let idSeq = 0;
http.createServer((req, res) => {
  asyncLocalStorage.run(idSeq++, () => {
    logWithId('start');
    // Imagine any chain of async operations here
    setImmediate(() => {
      logWithId('finish');
      res.end();
    });
  });
}).listen(8080);

http.get('http://localhost:8080');
http.get('http://localhost:8080');
// 輸出:
//   0: start
//   1: start
//   0: finish
//   1: finish

WebCrypto

這個標準化的 API 在 Node.js 環境中直接提供了強大的加密工具集。

使用 WebCrypto,您可以利用以下功能:

  • 密鑰生成:創建強大的加密密鑰以保護您的數據。
  • 加密和解密:對敏感信息進行加密,以安全存儲和傳輸,并在需要時解密。
  • 數字簽名:簽署數據以確保真實性并防止篡改。
  • 哈希:生成數據的唯一指紋以進行驗證和完整性檢查。

通過將 WebCrypto 集成到您的 Node.js 應用程序中,您可以顯著增強其安全性,并保護用戶數據。

const { subtle } = require('node:crypto').webcrypto;

(async function () {
  const key = await subtle.generateKey({
    name: 'HMAC',
    hash: 'SHA-256',
    length: 256
  }, true, ['sign', 'verify']);

  const enc = new TextEncoder();
  const message = enc.encode('I love cupcakes');

  const digest = await subtle.sign({
    name: 'HMAC'
  }, key, message);
})();

實用工具

Node 開始提供了許多實用工具。其核心團隊認為用戶不應該安裝新模塊來執行基本實用程序。其中一些實用程序包括以下內容。

Utils.ParseArgs()

Node.js 提供了一個名為 Utils.ParseArgs() 的內置實用程序(或來自 node 模塊的 parseArgs 函數),簡化了解析應用程序中的命令行參數的任務。這消除了對外部模塊的需求,使您的代碼庫更精簡。

那么,Utils.ParseArgs() 如何幫助?它接受傳遞給您的 Node.js 腳本的命令行參數,并將它們轉換為更可用的格式,通常是一個對象。這個對象使得在代碼中訪問和利用這些參數變得容易。

import { parseArgs } from 'node:util';

const args = ['-f', '--bar', 'b'];
const options = {
  foo: {
    type: 'boolean',
    short: 'f',
  },
  bar: {
    type: 'string',
  },
};

const {
  values,
  positionals,
} = parseArgs({ args, options });

console.log(values, positionals);
// 輸出:[Object: null prototype] { foo: true, bar: 'b' } []

單一可執行應用程序

單個可執行應用程序使得通過 Node 分發應用程序成為可能。這在構建和分發 CLI 到用戶時非常強大。

這個功能將應用程序代碼注入到 Node 二進制文件中。可以分發二進制文件而不必安裝 Node/npm。目前僅支持單個 CommonJS 文件。

為了簡化創建單個可執行文件,Node.js 提供了一個由 Postman Labs 開發的輔助模塊 postject。

權限系統

Node.js 進程對系統資源的訪問以及可以執行的操作可以通過權限來管理。還可以通過權限管理其他模塊可以訪問的模塊。

process.permission.has('fs.write');
// true
process.permission.deny('fs.write', '/home/user');

process.permission.has('fs.write');
// true
process.permission.has('fs.write', '/home/user');
// false

測試運行器

它使用 node:test、--test 標志和 npm test。它支持子測試、skip/only 和生命周期鉤子。它還支持函數和計時器模擬;模塊模擬即將推出。

它還通過 --experimental-test-coverage 提供代碼覆蓋率和通過 -test-reporter 和 -test-reporter-destination 提供報告器。基于 TTY,默認為 spec、TAP 或 stdout。

import test from 'node:test';
import test from 'test';

test('synchronous passing test', (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(1, 1);
});

test('synchronous failing test', (t) => {
  // This test fails because it throws an exception.
  assert.strictEqual(1, 2);
});

test('asynchronous passing test', async (t) => {
  // This test passes because the Promise returned by the async
  // function is settled and not rejected.
  assert.strictEqual(1, 1);
});

test('asynchronous failing test', async (t) => {
  // This test fails because the Promise returned by the async
  // function is rejected.
  assert.strictEqual(1, 2);
});

test('failing test using Promises', (t) => {
  // Promises can be used directly as well.
  return new Promise((resolve, reject) => {
    setImmediate(() => {
      reject(new Error('this will cause the test to fail'));
    });
  });
});

test('callback passing test', (t, done) => {
  // done() is the callback function. When the setImmediate() runs, it invokes
  // done() with no arguments.
  setImmediate(done);
});

test('callback failing test', (t, done) => {
  // When the setImmediate() runs, done() is invoked with an Error object and
  // the test fails.
  setImmediate(() => {
    done(new Error('callback failure'));
  });
});

require(esm)

一個新的標志已經發布,允許開發者同步地引入 ESM 模塊。

'use strict';

const { answer } = require('./esm.mjs');
console.log(answer);

另外,一個新的標志 --experimental-detect-module 允許 Node.js 檢測模塊是 commonJS 還是 esm。這個新標志簡化了在 JavaScript 中編寫 Bash 腳本。

WebSocket

WebSocket 是 Node.js 最受歡迎的功能請求之一。這個功能也是符合規范的。

為 Node.js 做貢獻

作為一種開源技術,Node.js 主要由志愿者和協作者維護。由于 Node.js 的受歡迎程度不斷提高,維護工作也越來越具有挑戰性,需要更多的幫助。

Node.js 核心協作者維護 nodejs/node GitHub 倉庫。Node.js 核心協作者的 GitHub 團隊是 @nodejs/collaborators。協作者具有:

  • 對 nodejs/node 倉庫的提交訪問權限
  • 對 Node.js 持續集成(CI)作業的訪問權限

無論是協作者還是非協作者都可以對 Node.js 源代碼提出修改建議。提出修改建議的機制是 GitHub 拉取請求(pull request)。協作者審查并合并(land)拉取請求。

在拉取請求能夠合并之前,必須得到兩個協作者的批準。(如果拉取請求已經開放超過 7 天,一個協作者的批準就足夠了。)批準拉取請求表示協作者對變更負責。批準必須來自不是變更作者的協作者。

如果協作者反對提出的變更,則該變更不能合并。例外情況是,如果 TSC 投票批準變更,盡管存在反對意見。通常,不需要涉及 TSC。

通常,討論或進一步的更改會導致協作者取消他們的反對。

從根本上說,如果您想對 Node.js 的未來有發言權,請開始貢獻!

總結

關于 Node.js 衰退的傳言被大大夸大了。深入研究這些指標后,可以清楚地看到:Node.js 不僅不會消失,而且正在積極進化以滿足現代 Web 開發的需求。

憑借龐大的用戶基礎、繁榮的開源社區和不斷創新的功能,Node.js 仍然是一個強大而多功能的平臺。最近增加的 ESM、工作線程、Fetch API 和內置模塊表明了它在技術前沿保持領先的承諾。

此外,Node.js 通過專門的團隊和嚴格的流程優先考慮安全性。它的開放協作模式歡迎像您這樣的開發人員的貢獻,確保平臺的光明未來。

因此,無論您是經驗豐富的開發人員還是剛剛起步,Node.js 都為構建可擴展和高效的 Web 應用程序提供了一個有力的選擇。豐富的資源、活躍的社區和對持續改進的承諾使其成為您下一個項目的堅實基礎。

參考:

  • https://blog.platformatic.dev/nodejs-is-here-to-stay
  • https://x.com/matteocollina/status/1800874254696644724
責任編輯:武曉燕 來源: Nodejs技術棧
相關推薦

2019-07-24 11:21:18

Node.jsHTMLCSS

2011-05-10 17:38:35

DBA面試

2022-09-04 15:54:10

Node.jsAPI技巧

2011-09-09 14:23:13

Node.js

2025-04-27 09:04:08

2020-10-08 18:56:17

Node.js命令行

2020-02-27 21:37:33

物聯網IOT物聯網應用

2020-05-20 09:26:59

Node.jsDenoJavaScript

2021-04-26 23:03:48

運維并發Linux

2022-11-16 08:43:30

Node.js模塊

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2013-11-01 09:34:56

Node.js技術

2022-04-02 06:04:03

Node.js代碼緩存V8

2022-04-01 08:02:32

Node.js快照加速hooks

2021-08-10 08:44:13

系統性能優化

2021-11-16 08:51:29

Node JavaScript變量類型

2023-04-19 08:31:57

Node.jsLTS版本

2020-10-16 12:00:47

勒索軟件駐留時間攻擊

2023-01-10 10:06:18

數據備份

2020-06-03 16:50:09

Node.js框架開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久青视频 | 99草免费视频| 国产一区二区久久久 | av大片| 国产日韩一区二区三区 | 国产日韩欧美激情 | 久久久久一区 | 国产精品一区二区三 | 国产成人精品a视频 | 亚洲一区二区三区在线播放 | 中文字幕在线视频网站 | 91视频一区 | 一区二区高清 | 嫩草视频在线免费观看 | 成人午夜网站 | 国产精品久久久久不卡 | 亚洲免费视频网站 | 亚洲欧美一区二区三区国产精品 | 欧美激情在线精品一区二区三区 | 久久久精品影院 | 久久99网 | 精品久久国产 | 一级毛片视频在线观看 | 欧美综合一区二区三区 | 国产精品免费大片 | 亚洲最大av| 高清色| 91欧美| 久久毛片| 在线国产一区 | 久优草 | 国产精品一区二区久久 | 羞羞视频网站免费看 | 久久久99精品免费观看 | 国产精品99久久久久久久久 | 中文字幕国产 | 精品一区二区三区91 | 久热电影 | 狠狠狠| 艹逼网 | 久久久久久国产精品免费免费狐狸 |