從零做一個前端開源項目
來自專欄 猿論
前言
每個程序員都應該有自己的 github 賬號,並貢獻自己的代碼
本文將像您介紹,如何從零做一個前端的開源項目。如果您對 github 和開源不熟悉,又想開始自己的開源項目,可以通過閱讀本文來入門。
另外,本文將會錄製成免費的視頻教程,文中如果有寫的不詳細的,視頻中肯定會詳細講解。待錄製完之後,我會把鏈接貼在這裡。
目錄
由於本文內容較多,先列一下目錄供參考。
- 什麼是開源?
- 為何做開源?
- 做什麼?
- 註冊賬號
- 搭建開發環境
- 提交代碼
- 創建官網
- 如何宣傳?
- 持續迭代
- 總結
什麼是開源?
您可能有很多次打開 github 去查閱下載一些項目的源碼,但是您有沒有總結過,開源項目到底是什麼?
我與開源
我是開源編輯器 wangEditor 的作者(歡迎去 star),這個項目已經做了有近 4 年了,目前積累了 4.5k star(現在是 2018.5)。4 年時間,我一直未間斷維護升級,其中還經歷了 2 次大型的重構,積累了一些經驗和教訓。接下來我將根據自己的經歷,來為大家分析開源。
開源項目包含什麼
開源軟體並不是只是一堆源代碼,如果你仔細分析或者有親身體會的話,包含內容還是比較多的。我總結了以下內容:
- 源碼
- 文檔,如二次開發文檔和用戶使用文檔
- 開發環境,告訴二次開發者如何搭建和運行代碼
- 允許他人貢獻代碼,而不是僅僅給別人閱讀源碼的許可權
- 問題,用戶提問,維護者答覆,問題共享(而不是私聊)
- 問題列表和升級計劃,記錄當前問題,以及何時解決、何時升級
其他配套設施
要做成一個成熟靠譜的開源軟體產品,除了以上源碼相關的方面,還需要以下配套的設施,才能完備。
- 官網,如 wangEditor 官網
- 文檔,可以和官網整合在一起
- 問答社區,wangEditor 的問題社區就用了 github issue
- 及時交流社區,即 QQ 群、微信群
為何做開源?
做開源不掙錢,這是確定的,但是為何要做開源,而且那麼多人堅持做開源呢 —— 他們不是完全為了興趣愛好,完全下班沒事兒干。人只要付出勞動、付出努力,都是奔著目的性去的,有興趣的原因,但是能讓自己持之以恆做下去的,肯定不是興趣。
其實這個問題很簡單,就像看書不掙錢(買書還花錢呢),但是為何要看書呢?因為大家都知道看書能提高自己的知識面和能力。而做開源也有相似的想過,只不過很多人沒接觸過不知道而已。我總結了如下幾個理由:
- 全面提高編程能力。 你需要從 0 打造,每部分代碼都需要自己負責,不像在公司中的一顆螺絲釘。
- 提高自己的社區知名度。 github 上的 star 能間接的反應你的身價,它能讓你得到業內認可。業內同行認可了,做啥事兒都好做,如內推工作。
- 鍛煉自己的產品意識。 因為做開源做的是產品,不再是單純的技術活,UI、運維、推廣、收集反饋、甚至成本預算,你都得考慮。
- 技術范兒、極客精神。 作為一名程序猿,能業餘打造一款開源產品是一件很帥的事情,滿足自己的虛榮心。
有了充分的理由,那就開干!
做什麼?
邁出第一步
這是做開源要想到的第一件事情,很多想做開源的同學,到這一步就想不下去了。還有同學,一上來就定位太高,做著做著發現根本做不出來,就提前放棄。做什麼,看似簡單的問題,但是很重要的一步。
不做什麼
一些早期就知名的開源作品,很多都是因為作者在工作中遇到一個需求,而這個需求目前還沒有開源產品去滿足,因此自己做一個。但是對於我們大眾基層程序猿,天天寫業務代碼,重複勞動,你遇到這種需求的概率不是特別大。因此,這個方面就不在繼續往下討論了。
想要知道做什麼,你就得先明白你做開源的一些期望,然後再去想做什麼。我總結了兩點:
- 要快速做出第一版,至少能用。後面再慢慢迭代升級。
- 要能方便的推廣使用,最好是 0 成本使用。
即做出來,推出去,要快。即,你做的快,別人用的也快。按照這種期望往下想,首先你能排除不做什麼:
- 大型的框架,如做一個 UI 框架。 短期做不完,使用成本高
- 模擬成熟輪子,如在造一個 jQuery 。 有成熟方案,用戶不會換
- 小眾的東西。 基本沒人用
- 沒有特色,100% 的模仿。 用戶沒有更換的理由
做什麼
排除以上這些,還剩下的範圍就不做了,我推薦做開源產品的方向:
- 小而精的工具。 開發快,使用成本低。
- 要有特色,哪怕是一個。 要和別人不一樣,差異化競爭。
- 一定要大眾,50% 以上的開發人員都會用到
- 避開已經被成熟產品壟斷的領域。 你就不要去跟 jQuery vue React 競爭了。
例如,前幾天 is-odd 在知乎鬧的沸沸揚揚,這個庫就是判斷奇數偶數,只不過考慮了各種數據類型的轉換。但是你看它的 weekly downloads 數量多大。
下面列舉幾個我認為比較合適做開源的例子:
- cache 工具(緩存工具,整合 localStorage,以及合理的內存銷毀機制)
- query2json,解析 url 參數為 json 格式
- 移動端列印 console.log ,方便移動端輸出內容
其他符合上述條件的,根據自己當前的情況,大家可以自由發揮。最後,選擇哪個不重要,重要的是你選擇出來了。因此,如果你實在沒有合適的選擇,不如就從我舉例中選擇一個,抓鬮也行。選擇出來,你就可以繼續往下做了,否則你一直都在糾結。
本文將做什麼
好了,本教程就確定要做一個 cache 工具,取一個性的名字,不和現有的重複(是否重複,去 github 一搜便知),叫做fast-cache
。
註冊賬號
注意,你如果現在已經有了 github 賬號,也不好忽略這一章的內容,很重要!
你一旦註冊一個 github 賬號並且去做開源產品,那你就要作為一個個人品牌持續運營下去,不能隨便改名字。因此註冊賬號時一定要慎重考慮,不能隨便弄一個,做一段時間又想改。
組織還是項目
首先,你要明確你即將註冊的賬號是專門針對一個產品(即項目賬號)還是將運維多個產品(即組織賬號)?
例如,facebook 就是 github 中的組織賬號,其下有很多開源產品,如 react 和 hhvm 等。而 rollup 就是 github 中的項目賬號,其下就一個項目 rollup ,其他的項目都是一些附件插件。
對於我們個人開發者,我推薦註冊項目賬號,即以你項目的名稱取個賬號的名字。這樣還有一個好處,就是後面講到官網的時候,你可以用更短、更好記的官網地址。例如,如果不自己申請域名、假設伺服器(即不花一分錢)的情況下,以上例子中他們的官網有區別。
- rollup 的官網地址將是
rollup.github.io
,很短; - react 的官網地址只能是
facebook.github.io/react
,多了一級目錄;(注意是不申請域名、不花錢的情況下)
最後,我選擇項目賬號,因此我需要註冊的賬號是 fast-cache
。
註冊賬號
我們分別要去 github 和 npm 註冊以 fast-cache
為用戶名的賬號,註冊過程就不寫了,都是傻瓜式操作。需要注意的是,如果被牆,自己想法辦科學上網。
創建項目
登錄 github ,點擊右上角的「+」可看到新建項目的鏈接,或者直接訪問 https://github.com/new
。創建項目如下圖所示,注意圖中紅框部分。
創建完成之後,通過 https://github.com/fast-cache/fast-cache
即可訪問到項目的主頁,這是你就已經有了自己的開源項目了。
添加 ssh key
ssh key
就是連接你的電腦和 github 伺服器的一把鑰匙,只有添加成功了才能把你本地的代碼提交到 github 伺服器。
如果你是 mac os 系統,運行 ssh-keygen
即可一步一步生成 ssh key ,然後運行 pbcopy < ~/.ssh/id_rsa.pub
即可拷貝下來,等著粘貼。windows 系統用戶,自己百度搜索 github ssh key
即可找到相關介紹文章,跟著做就行了。
在 github 個人中心的設置界面,能找到 SSH and GPS keys
菜單欄,或者直接訪問 https://github.com/settings/keys
。頁面中點擊右側「new ssh key」按鈕即可添加 ssh key ,把剛才的內容粘貼過來添加上就行了。
下載代碼
進入 github 項目主頁,複製 git 地址(注意選擇 use ssh
,不要 use https
),如下圖
複製下來的內容應該是 git@github.com:fast-cache/fast-cache.git
,然後你選擇一個合適的文件夾或目錄,執行下載命令。
git clone git@github.com:fast-cache/fast-cache.git
下載完畢,進入代碼目錄,運行如下命令修改當前 git 的用戶名和郵箱,改成和當前 github 用戶名和註冊郵箱一致。
cd fast-cachegit config user.name fast-cachegit config user.email fast-cache@github.com
最後,隨便修改一下 README.md
文件的內容,然後提交,看能否成功?成功了就說明剛才的ssh key
生效了。
git add .git commit -m "first update"git push origin master
搭建開發環境
初始化
進入項目目錄,然後命令行運行 npm init
,按照提示進行初始化即可。提示中的信息,能寫的都寫上,別隨意忽略了。初始化完成之後,項目根目錄下會有 package.json
的文件。
規範版本號
打開 package.json
文件,將版本號定義為 "version": "0.0.1"
。以後我們每次正式提交代碼,版本號都不一樣。版本號分三級,分別為:
- 一級,重構版本
- 二級,重大功能改進
- 三級,小升級或者 bug 修復
為何從 0.0.1
開始?因為 0.x.x
可以認為是非正式版本、測試版,而從 1.x.x
開始,就是正式發布的版本了。
規範一級目錄
項目的一級目錄要提前規範好,最起碼一些常用的目錄要提前訂好留用,不能亂來。例如:
src
- 源代碼release
- 發布結果test
- 單元測試用例doc
- 文檔example
- 示例
構建工具
這部分比較獨立,內容也比較多,就不詳細講了,用最常用的 webpack 做一個簡單演示吧。
安裝插件 npm i babel-core babel-loader babel-polyfill babel-preset-es2015 babel-preset-latest webpack webpack-cli --save-dev
。
項目根目錄下創建 .babelrc
文件,內容如
{ "presets": ["es2015", "latest"], "plugins": []}
項目根目錄下創建 webpack.config.js
文件,內容如
module.exports = { entry: ./src/index.js, output: { path: __dirname, filename: ./release/bundle.js }, module: { rules: [{ test: /.js?$/, exclude: /(node_modules)/, loader: babel-loader }] }}
最後,修改 package.json
中的 scripts
,增加 "release": "webpack"
。然後命令行運行 npm run release
,就可生成 release 的內容。
運行示例
release 的內容已經發布出來了,還要運行起來,最簡單的方式,在example
創建test.html
,然後引用 release 的內容。
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>example</title></head><body> <p>example</p> <script src="../release/bundle.js"></script></body></html>
為何規範化運行,可以修改 package.json
中的 scripts
,增加 "example": "http-server -p 8880"
。然後命令行運行 npm run example
,瀏覽器訪問 http://localhost:8880/example/test.html
。
規範 git 分支
至少要存在兩個分支,master
和 dev
, dev
是開發中的代碼。當然,你可以規範更多的分支,例如 next
fix-bug
等,但是注意一個原則 —— 用不到的就先不要規劃。
完善 README.md
README.md
是開源項目的一張臉,用戶的第一印象。必須包含以下內容:
- 產品簡介(此處要突出特點,打差異化競爭)
- 產品安裝和下載
- 快速使用(詳細的使用文檔或者二次開發文檔,外鏈即可)
- 交流提問區
- 關於作者(放你的博客鏈接,和收款二維碼)
最後,把以上完成的工作,都提交到 github 中。
提交代碼
寫代碼
具體寫什麼代碼不是本文的重點,你盡情的根據自己的項目來寫自己的代碼就是了。記得一定要使用編碼規範的工具,例如 es-lint
等,否則經過長時間的維護,必然留坑。
寫文檔 & 寫測試用例
注意,文檔和測試用例對於一個開源產品來說非常重要!非常重要!非常重要!而且,文檔和測試用例本身就是代碼不可分割的一部分。
如何寫測試用例,需要用到其他工具,內容也相對獨立,這裡就不介紹了,自己去查一查吧。再次強調,測試用例很重要!!!
在寫文檔之前,還需要準備其他的工具。定位到項目目錄下,npm i gitbook-cli -g
安裝 gitbook ,然後創建 SUMMARY.md
,內容如下:
# Summary* [項目介紹](README.md)* [使用文檔](doc/use/README.md) * [使用1](doc/use/use1.md) * [使用2](doc/use/use2.md)* [二次開發](doc/dev/README.md) * [開發1](doc/dev/dev1.md) * [開發2](doc/dev/dev2.md)
其實一看這個文件內容就知道,這是一個文檔的目錄,你可以根據自己項目的需要重新定義這個目錄。需要注意的是,第一行 * [項目介紹](README.md)
對應的是已經存在的 README.md
文件。
運行 gitbook init
,會看到各個文件都被創建了,就可以完善各個文檔的內容。內容完成之後,運行 gitbook build
可以將 md 文件發布為 html 文件,默認放在 _book
文件夾。啟動了 npm run example
之後,可以訪問 http://127.0.0.1:8880/_book/
查看效果。
最後,再次修改一下 README.md
,把文檔的鏈接加上
[如何使用](./doc/use/README.md) [二次開發](./doc/dev/README.md)
提交第一版代碼
首先,修改一下 .gitignore
文件,加上一行 _book
,把打包出來的文件忽略掉。然後用之前的方式提交到 github 的 master 分支,這裡不再贅述了。
接下來,創建 tag 並提交,代碼如下:
git tag -a v0.0.1 -m first commitgit push origin v0.0.1
提交之後,下載地址就有了 , https://github.com/fast-cache/fast-cache/releases
這裡可以下載到各個版本的源碼。
最後要提交到 npm 上,能讓使用者通過 npm 進行安裝。首先,運行 npm add user
和 npm login
來登錄,根據提示將你之前註冊 npm 時的賬號、密碼、郵箱寫上就行了,問題不大。然後,在項目的根目錄運行 npm publish .
,此時問題來了!!!
運行之後報了 403
錯誤,剛才明明登錄成功了,不可能有許可權問題呀。後來一查才知道,原來 fast-cache
在 npm 中和其他項目重名了!!!沒辦法,只能改名,將 package.json
中的名稱改為 fast-cache-npm
,然後再發布就成功了。
發布之後,通過 https://www.npmjs.com/package/fast-cache-npm
就可以訪問 npm 項目主頁了。
注意,為項目取名時,一定要提前把名字在 github 和 npm 搜索一下,確認沒有重名才行!!!
升級代碼並提交
上述是第一次提交代碼的流程,下面簡述一下升級代碼之後的提交流程。在代碼開發階段的步驟總結如下:
- 來一個
dev
分支,不要在master
分支開發 - 修改
package.json
版本號,按照之前既定的版本規則修改,不能亂改 - 修改代碼、文檔和測試用例
- 自測
- 將
dev
分支提交到遠程
代碼開發完成之後,提交的流程如下:
- 再次確認版本號,因為版本號非常重要
- 將
dev
合併到master
,並提交master
到遠程 - 創建 tag 並提交到遠程
- 提交到 npm
合併 pr
pr 即 Pull Request 的簡稱。
開源軟體最大的特色就是允許全世界的開發者都能為其貢獻代碼,你這個開源項目也不例外。其他人很有可能會通過 github 的 pr 為你的項目貢獻自己的代碼,到時候你既得欣然接受,又不能茫然接受。
其他人貢獻的 pr 可以通過 https://github.com/fast-cache/fast-cache/pulls
鏈接看到。對於每一個 pr ,如果你想合併,直接 merge 就好了(合併完之後,本地代碼要隨時更新一下);如果你不想合併,留言說明然後關閉掉即可。
創建官網
我們通過 github pages 的機制即可免費創建項目的掛網,不用花一分錢。
創建項目
登錄 github ,創建一個名為 fast-cache.github.io
的項目,名字必須是這一個!!!然後下載到本地,即 git clone xxxx
。然後,進入項目目錄,新建一個 index.html
,然後隨便寫點什麼,例如 <h1>hello world</h1>
,提交到 github 遠程。
最後,訪問 fast-cache.github.io
,你就能看到剛才的內容了,最簡單的官網就這麼出來了。做到這裡,你應該知道 github pages 就是一個靜態頁面的伺服器,上傳相應的 html 就能顯示。
生成官網
此前用 gitbook 將文檔生成為 html 了,應該還記得。那麼我們現在重新運行 gitbook build
生成 html ,然後將所有的 html 拷貝到這裡來,全部提交上去,正式的官網也就出來了。
更新 README.md
記得要修改 README.md
,把官網的地址加進去。
如何宣傳
「酒香不怕巷子深」這句話在當代並不適用,特別是互聯網中。我在 N 年前看過一本創業公司老闆寫的研發項目管理方面的書,到現在就記住一句話 —— 「一個公司的核心競爭力,一是技術,二是營銷」。因此,雖然是一個簡單的開源項目,宣傳也是必須必要的。
宣傳和更新維護都是一個漫長的過程,作為屌絲賬戶的我們(不是 google facebook 等明星賬戶),能做的只能是堅持。
寫博客
首先,要圍繞著你做的產品功能來寫博客。例如針對 fast-cache
,我們可以寫類似這樣的博客。分體分兩類,第一類是相關的技術乾貨文章,第二類是產品介紹,應該以第一類為主。
- 總結如何做前端緩存
- 前端緩存的坑
- 預防前端內存泄露
- 前端緩存插件
fast-cache
使用總結 fast-cache
開發半年記- ……
其次,要正確選擇發表的網站,我的建議是這樣的:
- 選擇一個地方作為你博客的唯一主頁,例如 github ,像創建官網一樣創建個人博客網站。
- 博客貼到各大博客網站,如掘金、知乎專欄、博客園。選擇三個流量較大的即可,不用到處亂貼。
- 博客內容要寫明白原文的鏈接,並寫明產權。
- 最好能找到一些媒體(如 InfoQ)或者大牛公眾號幫你轉發。
回答相關問題
去知乎、sf.gg 甚至是 stackoverflow 上面去搜索、關注與你產品相關的問題,積极參与回答。回答問題也有技巧:
- 字數只能多不能少。最好圖文並茂,還能講個笑話
- 回答要專業,經過親自測試,不要想當然的瞎猜
- 回答問題的最後,順便推廣自己的產品
口碑宣傳
所謂口碑宣傳就是讓用戶資源的幫助宣傳,那就需要把產品做好,那如何做「好」呢?
- 明確產品定位,有特色。做「T」型產品,差異化競爭。把一方面做好就行了,所有都做好不可能。
- 及時回復問題,定期更新升級,做好升級計劃,讓用戶看到產品在不管進步和變化。
持續迭代
主要來探討一下如何有效率的持續迭代,再不影響工作、生活的情況下。
統一問題收集區
這一點非常重要!!! 因為:
- 你沒有那麼多精力去很多個平台回復問題
- 你沒有那麼多時間天天盯著 QQ 群解答問題
- 問題應該被集中起來,供使用者反覆查閱
例如 wangEditor 的問題收集區主要集中在 github issue 列表,其他的地方的提問直接忽略。還有一點要特別注意,問題應該本分享,而不是私聊,因此如下提問方式直接忽略:
- QQ 群提問和 QQ 私聊提問(或微信)
- 私信提問
- 郵件提問
回顧我前幾年剛做開源的經歷,一開始你和使用者都會非常不習慣這種方式,特別是那些討厭的伸手黨。剛開始進來的用戶直接 QQ 私聊或者群里 @ 你,讓你做他們的技術客服,隨叫隨到,這種人你一定要堅持不理會,然後引導他們去 github 提交 issue 。慢慢的,你的社區和 QQ 群人多了,大家都知道這個套路,再有新人進來會自動被引導到 github 中提交 issue 。
定期答覆和升級
讓別人自願、積極的去提交 issue 的前提是你能及時的答覆。根據我的經驗,給你以下建議:
- 定期回復 每天(下班或者上班之前)看看 github issues 然後先答覆,臨時無法搞清楚的就回復「周末時看下再答覆」。這樣每天大約花費 5-15 分鐘即可,出去抽根煙的功夫。最後,需要修改的問題,先記錄下。
- 定期升級 每周拿出 2 個小時(隨便一個晚上或者周末時間)把記錄下的問題,按照優先順序高低順序修復。就 2 小時,改多少算多少,改不完下周再說。改完的問題要及時回復 issue 並 close 。每周 2 小時,對你這周的工作生活應該不會受到影響。
學會拒絕
當用戶慢慢增多,用戶會提出各種看似奇葩的需求,以滿足他們自己的使用需要。此時就需要你來分辨該需求是否應該被添加。我總結了以下判斷標準:
- 很多用戶都提過這個需求,即大眾需求
- 你自己判斷這個需求對大部分用戶都有用
- 該需求符合產品定位以及產品發展的方向
- 該需求能抹平和競品的差距,或者能和競品差異化競爭
符合以上要求的,可以加入升級計劃。不符合要求的,你一定要無情拒絕,此時不要做好人。
持之以恆
雖然每天十幾分鐘、每周兩小時看似不佔用太多時間,但是你要持之以恆的堅持一年、兩年、三年,你能做到嗎?
你做任何什麼事情,沒點持之以恆的態度,都做不成功。
總結
回顧一下本課程的重點內容:
- 做開源的意義。不是套話,你意識不到,肯定就做不下去;
- 開源項目是什麼。不僅僅是源碼。
- 做什麼。小而精,不要大而全。
- 怎麼做?
- 宣傳和持續迭代
作者:雙越
鏈接:https://www.imooc.com/article/28240
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀:
打造個人品牌 so easy !_慕課手記
有獎徵文003期|程序員進階路上,哪本書你認為很不錯,對你幫助很大?
HBase 2.0 你應該了解的新特性
重構 - 設計API的擴展機制
我的微信智障助手的設計思路
推薦閱讀:
※如何學好c語言?
※Leetcodes Solutions 9 Palindrome Number
※機床為什麼要釋放應力?
※大佬,我代碼哪錯了?
※面向項目學習編程--之前的廢話