代碼庫:我們一直在使用它們。代碼庫是開發(fā)者把他們會在項(xiàng)目中使用到的代碼打包起來形成的,這總能節(jié)省時間和避免重復(fù)造輪子。擁有一個可重復(fù)使用的包,不管是開源的還是閉源的,總比重復(fù)構(gòu)建一樣特性的包或者從過去的項(xiàng)目中手動復(fù)制粘貼要好。
來自作者的更多文章
Stop Maiming Bodies: The Perils of Pixel Font-Size
ES2016: Should the Future of JavaScript Be Developer-Driven?
除了被打包的代碼,還可以更精確的形容代碼庫嗎?除了少數(shù)的例外,代碼庫通常只是一個文件,或者是在同一個文件夾里的幾個文件。它的代碼應(yīng)該可以單獨(dú)保存和在你的項(xiàng)目中正常使用。庫文件允許你根據(jù)項(xiàng)目的不同來調(diào)整結(jié)構(gòu)或者行為。想象一下只能通過USB接口進(jìn)行通訊的USB設(shè)備。一些設(shè)備,例如鼠標(biāo)和鍵盤,可以通過設(shè)備提供的接口來進(jìn)行配置。
在這篇文章,我會解釋如何構(gòu)建庫文件。盡管大部分的方法可以應(yīng)用到其他語言,但這篇文章主要講述的是構(gòu)建JavaScript庫文件。
##為什么構(gòu)建你自己的Javascript庫?
首先和最重要的,庫文件可以讓現(xiàn)有的代碼方便的重復(fù)利用。你不需要挖出陳舊的項(xiàng)目來復(fù)制文件,只需要引入庫文件。這也可以讓你的應(yīng)用組件化,讓應(yīng)用的代碼庫更小更易維護(hù)。

Christ Church Library ( source )
任何可以讓實(shí)現(xiàn)一個具體的功能更容易或者可以被重復(fù)利用的抽象的代碼,都可以被打包進(jìn)去庫文件。jQuery是一個有趣的例子。盡管jQuery的API有大量的簡化的DOM API,在跨瀏覽器DOM操作比較困難的過去有著相當(dāng)重要的意義。
如果一個開源項(xiàng)目變得流行并且讓許多開發(fā)者使用它,人們很有可能通過提出問題或者貢獻(xiàn)代碼來參加它的開發(fā)。不管怎樣,都對庫和依賴它的項(xiàng)目有所幫助。
一個流行的開源庫也會帶來很好的機(jī)會。公司可能會對你的工作質(zhì)量表示認(rèn)可并給你發(fā)offer??赡芄緯竽惆涯愕捻?xiàng)目整合進(jìn)他們的應(yīng)用。畢竟,沒人可以比你更了解你的項(xiàng)目。
當(dāng)然它可能只是一個習(xí)慣——享受敲碼,幫助他人并在這個過程中學(xué)習(xí)和成長。你可以提升你的極限和嘗試新的東西。
##范圍和目標(biāo)
在寫下第一行代碼之前,你需要確定你的庫的功能——你需要設(shè)置一個目標(biāo)。通過這個目標(biāo),你可以專注于你想利用這個庫來解決的問題。要牢記你的代碼庫的原本的形式在解決問題上要更容易使用和記憶。API越簡單,使用者學(xué)習(xí)你的代碼庫就更容易。引入一個Unix的設(shè)計哲學(xué):
只做一件事情并把它做好
問下你自己:你的代碼庫解決了什么問題?你打算怎么取解決它?你將會一個人完成全部工作,還是引入別人的代碼庫?
不管代碼庫體積有多大,嘗試制作一個路線圖。列出你想要的每一個特性,并將它們盡可能的打散,知道你有一個小巧但是能解決問題的代碼庫,就像 minimum viable product 。這會成為你的第一個版本。從這里開始,你可以在每一個新特性建立里程碑。從本質(zhì)上來說,你把你的項(xiàng)目變成了比特級的代碼塊,讓每一個特性完成的更好和更有趣。相信我,這會讓你保持狀態(tài)良好。
##API設(shè)計
在我看來,我想以使用者的角度來開發(fā)我的代碼庫。你可以稱呼它為以用戶為中心的設(shè)計。在本質(zhì)上,你正在創(chuàng)造你的代碼庫的大綱,給予它更多的思考和讓選擇它的人使用起來更方便。在同時,你需要思考在什么地方需要可以定制,這會在這篇文章的后面討論。
終極的API測試是嘗試一下自己的技術(shù),在你的項(xiàng)目使用你的代碼庫。試著用你的代碼庫替換之前的代碼,看它是否滿足了你想要的特性。試著讓你的代碼庫盡可能的直觀,讓它可以更靈活的在邊界條件下使用,還有定制化(在之后的文章會講述)。
這是一個關(guān)于用戶代理字符串的代碼庫的大綱的可能會有樣子:
// Start with empty UserAgent string
var userAgent = new UserAgent;
// Create and add first product: EvilCorpBrowser/1.2 (X11; Linux; en-us)
var application = new UserAgent.Product('EvilCorpBrowser', '1.2');
application.setComment('X11', 'Linux', 'en-us');
userAgent.addProduct(application);