從單子到模式匹配,我們將引導(dǎo)您了解高級(jí)開發(fā)人員使用的最新、最棒的 JavaScript 技術(shù)。
譯自Top 5 Cutting-Edge JavaScript Techniques,作者 Alexander T Williams。
JavaScript 是現(xiàn)代 Web 開發(fā)領(lǐng)域必不可少的工具,它不斷變化和發(fā)展,樹立了新的標(biāo)準(zhǔn)。在本文中,我們重點(diǎn)介紹五種前沿 JavaScript 技術(shù),向開發(fā)人員展示構(gòu)建動(dòng)態(tài) Web 應(yīng)用程序的新穎創(chuàng)新方法,這些應(yīng)用程序提供高水平的交互性和性能。從單子到模式匹配,我們將引導(dǎo)你了解高級(jí)開發(fā)人員的最新最棒的 JS 技術(shù)。
JavaScript 因其靈活性而獲得極大歡迎,并已確立了自己作為全球使用最廣泛的編程語(yǔ)言。JS 通常用于創(chuàng)建具有高度交互性的動(dòng)態(tài) Web 應(yīng)用程序,例如實(shí)時(shí)更新、直觀、功能豐富的用戶界面等。此外,JavaScript 允許應(yīng)用程序跨各種平臺(tái)運(yùn)行。
JS 可用于各種項(xiàng)目,例如為電子商務(wù)服務(wù)提供支持或制作動(dòng)畫和手機(jī)游戲。然而,這僅僅是該編程語(yǔ)言功能的縮影。我們還看到 JS 被用于企業(yè)環(huán)境中,尤其是在關(guān)鍵的 ERP 支持的流程(如 SAP 人員擴(kuò)充)中,因?yàn)樗试S創(chuàng)建自定義儀表板和 UI,并構(gòu)建在原生 Web 平臺(tái)之上。
許多領(lǐng)先的平臺(tái)(如 Facebook)使用開源用戶界面框架React Native,它構(gòu)建在 JavaScript 之上。這使他們能夠構(gòu)建可在 iOS 和 Android 上運(yùn)行的移動(dòng)應(yīng)用程序(如今,甚至 Apple Vision Pro),同時(shí)使用單個(gè)代碼庫(kù)。因此,開發(fā)時(shí)間大大縮短,使用的資源更少,并且用戶體驗(yàn)在所有平臺(tái)和設(shè)備上保持一致。
Node.js 等服務(wù)器端運(yùn)行時(shí)環(huán)境使得在 Web 瀏覽器之外運(yùn)行 JavaScript 成為可能,進(jìn)一步提高了應(yīng)用程序的可擴(kuò)展性和部署可能性。為了使 JS 更加通用和多功能,大量與 JS 兼容的 API 也將 Web 應(yīng)用程序鏈接到外部服務(wù)。
最后,JavaScript 得到一個(gè)強(qiáng)大的庫(kù)和框架生態(tài)系統(tǒng)的支持,該生態(tài)系統(tǒng)有助于簡(jiǎn)化和加速開發(fā),允許開發(fā)人員選擇預(yù)先編寫的代碼來(lái)執(zhí)行特定功能。
我們選擇了五種前沿 JavaScript 技術(shù),開發(fā)人員現(xiàn)在應(yīng)該使用這些技術(shù),以幫助你克服眾多開發(fā)問(wèn)題并創(chuàng)建更有效、更用戶友好的應(yīng)用程序。
Monads 有助于組合需要上下文的函數(shù)以返回一個(gè)值,并且在簡(jiǎn)化錯(cuò)誤管理和減少意外結(jié)果的可能性方面非常有效。
Monads 旨在盡可能簡(jiǎn)化代碼中函數(shù)的組合。它們通常在構(gòu)建需要最高精度的企業(yè)級(jí)應(yīng)用程序時(shí)使用。單子可以使代碼更易于管理,從而產(chǎn)生復(fù)雜的回調(diào)、嵌套條件分支等。從本質(zhì)上講,單子旨在盡可能簡(jiǎn)化代碼中函數(shù)的組合。
單子可以分解為三種函數(shù)組合:
函數(shù)組合是允許創(chuàng)建函數(shù)管道的基礎(chǔ),從而實(shí)現(xiàn)高效的數(shù)據(jù)流。管道的第一階段是輸入,最后階段是從其初始狀態(tài)轉(zhuǎn)換的輸出。但是,要實(shí)現(xiàn)這一點(diǎn),管道中的每個(gè)階段都必須能夠預(yù)測(cè)前一階段將返回什么數(shù)據(jù)類型。
這正是單子式所擅長(zhǎng)的,通過(guò)映射函數(shù)來(lái)建立智能管道。它們以類似于 Promise 的方式工作,而且可以無(wú)縫地一起使用。
這里有一個(gè)單子用來(lái)從異步API中獲取一個(gè)用戶,然后將該用戶數(shù)據(jù)傳遞給另一個(gè)異步API來(lái)執(zhí)行計(jì)算:
const composeM = chainMethod => (...ms) => ( ms.reduce((f, g) => x => g(x)[chainMethod](f)) ); const composePromises = composeM('then'); const label = 'API call composition'; // a => Promise(b) const getUserById = id => id === 3 ? Promise.resolve({ name: 'Kurt', role: 'Author' }) : undefined; // b => Promise(c) const hasPermission = ({ role }) => ( Promise.resolve(role === 'Author') ); // Compose the functions (this works!) const authUser = composePromises(hasPermission, getUserById); authUser(3).then(trace(label)); // true
一種聲明式方法通常用于開發(fā)人員優(yōu)先考慮簡(jiǎn)潔的、富有表現(xiàn)力的代碼。
JavaScript 中的聲明式編程重點(diǎn)關(guān)注代碼的整體目標(biāo),而不是如何實(shí)現(xiàn)這些目標(biāo)。這使得代碼更簡(jiǎn)單,更易讀——因此,更易于維護(hù)。當(dāng)開發(fā)人員優(yōu)先考慮簡(jiǎn)潔、富有表現(xiàn)力的代碼以快速交付項(xiàng)目時(shí),通常會(huì)使用聲明式方法。
讓我們將聲明式方法與命令式方法進(jìn)行比較:
命令式:
function evenSum(numbers) { let result = 0; for (let i = 0; i < numbers.length; i++) { let number = numbers[i] if (number % 2 === 0) { result += number; } } return result;}
聲明式:
const evenSum = numbers => numbers .filter(i => i % 2 === 0) .reduce((a, b) => a + b)
服務(wù)器端緩存可用于根據(jù)使用指標(biāo)自動(dòng)擴(kuò)展資源。
緩存并不是什么新鮮事物,可能不被認(rèn)為特別新潮,但由于客戶端和服務(wù)器端 Web 應(yīng)用程序都可以使用緩存,因此它是提高性能的強(qiáng)大工具。特別是,服務(wù)器端緩存可通過(guò)加快數(shù)據(jù)檢索來(lái)提高 Node.js 性能。
我們來(lái)看看內(nèi)存緩存技術(shù)的一個(gè)簡(jiǎn)單示例:
const cache = require('memory-cache'); function getDataFromCache(key) { const cachedData = cache.get(key); if (cachedData) { return cachedData; } // If data is not in cache, fetch it from the source const data = fetchDataFromSource(); // Store data in cache for future use cache.put(key, data, 60000); // Cache for 60 seconds return data;}
服務(wù)器端緩存可以用來(lái)基于使用指標(biāo)自動(dòng)化資源的擴(kuò)展。AWS Lambda、Azure Functions 或 Google Cloud Functions 可以被編程為動(dòng)態(tài)調(diào)整服務(wù),同時(shí)用于 JavaScript 的 AWS SDK 允許您監(jiān)控使用情況、優(yōu)化云成本和自動(dòng)化擴(kuò)展操作,確保您僅為所需的資源付費(fèi)。
不可變性指的是不能改變的東西。在 JavaScript(及其編程語(yǔ)言)中,它指的是一旦設(shè)置后永遠(yuǎn)不會(huì)改變的值。由于應(yīng)用程序不斷地改變和更新,不可變性似乎是不必要的——但事實(shí)并非如此。
這種技術(shù)的好處是能減少調(diào)試,減少意外結(jié)果。
不可修改的數(shù)據(jù)非常重要,因?yàn)樗兄谠鰪?qiáng)代碼庫(kù)的一致性,簡(jiǎn)化狀態(tài)管理。與其修改值,不如創(chuàng)建一個(gè)新值,這樣可提高可預(yù)測(cè)性,進(jìn)而可減少錯(cuò)誤(例如,當(dāng)數(shù)據(jù)結(jié)構(gòu)意外更改時(shí)發(fā)生的錯(cuò)誤)。這會(huì)導(dǎo)致減少調(diào)試以及減少意外結(jié)果。
不可變性用于 name 值的一個(gè)示例:
// Import stylesheetsimport './style.css'; // Write JavaScript code!const appDiv = document.getElementById('app');appDiv.innerHTML = `<h1>Open the console to see results</h1>`; class Person { //_name = "Nee"; //_name = ["Nee", "Ra"]; _name = { first: "Nee", middle: "L" }; get name() { return this._name; } set name(value) { console.log('In setter', value); this._name = value; }} let p = new Person();//p.name = "Ra"; // Setter executes//p.name.push("Lee"); // Setter doesn't execute//p.name = [...p.name, "Lee"]; // Setter executes//p.name.middle = "Lee"; // Setter doesn't executep.name = { ...p.name, middle: "Lee" }; // Setter executes
模式匹配是一種條件分支,可以簡(jiǎn)潔地匹配數(shù)據(jù)結(jié)構(gòu)模式,同時(shí)綁定變量。模式匹配通常用于編寫 XSLT 樣式表來(lái)轉(zhuǎn)換 XML 文檔。
模式匹配比標(biāo)準(zhǔn) switch 語(yǔ)句更有效。
當(dāng)需要針對(duì)任何給定模式測(cè)試值時(shí),模式匹配比標(biāo)準(zhǔn) switch 語(yǔ)句更有效,并且提供了更多的控制,允許開發(fā)人員編寫更復(fù)雜的表達(dá)式。
以下是使用 match 模塊實(shí)現(xiàn)階乘函數(shù)的示例,使用 JU-nify 庫(kù):
match = function () { var unify = unification.unify; function match_aux(patterns, value) { var i, result; for (i = 0; i < patterns.length; i += 1) { result = unify(patterns[i][0], value); if (result) { return patterns[i][1](result); } } return undefined; } return function(patterns, value) { return match_aux(patterns, value); };}(); var fact = function (n) { return match([ [0, function() { return 1; }], [$('n'), function(result) { return result.n * fact(result.n - 1); }] ], n);};
JavaScript 靈活、多功能,并且可以在各種平臺(tái)上部署。使用上述技術(shù)意味著開發(fā)人員可以為其應(yīng)用程序創(chuàng)建功能強(qiáng)大但簡(jiǎn)潔的代碼。
本文鏈接:http://www.www897cc.com/showinfo-26-91029-0.htmlJavaScript的五項(xiàng)前沿技術(shù),你知道嗎?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com