电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

瀏覽:4日期:2024-07-10 09:18:41

摘要: 在2012年,我加入了Storify并開始使用Node作為我的主要語言。從那以后,我從未回首過去并覺得我錯(cuò)過了Python,Ruby,Java以及PHP,這些在過去10年里,我在web開發(fā)過程中使用的語言。下面我將列出10條建議,這些建議可以幫助你在2017年成為一個(gè)更好的Node開發(fā)者。其中一些建議是我在日常實(shí)踐中所學(xué)到的,另一些是從那些寫了最流行的Node和npm模塊的人們身上學(xué)到的。 下面是我們將要介紹的內(nèi)容:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

在2012年,我加入了Storify并開始使用Node作為我的主要語言。從那以后,我從未回首過去并覺得我錯(cuò)過了Python,Ruby,Java以及PHP,這些在過去10年里,我在web開發(fā)過程中使用的語言。

Storify提供給我一個(gè)很有趣的工作,因?yàn)镾torify和其他的公司不太一樣,Storify之前(可能到現(xiàn)在也是)所有的代碼都是由JavaScript編寫的。而大多數(shù)公司,特別是大公司,例如PayPal,Walmart(沃爾瑪)或者Capital One(第一資本),只是在某一些特定的部分使用了Node。通常,他們使用Node作為API接口或者用在業(yè)務(wù)流程層,這樣做是很好的。但是作為一個(gè)軟件工程師,沒什么比得上能夠完全沉浸在Node環(huán)境里。

下面我將列出10條建議,這些建議可以幫助你在2017年成為一個(gè)更好的Node開發(fā)者。其中一些建議是我在日常實(shí)踐中所學(xué)到的,另一些是從那些寫了最流行的Node和npm模塊的人們身上學(xué)到的。 下面是我們將要介紹的內(nèi)容:

避免復(fù)雜性 — 盡可能將你的代碼塊拆到最小,要小到極致。

使用異步編程 — 像躲避瘟疫般避免使用同步代碼。

避免require阻塞 — 把你所有的require聲明都放在文件的頂部,因?yàn)閞equire是同步的,會阻塞代碼運(yùn)行。

了解require緩存 — 了解它則可以利用它,否則它可能會帶來bug。

始終檢查錯(cuò)誤 — 錯(cuò)誤不是足球,任何時(shí)候都不要拋出錯(cuò)誤或者跳過錯(cuò)誤檢查。

只在同步代碼中使用try…catch — 在異步代碼中try...catch是沒有作用的。V8引擎針對try...catch無法進(jìn)行優(yōu)化。

返回callbacks或者使用if … else — 返回一個(gè)callback只是為了確保不繼續(xù)執(zhí)行。

監(jiān)聽錯(cuò)誤事件 — 幾乎所有的Node的類/對象都有event emitter(觀察者模式)并且會廣播error事件,確保你監(jiān)聽了它們。

了解你的npm — 使用-S或者-D來安裝模塊來代替--save或者--save-dev`。

在package.json中使用精確的版本號 : npm在使用-S來安裝模塊時(shí)會自動(dòng)使用默認(rèn)的版本號,你需要手動(dòng)修改去鎖定版本號。除非是開源模塊,否者不要相信你的項(xiàng)目中的SemVer(語義化版本標(biāo)準(zhǔn))。

加分 — 使用不同的依賴。把項(xiàng)目在開發(fā)階段需要的東西放在 devDependencies 中,記得使用 npm i --production。多余的依賴越多,出現(xiàn)問題的風(fēng)險(xiǎn)就越大。

好的,接下來讓我們一個(gè)個(gè)單獨(dú)地去了解上面的每一點(diǎn)。

避免復(fù)雜性

讓我看一眼npm的創(chuàng)造者Isaac Z. Schlueter寫的一些模塊,例如, use-strict ,這個(gè)模塊是用來在Javascript中強(qiáng)制使用嚴(yán)格模式,這個(gè)模塊僅僅只有三行代碼:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

所以我們?yōu)槭裁匆苊鈴?fù)雜性呢? 一個(gè)起源于美國海軍的著名短語:KEEP IT SIMPLE STUPID(或者是“Keep it simple, stupid”)。這就是原因。事實(shí)說明,人類大腦在任何一個(gè)時(shí)間只能在其工作記憶中保持五到七個(gè)項(xiàng)目。

把你的代碼模塊化成一個(gè)更加小的部分,你和其他的開發(fā)者會更加好的理解它。你也可以更加好的去測試它。如下例子,

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

或者是

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

我相信大多數(shù)人都會喜歡第二個(gè)例子,特別是光看名字就能了解其作用。當(dāng)日,在你編寫代碼的時(shí)候,你可能認(rèn)為你知道代碼是如何運(yùn)行的。甚至你想要展示你把幾個(gè)功能連接在一起寫在同一行中是多么的機(jī)智。但是,這樣你是寫了一段愚蠢的代碼。如果你思考的很復(fù)雜去寫這代碼,那么今后你再去看這段代碼將會很難去理解。保證你的代碼簡單,特別是在Node的異步代碼中。

當(dāng)然也會有 left-pad 事件 ,但是其實(shí)它只是影響了依賴于left-pad模塊的項(xiàng)目而且11分鐘后就發(fā)布了替代品。代碼的最小化帶來的好處超過了它的缺點(diǎn)。npm已經(jīng) 改變了發(fā)布策略 ,任何重要的項(xiàng)目都應(yīng)該使用緩存或私有的源(作為臨時(shí)解決方案)。

使用異步編程

在Node中同步代碼只要很小的一部分。這些代碼大多數(shù)都是用于命令行工具或者其他與web應(yīng)用無關(guān)的腳本。Node開發(fā)者大多數(shù)都是編寫web應(yīng)用,因此使用異步代碼可以避免阻塞現(xiàn)場。

例如,當(dāng)你在編寫一個(gè)數(shù)據(jù)庫的腳本或者是一個(gè)不需要控制并行的任務(wù)時(shí),下面這種寫法可能是可以的:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

但是當(dāng)你創(chuàng)建一個(gè)web應(yīng)用時(shí),下面這個(gè)寫法會更好:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

這個(gè)區(qū)別在于你是否需要編寫一個(gè)并發(fā)(通常是長期運(yùn)行)或者非并發(fā)(短期運(yùn)行)的系統(tǒng)。根據(jù)經(jīng)驗(yàn)來說,總是要在Node中使用異步代碼。

避免require阻塞

Node有一個(gè)使用了CommonJS模塊格式的簡單的模塊加載系統(tǒng)。它是基于require函數(shù),require函數(shù)可以很方便的在不同的文件中引入模塊。和AMD/requirejs不同,Node/CommonJS的模塊加載時(shí)同步的。require的工作方式是:引入一個(gè)模塊或者一個(gè)文件export的內(nèi)容:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

但是大多數(shù)的開發(fā)者并不知道require是會被緩存的。因此,只要解析的文件名(resolved filename)沒有劇烈的變化(比如npm模塊不存在的情況),模塊的代碼只會被執(zhí)行并存入變量中一次(在當(dāng)前進(jìn)程中)。這是一個(gè)很好的優(yōu)化。當(dāng)然,即使有了緩存,你最好還是把你的require聲明寫在開頭。下面這段代碼,它在路由中真正使用到了axios模塊的時(shí)候才加載。當(dāng)請求發(fā)送的時(shí)候/connect會因?yàn)樾枰虞d模塊所以會變得慢。

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

一個(gè)更好,性能更優(yōu)的方式是在服務(wù)定義之前就引入模塊而不是在路由中:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

知道require會被緩存

我在上面一節(jié)已經(jīng)提到了require會被緩存,但是有趣的是我們在module.exports之外也會有代碼。舉例來說:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

從中我們了解到有一些代碼只會運(yùn)行一次,你可以使用這個(gè)特性來優(yōu)化你的代碼。

始終檢查錯(cuò)誤

Node不是Java。在Java中,你可以拋出錯(cuò)誤,因?yàn)槿绻l(fā)生了錯(cuò)誤那么你會希望應(yīng)用不在繼續(xù)執(zhí)行。在Java中,你可以在外層僅僅使用一個(gè)簡單的try...catch就可以處理多個(gè)錯(cuò)誤。

但是在Node中并不是這樣的。自從Node使用了 事件循環(huán) 和異步執(zhí)行后,任何的錯(cuò)誤發(fā)生時(shí)都會與錯(cuò)誤處理器(例如try...catch)的上下文分離,下面這樣做在Node中是沒有用的:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

但是try...catch在同步代碼中是可以被用的。前面的代碼片段可以被更好的重構(gòu)為:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

如果我們無法將request的返回內(nèi)容包裹在try...catch中,那么我們將沒有辦法去處理請求的錯(cuò)誤。Node的開發(fā)者通過在返回的參數(shù)里面加上error來解決了這個(gè)問題。因此,我們需要在每一個(gè)回調(diào)中手動(dòng)去處理錯(cuò)誤。你可以去檢查這些錯(cuò)誤(判斷error不是null),然后展示錯(cuò)誤信息給用戶或者展示在客戶端上并且記錄它, 或者你可以通過調(diào)用 callback ,給它傳 error 參數(shù),將錯(cuò)誤傳回給上一級調(diào)用棧(如果你在調(diào)用棧之上有另一個(gè)回調(diào)函數(shù))。

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

一個(gè)小技巧是你可以使用 okay 庫。你可以像下面的例子一樣使用它去避免在回調(diào)地獄中手動(dòng)去檢查錯(cuò)誤(你好, 回調(diào)地獄 ).

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

返回回調(diào)或者使用if … else

Node是并行的。但是如果你不夠細(xì)心也會因?yàn)檫@個(gè)特性產(chǎn)生bug。 為了安全起見,應(yīng)該要使用return來終止代碼的繼續(xù)執(zhí)行:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

這樣可以避免一些因?yàn)榇a邏輯的處理不當(dāng)導(dǎo)致一些不應(yīng)該執(zhí)行的內(nèi)容(或者錯(cuò)誤)被執(zhí)行。

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

請確保使用return去阻止代碼的繼續(xù)執(zhí)行。

監(jiān)聽 error 事件

Node中幾乎所有的類/對象都有事件分發(fā)器(觀察者模式)并且會廣播 error 事件。 這是一個(gè)很好的特性,可以使開發(fā)者在這些討厭的錯(cuò)誤造成巨大后果之前捕捉到它們。

養(yǎng)成一個(gè)通過.on()來創(chuàng)建error事件監(jiān)聽的好習(xí)慣:

10個(gè)技巧,讓你在 2017 年成為更好的Node開發(fā)者

了解你的npm

很多的Node和前端的開發(fā)者知道在安裝模塊的時(shí)候使用--save會在安裝模塊的同時(shí),會在package.json保存一條含有模塊版本信息的條目。當(dāng)然,還有--save-dev可以用于安裝devDependencies(在生成環(huán)境中不需要的模塊)。但是你知道用-S和-D是否可以代替--save 和--save-dev么?答案是可以的。

當(dāng)你安裝模塊的時(shí)候,你需要?jiǎng)h除-S和-D自動(dòng)為你模塊的版本號添加的^標(biāo)簽。否者當(dāng)你使用npm install(或者npm i)安裝模塊的時(shí)候,就會自動(dòng)拉取最新的鏡像(版本號的第二位數(shù)字)。例如v6.1.0就是v6.2.0的一個(gè)鏡像分支。

npm團(tuán)隊(duì)推薦使用 semver ,但是你最好不要這樣。npm團(tuán)隊(duì)認(rèn)為開源開發(fā)者會遵守semver所以他們在npm安裝時(shí)自動(dòng)加上了^。沒有人可以去保證,所以最好是鎖定你的版本號。更好的辦法是使用 shrinkwrap :npm shrinkwrap會生成一個(gè)包含依賴的具體版本的文件。

來自:http://developer.51cto.com/art/201702/530559.htm

標(biāo)簽: Node
相關(guān)文章:
主站蜘蛛池模板: 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 间甲酚,间甲酚厂家-山东祥东新材料 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 河南15年专业网站建设制作设计,做网站就找郑州启凡网络公司 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 焦作网 WWW.JZRB.COM | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 房间温控器|LonWorks|海思 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 飞象网 - 通信人每天必上的网站| 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 截齿|煤截齿|采煤机截齿|掘进机截齿|旋挖截齿-山东卓力截齿厂家报价 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 |