Düğüm 8'i Kullanma Zamanı Geldi mi?

Yayınlanan: 2022-03-11

Düğüm 8 çıktı! Aslında, Düğüm 8, bazı sağlam gerçek dünya kullanımını görecek kadar uzun süredir piyasada. Hızlı ve yeni bir V8 motoruyla ve async/await, HTTP/2 ve async kancaları gibi yeni özelliklerle geldi. Ama projeniz için hazır mı? Hadi bulalım!

Editörün notu: Muhtemelen Düğüm 10'un (kod adı Dubnium ) da çıktığının farkındasınızdır. İki nedenden dolayı Düğüm 8'e ( Karbon ) odaklanmayı seçiyoruz: (1) Düğüm 10, uzun vadeli destek (LTS) aşamasına yeni giriyor ve (2) Düğüm 8, Düğüm 10'dan daha önemli bir yineleme olarak işaretlendi. .

Düğüm 8 LTS'deki Performans

Bu dikkat çekici sürümün performans iyileştirmelerine ve yeni özelliklerine göz atarak başlayacağız. Önemli bir iyileştirme alanı, Node'un JavaScript motorundadır.

Zaten bir JavaScript motoru tam olarak nedir?

Bir JavaScript motoru, kodu yürütür ve optimize eder. JavaScript'i bayt koduna derleyen standart bir yorumlayıcı veya tam zamanında (JIT) derleyici olabilir. Node.js tarafından kullanılan JS motorlarının tümü yorumlayıcı değil, JIT derleyicileridir.

V8 Motoru

Node.js, en başından beri Google'ın Chrome V8 JavaScript motorunu veya yalnızca V8'i kullandı. Bazı Düğüm sürümleri, V8'in daha yeni bir sürümüyle eşitlemek için kullanılır. Ancak burada V8 sürümlerini karşılaştırdığımız için V8'i Düğüm 8 ile karıştırmamaya dikkat edin.

Yazılım bağlamlarında genellikle "v8"i argo olarak veya hatta "sürüm 8" için resmi kısa biçim olarak kullandığımızdan, bu nedenle, bazıları "Node V8" veya "Node.js V8" ile "NodeJS 8"i birleştirebilir. ”, ancak her şeyi açıklığa kavuşturmak için bu makale boyunca bundan kaçındık: V8 her zaman Node.js sürümü değil motor anlamına gelir.

V8 Sürüm 5

Düğüm 6, JavaScript motoru olarak V8 sürüm 5'i kullanır. (Düğüm 8'in ilk birkaç nokta sürümü de V8 sürüm 5'i kullanır, ancak Düğüm 6'dan daha yeni bir V8 nokta sürümü kullanırlar.)

derleyiciler

V8 sürümleri 5 ve önceki sürümlerinde iki derleyici bulunur:

  • Full-codegen basit ve hızlı bir JIT derleyicisidir ancak yavaş makine kodu üretir.
  • Krank mili , optimize edilmiş makine kodu üreten karmaşık bir JIT derleyicisidir.
İş Parçacığı

Derinlerde, V8 birden fazla iş parçacığı türü kullanır:

  • Ana iş parçacığı kodu alır, derler ve ardından yürütür.
  • Ana iş parçacığı kodu optimize ederken ikincil iş parçacıkları kodu yürütür.
  • Profil oluşturucu iş parçacığı, çalışma zamanını performans göstermeyen yöntemler hakkında bilgilendirir. Krank mili daha sonra bu yöntemleri optimize eder.
  • Diğer iş parçacıkları çöp toplamayı yönetir.
Derleme Süreci

İlk olarak, Full-codegen derleyicisi JavaScript kodunu yürütür. Kod yürütülürken, profil oluşturucu iş parçacığı, motorun hangi yöntemleri optimize edeceğini belirlemek için veri toplar. Başka bir iş parçacığında, Krank Mili bu yöntemleri optimize eder.

Konular

Yukarıda bahsedilen yaklaşımın iki ana sorunu vardır. İlk olarak, mimari olarak karmaşıktır. İkincisi, derlenmiş makine kodu çok daha fazla bellek tüketir. Tüketilen bellek miktarı, kodun çalıştırılma sayısından bağımsızdır. Yalnızca bir kez çalışan kod bile önemli miktarda bellek kaplar.

V8 Sürüm 6

V8 sürüm 6 motorunu kullanan ilk Düğüm sürümü, Düğüm 8.3'tür.

6. sürümde, V8 ekibi bu sorunları azaltmak için Ignition ve TurboFan'ı geliştirdi. Ignition ve TurboFan, sırasıyla Full-codegen ve CrankShaft'ın yerini alıyor.

Yeni mimari daha basit ve daha az bellek tüketiyor.

Ignition, JavaScript kodunu makine kodu yerine bayt koduna derleyerek çok fazla bellek tasarrufu sağlar. Daha sonra, optimize edici derleyici olan TurboFan, bu bayt kodundan optimize edilmiş makine kodu üretir.

Özel Performans İyileştirmeleri

Düğüm 8.3+ sürümündeki performansın eski Düğüm sürümlerine göre değiştiği alanları gözden geçirelim.

Nesneler Oluşturma

Nesne oluşturma, Düğüm 8.3+'te Düğüm 6'dan yaklaşık beş kat daha hızlıdır.

İşlev Boyutu

V8 motoru, bir fonksiyonun birkaç faktöre göre optimize edilip edilmeyeceğine karar verir. Bir faktör, fonksiyon boyutudur. Küçük işlevler optimize edilirken uzun işlevler optimize edilmez.

Fonksiyon Boyutu Nasıl Hesaplanır?

Eski V8 motorundaki krank mili, işlev boyutunu belirlemek için "karakter sayımı" kullanır. Bir fonksiyondaki boşluk ve yorumlar, optimize edilme şansını azaltır. Bunun sizi şaşırtabileceğini biliyorum, ancak o zamanlar bir yorum hızı yaklaşık %10 oranında azaltabilirdi.

Düğüm 8.3+'te, boşluk ve yorumlar gibi alakasız karakterler işlev performansına zarar vermez. Neden?

Çünkü yeni TurboFan, fonksiyon boyutunu belirlemek için karakterleri saymaz. Bunun yerine, soyut sözdizimi ağacı (AST) düğümlerini sayar, böylece etkin bir şekilde yalnızca gerçek işlev talimatlarını dikkate alır. Node 8.3+ kullanarak istediğiniz kadar yorum ve boşluk ekleyebilirsiniz.

Array -ifying Argümanlar

JavaScript'teki normal işlevler, örtük bir Array benzeri argument nesnesi taşır.

Array benzeri ne anlama geliyor?

arguments nesnesi bir şekilde bir dizi gibi davranır. length özelliğine sahiptir, ancak Array forEach ve map gibi yerleşik yöntemlerinden yoksundur.

arguments nesnesi şu şekilde çalışır:

 function foo() { console.log(arguments[0]); // Expected output: a console.log(arguments[1]); // Expected output: b console.log(arguments[2]); // Expected output: c } foo("a", "b", "c");

Peki, arguments nesnesini bir diziye nasıl dönüştürebiliriz? Kısa Array.prototype.slice.call(arguments) kullanarak.

 function test() { const r = Array.prototype.slice.call(arguments); console.log(r.map(num => num * 2)); } test(1, 2, 3); // Expected output: [2, 4, 6]

Array.prototype.slice.call(arguments) , tüm Düğüm sürümlerinde performansı bozar. Bu nedenle, anahtarları bir for döngüsü aracılığıyla kopyalamak daha iyi performans gösterir:

 function test() { const r = []; for (index in arguments) { r.push(arguments[index]); } console.log(r.map(num => num * 2)); } test(1, 2, 3); // Expected output [2, 4, 6]

for döngüsü biraz zahmetli, değil mi? Yayılma operatörünü kullanabiliriz, ancak Düğüm 8.2 ve aşağısında yavaştır:

 function test() { const r = [...arguments]; console.log(r.map(num => num * 2)); } test(1, 2, 3); // Expected output [2, 4, 6]

Durum 8.3+ Düğümünde değişti. Artık yayılma çok daha hızlı yürütülüyor, hatta bir for döngüsünden bile daha hızlı.

Kısmi Uygulama (Körleme) ve Bağlama

Currying, birden çok argümanı alan bir fonksiyonu, her yeni fonksiyonun yalnızca bir argüman aldığı bir dizi fonksiyona bölmektir.

Diyelim ki basit bir add fonksiyonumuz var. Bu işlevin kıvrımlı versiyonu bir argüman alır, num1 . Başka bir num2 bağımsız değişkenini alan ve num1 ile num2 toplamını döndüren bir işlev döndürür:

 function add(num1, num2) { return num1 + num2; } add(4, 6); // returns 10 function curriedAdd(num1) { return function(num2) { return num1 + num2; }; } const add5 = curriedAdd(5); add5(3); // returns 8

bind yöntemi, terser sözdizimi olan bir curried işlevi döndürür.

 function add(num1, num2) { return num1 + num2; } const add5 = add.bind(null, 5); add5(3); // returns 8

Yani bind inanılmaz, ancak eski Düğüm sürümlerinde yavaş. Düğüm 8.3+'te bind çok daha hızlıdır ve herhangi bir performans artışı endişesi duymadan bunu kullanabilirsiniz.

deneyler

Düğüm 6 ile Düğüm 8'in performansını yüksek düzeyde karşılaştırmak için çeşitli deneyler yapılmıştır. Bunların Düğüm 8.0'da gerçekleştirildiğini ve dolayısıyla V8 sürüm 6 yükseltmesi sayesinde Düğüm 8.3+'e özgü yukarıda bahsedilen iyileştirmeleri içermediklerini unutmayın.

Düğüm 8'deki sunucu oluşturma süresi, Düğüm 6'dakinden %25 daha azdı. Büyük projelerde, sunucu örneklerinin sayısı 100'den 75'e düşürülebiliyordu. Bu şaşırtıcı. Düğüm 8'de 500 testlik bir paketi test etmek %10 daha hızlıydı. Web paketi derlemeleri %7 daha hızlıydı. Genel olarak, sonuçlar Düğüm 8'de gözle görülür bir performans artışı gösterdi.

Düğüm 8 Özellikleri

Düğüm 8'deki tek gelişme hız değildi. Ayrıca birkaç kullanışlı yeni özellik de getirdi - belki de en önemlisi, async/await .

Düğüm 8'de Async/Bekleme

Geri aramalar ve vaatler genellikle JavaScript'te eşzamansız kodu işlemek için kullanılır. Geri aramalar, sürdürülemez kod üretmekle ünlüdür. JavaScript topluluğunda kargaşaya (özellikle geri arama cehennemi olarak bilinir) neden oldular. Sözler bizi uzun süre geri arama cehenneminden kurtardı, ancak yine de senkron kodun temizliğinden yoksundular. Async/await, eşzamanlı kod gibi görünen eşzamansız kod yazmanıza izin veren modern bir yaklaşımdır.

Ve async/await önceki Düğüm sürümlerinde kullanılabilse de, harici kitaplıklar ve araçlar gerektiriyordu - örneğin, Babel aracılığıyla ekstra ön işleme. Artık kutudan çıktığı haliyle yerel olarak mevcuttur.

Async/await'in geleneksel vaatlerden daha üstün olduğu bazı durumlardan bahsedeceğim.

Şartlılar

Veri getirdiğinizi ve yüke göre yeni bir API çağrısının gerekip gerekmediğini belirleyeceğinizi hayal edin. Bunun "geleneksel vaatler" yaklaşımıyla nasıl yapıldığını görmek için aşağıdaki koda bakın.

 const request = () => { return getData().then(data => { if (!data.car) { return fetchForCar(data.id).then(carData => { console.log(carData); return carData; }); } else { console.log(data); return data; } }); };

Gördüğünüz gibi, yukarıdaki kod zaten dağınık görünüyor, sadece bir ekstra koşullu. Async/await daha az yuvalama içerir:

 const request = async () => { const data = await getData(); if (!data.car) { const carData = await fetchForCar(data); console.log(carData); return carData; } else { console.log(data); return data; } };

Hata yönetimi

Async/await, try/catch'te hem zaman uyumlu hem de zaman uyumsuz hataları işlemek için size erişim izni verir. Eşzamansız bir API çağrısından gelen JSON'u ayrıştırmak istediğinizi varsayalım. Tek bir dene/yakala, hem ayrıştırma hatalarını hem de API hatalarını işleyebilir.

 const request = async () => { try { console.log(await getData()); } catch (err) { console.log(err); } };

Ara Değerler

Ya bir sözün başka bir sözden çözülmesi gereken bir argümana ihtiyacı varsa? Bu, asenkron çağrıların seri olarak yapılması gerektiği anlamına gelir.

Geleneksel vaatleri kullanarak, aşağıdaki gibi bir kod elde edebilirsiniz:

 const request = () => { return fetchUserData() .then(userData => { return fetchCompanyData(userData); }) .then(companyData => { return fetchRetiringPlan(userData, companyData); }) .then(retiringPlan => { const retiringPlan = retiringPlan; }); };

Bu durumda, zincirleme eşzamansız çağrıların gerekli olduğu zaman uyumsuz/bekleme parlar:

 const request = async () => { const userData = await fetchUserData(); const companyData = await fetchCompanyData(userData); const retiringPlan = await fetchRetiringPlan(userData, companyData); };

Paralel olarak zaman uyumsuz

Birden fazla eşzamansız işlevi paralel olarak çağırmak isterseniz ne olur? Aşağıdaki kodda, fetchHouseData çözülmesini bekleyeceğiz, ardından fetchCarData . Bunların her biri birbirinden bağımsız olmakla birlikte sıralı olarak işlenir. Her iki API'nin de çözülmesi için iki saniye bekleyeceksiniz. Bu iyi değil.

 function fetchHouseData() { return new Promise(resolve => setTimeout(() => resolve("Mansion"), 1000)); } function fetchCarData() { return new Promise(resolve => setTimeout(() => resolve("Ferrari"), 1000)); } async function action() { const house = await fetchHouseData(); // Wait one second const car = await fetchCarData(); // ...then wait another second. console.log(house, car, " in series"); } action();

Eşzamansız çağrıları paralel olarak işlemek daha iyi bir yaklaşımdır. Bunun async/await'te nasıl başarıldığına dair bir fikir edinmek için aşağıdaki kodu kontrol edin.

 async function parallel() { houseDataPromise = fetchHouseData(); carDataPromise = fetchCarData(); const house = await houseDataPromise; // Wait one second for both const car = await carDataPromise; console.log(house, car, " in parallel"); } parallel();

Bu aramaları paralel olarak işlemek, her iki arama için de yalnızca bir saniye beklemenize neden olur.

Yeni Çekirdek Kitaplık İşlevleri

Düğüm 8 ayrıca bazı yeni temel işlevler de getiriyor.

Dosyaları Kopyala

Düğüm 8'den önce, dosyaları kopyalamak için iki akış oluşturur ve verileri birinden diğerine aktarırdık. Aşağıdaki kod, okuma akışının verileri yazma akışına nasıl yönlendirdiğini gösterir. Gördüğünüz gibi, bir dosyayı kopyalamak gibi basit bir eylem için kod karmaşıktır.

 const fs = require('fs'); const rd = fs.createReadStream('sourceFile.txt'); rd.on('error', err => { console.log(err); }); const wr = fs.createWriteStream('target.txt'); wr.on('error', err => { console.log(err); }); wr.on('close', function(ex) { console.log('File Copied'); }); rd.pipe(wr);

Düğüm 8'de fs.copyFile ve fs.copyFileSync , dosyaları çok daha az güçlükle kopyalamaya yönelik yeni yaklaşımlardır.

 const fs = require("fs"); fs.copyFile("firstFile.txt", "secondFile.txt", err => { if (err) { console.log(err); } else { console.log("File copied"); } });

Söz Ver ve Geri Ara

util.promisify , normal bir işlevi zaman uyumsuz bir işleve dönüştürür. Girilen işlevin ortak Node.js geri çağırma stilini izlemesi gerektiğini unutmayın. Son argüman olarak bir geri arama yapmalıdır, yani (error, payload) => { ... } .

 const { promisify } = require('util'); const fs = require('fs'); const readFilePromisified = promisify(fs.readFile); const file_path = process.argv[2]; readFilePromisified(file_path) .then((text) => console.log(text)) .catch((err) => console.log(err));

Gördüğünüz gibi, util.promisify , fs.readFile bir zaman uyumsuz işleve dönüştürdü.

Node.js ise util.callbackify ile birlikte gelir. util.callbackify , util.promisify : Zaman uyumsuz bir işlevi Node.js geri çağırma stili işlevine dönüştürür.

Okunabilir ve Yazılabilirler için İşlevi destroy

Düğüm 8'deki destroy işlevi, okunabilir veya yazılabilir bir akışı yok etmenin/kapatmanın/iptal etmenin belgelenmiş bir yoludur:

 const fs = require('fs'); const file = fs.createWriteStream('./big.txt'); file.on('error', errors => { console.log(errors); }); file.write(`New text.\n`); file.destroy(['First Error', 'Second Error']);

Yukarıdaki kod, New text. metniyle birlikte big.txt adında (önceden mevcut değilse) yeni bir dosya oluşturulmasıyla sonuçlanır. .

Düğüm 8'deki Readable.destroy ve Writeable.destroy işlevleri bir close olayı ve isteğe bağlı bir error olayı yayar; destroy mutlaka bir şeylerin ters gittiği anlamına gelmez.

Yayılma Operatörü

Yayılma operatörü (aka ... ) Düğüm 6'da çalıştı, ancak yalnızca diziler ve diğer yinelenebilirlerle:

 const arr1 = [1,2,3,4,5,6] const arr2 = [...arr1, 9] console.log(arr2) // expected output: [1,2,3,4,5,6,9]

Düğüm 8'de nesneler ayrıca yayılma operatörünü de kullanabilir:

 const userCarData = { type: 'ferrari', color: 'red' }; const userSettingsData = { lastLoggedIn: '12/03/2019', featuresPlan: 'premium' }; const userData = { ...userCarData, name: 'Youssef', ...userSettingsData }; console.log(userData); /* Expected output: { type: 'ferrari', color: 'red', name: 'Youssef', lastLoggedIn: '12/03/2019', featuresPlan: 'premium' } */

Düğüm 8 LTS'deki Deneysel Özellikler

Deneysel özellikler kararlı değildir, kullanımdan kaldırılabilir ve zamanla güncellenebilir. Bu özelliklerden herhangi birini, kararlı hale gelene kadar üretimde kullanmayın.

zaman uyumsuz kancalar

Zaman uyumsuz kancalar, bir API aracılığıyla Düğüm içinde oluşturulan eşzamansız kaynakların ömrünü izler.

Zaman uyumsuz kancalarla daha ileri gitmeden önce olay döngüsünü anladığınızdan emin olun. Bu video yardımcı olabilir. Zaman uyumsuz kancalar, zaman uyumsuz işlevlerde hata ayıklamak için kullanışlıdır. Birkaç uygulamaları var; bunlardan biri, zaman uyumsuz işlevler için hata yığını izleridir.

Aşağıdaki koda bir göz atın. console.log öğesinin zaman uyumsuz bir işlev olduğuna dikkat edin. Bu nedenle, zaman uyumsuz kancaların içinde kullanılamaz. Bunun yerine fs.writeSync kullanılır.

 const asyncHooks = require('async_hooks'); const fs = require('fs'); const init = (asyncId, type, triggerId) => fs.writeSync(1, `${type} \n`); const asyncHook = asyncHooks.createHook({ init }); asyncHook.enable();

Zaman uyumsuz kancalar hakkında daha fazla bilgi edinmek için bu videoyu izleyin. Özellikle bir Node.js kılavuzu açısından, bu makale açıklayıcı bir uygulama aracılığıyla zaman uyumsuz kancaların gizemini çözmeye yardımcı olur.

Düğüm 8'deki ES6 Modülleri

Düğüm 8 artık ES6 modüllerini destekleyerek bu söz dizimini kullanmanıza olanak tanır:

 import { UtilityService } from './utility_service';

ES6 modüllerini Düğüm 8'de kullanmak için aşağıdakileri yapmanız gerekir.

  1. --experimental-modules bayrağını komut satırına ekleyin
  2. Dosya uzantılarını .js .mjs yeniden adlandırın

HTTP/2

HTTP/2, sık güncellenmeyen HTTP protokolünün en son güncellemesidir ve Node 8.4+ bunu deneysel modda yerel olarak destekler. Kendinden önceki HTTP/1.1'den daha hızlı, daha güvenli ve daha verimli. Ve Google bunu kullanmanızı önerir. Ama başka ne yapar?

çoğullama

HTTP/1.1'de sunucu her seferinde bağlantı başına yalnızca bir yanıt gönderebilir. HTTP/2'de sunucu paralel olarak birden fazla yanıt gönderebilir.

Sunucu İtme

Sunucu, tek bir istemci isteği için birden çok yanıt gönderebilir. Bu neden faydalıdır? Örnek olarak bir web uygulamasını ele alalım. geleneksel olarak,

  1. İstemci bir HTML belgesi ister.
  2. İstemci, HTML belgesinden ihtiyaç duyulan kaynakları keşfeder.
  3. İstemci, gerekli her kaynak için bir HTTP isteği gönderir. Örneğin, istemci, belgede bahsedilen her JS ve CSS kaynağı için bir HTTP isteği gönderir.

Sunucu itme özelliği, sunucunun tüm bu kaynakları zaten bildiği gerçeğinden yararlanır. Sunucu bu kaynakları istemciye iletir. Web uygulaması örneğinde, istemci ilk belgeyi talep ettikten sonra sunucu tüm kaynakları iter. Bu gecikmeyi azaltır.

önceliklendirme

İstemci, gerekli her bir yanıtın ne kadar önemli olduğunu belirlemek için bir önceliklendirme şeması belirleyebilir. Sunucu daha sonra bu şemayı bellek, CPU, bant genişliği ve diğer kaynakların tahsisine öncelik vermek için kullanabilir.

Eski Kötü Alışkanlıklardan Kurtulmak

HTTP/1.1 çoğullamaya izin vermediğinden, yavaş hızı ve dosya yüklemeyi örtmek için çeşitli optimizasyonlar ve geçici çözümler kullanılır. Ne yazık ki, bu teknikler RAM tüketiminde artışa ve işlemenin gecikmesine neden olur:

  • Etki alanı paylaşımı: Bağlantıların dağıtılması ve paralel olarak işlenmesi için birden çok alt etki alanı kullanıldı.
  • İstek sayısını azaltmak için CSS ve JavaScript dosyalarını birleştirmek.
  • Sprite haritaları: HTTP isteklerini azaltmak için görüntü dosyalarını birleştirme.
  • Satır içi: CSS ve JavaScript, bağlantı sayısını azaltmak için doğrudan HTML'ye yerleştirilir.

Artık HTTP/2 ile bu teknikleri unutabilir ve kodunuza odaklanabilirsiniz.

Peki HTTP/2'yi Nasıl Kullanırsınız?

Çoğu tarayıcı, yalnızca güvenli bir SSL bağlantısı aracılığıyla HTTP/2'yi destekler. Bu makale, kendinden imzalı bir sertifika yapılandırmanıza yardımcı olabilir. Oluşturulan .crt dosyasını ve .key dosyasını ssl adlı bir dizine ekleyin. Ardından aşağıdaki kodu server.js adlı bir dosyaya ekleyin.

Bu özelliği etkinleştirmek için komut satırında --expose-http2 bayrağını kullanmayı unutmayın. Örneğimiz için çalıştırma komutu node server.js --expose-http2 .

 const http2 = require('http2'); const path = require('path'); const fs = require('fs'); const PORT = 3000; const secureServerOptions = { cert: fs.readFileSync(path.join(__dirname, './ssl/server.crt')), key: fs.readFileSync(path.join(__dirname, './ssl/server.key')) }; const server = http2.createSecureServer(secureServerOptions, (req, res) => { res.statusCode = 200; res.end('Hello from Toptal'); }); server.listen( PORT, err => err ? console.error(err) : console.log(`Server listening to port ${PORT}`) );

Tabii ki, Düğüm 8, Düğüm 9, Düğüm 10 vb. hala eski HTTP 1.1'i desteklemektedir—standart bir HTTP işlemine ilişkin resmi Node.js belgeleri uzun süre eski olmayacaktır. Ancak HTTP/2 kullanmak istiyorsanız, bu Node.js kılavuzuyla daha derine inebilirsiniz.

Peki, Sonunda Node.js 8 Kullanmalı mıyım?

Düğüm 8, performans iyileştirmeleri ve async/await, HTTP/2 ve diğerleri gibi yeni özelliklerle geldi. Uçtan uca deneyler, Düğüm 8'in Düğüm 6'dan yaklaşık %25 daha hızlı olduğunu göstermiştir. Bu, önemli ölçüde maliyet tasarrufu sağlar. Yani yeşil alan projeleri için kesinlikle! Ancak mevcut projeler için Node'u güncellemeli misiniz?

Mevcut kodunuzun çoğunu değiştirmeniz gerekip gerekmediğine bağlıdır. Bu belge, Düğüm 6'dan geliyorsanız, tüm Düğüm 8 kırma değişikliklerini listeler. Projenizin tüm npm paketlerini en son Düğüm 8 sürümünü kullanarak yeniden yükleyerek yaygın sorunlardan kaçınmayı unutmayın. Ayrıca, geliştirme makinelerinde her zaman üretim sunucularında olduğu gibi aynı Node.js sürümünü kullanın. İyi şanslar!

İlişkili:
  • Neden Node.js Kullanmalıyım? Her Duruma Özel Eğitim
  • Node.js Uygulamalarında Bellek Sızıntılarında Hata Ayıklama
  • Node.js'de Güvenli REST API Oluşturma
  • Kabin Ateşi Kodlaması: Bir Node.js Arka Uç Eğitimi