【第557期】搭建前端私有npm雜記

前言前端

有必定規模的前端團隊,本文值得一看。當初早讀君看到這個的時候就想起一兩年前給團隊折騰的組件頁面,當時仍是用bower來管理下載組件的,不過期過境遷,如今又有新的方式出來了,私有npm能夠嘗試起來。本文由@呂大豹受權分享其在搭建私有npm的過程。node


正文從這開始~jquery


隨着前端隊伍愈來愈壯大,項目間共享代碼就變得尤其重要。經常使用的框架/類庫不必在每一個項目都放一份,團隊內部產出的公共模塊也須要有合理的共享機制。如今,用npm管理前端代碼已是業界趨勢。樓主嘗試用私有npm+資源管理系統的方式搭建起一套前端資源倉庫,用以在公司內部託管公共代碼,併爲開發環境提供代碼源。本文記錄一下搭建過程,或許能夠給你們作個參考。git

 

總體架構github

搭建私有npm的話實際上是很是簡單的,github上有一個叫作sinopiahttps://github.com/rlidwka/sinopia)的項目,使用至關簡單,無需配置數據庫。用阿里的cnpm也是能夠搭建私有npm的,不過配置稍微麻煩些。鑑於只是beta階段,因此我就先採用簡單的sinopia了。npm有兩個做用:1.託管公共代碼;2.爲開發環境提供代碼源。也就是說在開發環境,只需npm install,相應的代碼就被下載到項目中。固然咱們應該配置ignore,使得node_modules文件夾不被提交到代碼庫。線上的資源都是走cdn的。mongodb


光是私有npm仍是不夠的,考慮到公司不斷有新的前端入職,有些仍是新手,因此有必要爲每一個模塊提供詳細的說明。包括不限於基本信息、使用方法、在線democdn地址等等。使用README.md文件雖然也能描述不少信息,但它只是一個靜態文件,咱們的系統還須要具有發佈到npm、同步到cdn的功能。之後也可能進行功能擴充,好比爲前端工程化提供支持。因此還須要一個資源管理系統,這個系統用於維護公共資源的各類信息。數據庫


因此,這麼考慮下來,咱們的前端資源倉庫應該包含兩部分:資源管理系統、私有npm。各自的功能以下:express

圖片

資源倉庫的維護npm

所謂維護就是把源代碼錄入到資源管理系統、發佈到npm、同步到cdn這一過程。按照npm的規格來組織模塊的目錄結構,但也不徹底一致,由於有些是不須要的。模塊都用UMD格式包裝,這樣不管用加載器仍是直接寫<script>標籤都是可用的。具體格式以下:json

  • 用模塊的名稱命名根目錄

  • 模塊的不一樣版本,新建不一樣的目錄,如jquery/1.8.3/src/jquery.jsjquery/2.1.0/src/jquery.js

  • src目錄,用於放置未壓縮的源碼

  • dist目錄,用於放置壓縮後的代碼

  • 使用package.json文件的規格來描述本模塊


這樣就夠了,系統提供發佈功能,上傳的文件會自動發佈到咱們的npm,而且同步到cdn。至於模塊的使用方法等其餘信息,則須要模塊維護者手動錄入到系統中。這樣,私有npm與這個資源管理系統就沒有任何耦合,未來也好作擴展。流程以下:

圖片

關於cdn的同步,咱們只同步dist目錄下的文件,由於線上只須要壓縮版。至於模塊的打包,不在本系統的職責範圍內,由項目內的構建程序去完成。

 

如何使用

對於使用者,也就是前端同事們,須要作這麼幾件事:

  • 項目中配置好package.jsonnpm install安裝好所需的模塊

  • 從資源管理系統中獲取到各模塊的cdn地址

  • 配置項目中的各模塊地址,開發環境請求本地node_modules下的文件,線上環境請求cdn

  • 使用gulp進行相關的構建,發佈到測試環境/線上環境

圖片

npm install前,須要把倉庫地址指向咱們搭的私有npm,而再也不是npm官方的地址。使用npm set resigtry命令。若是你以爲麻煩,或者須要常常改動地址,github上有一個很方便的registry管理工具,nrm(https://github.com/Pana/nrm),推薦使用。


3步須要作一個說明,由於咱們如今項目不少,各項目的目錄結構也不一致,有的先後端還未分離,因此沒法作到用同一套構建程序搞定全部的項目。配置的方法視項目的狀況而定,能夠依靠後端來動態給require.config賦值,也能夠用gulp來進行編譯,總之能達到在不一樣環境請求不一樣路徑就行。

 

技術細節

sinopia的話照着文檔去安裝就行。由於咱們是安裝在服務器上,因此有兩點配置須要注意:

  • node_modules/sinopia/conf下的default.yaml中,listen: - 0.0.0.0:4873,使得其餘機器能夠訪問到該端口

  • sinopia的存儲目錄下,有一個config.yaml,把proxy: npmjs注掉。咱們公司內部可能只維護幾個特定版本,因此不必和官方倉庫同步。


sinopia有一個機制,當你從私有npm安裝一個模塊時,若是不存在,會從npm官方倉庫拉取,也就是這個proxy配置的地址。咱們注掉後,也就沒法去官方倉庫去拉了,而這正是我須要的。一方面經過一個代理去訪問npm有不穩定的風險,另外一方面,我須要使用者時刻清楚,本身安裝的模塊是哪一個倉庫的。


至於資源管理系統的開發,後端使用nodejsexpressmongodb數據庫,前端使用mvvm框架,還用了一個叫semanticUI框架。基本就是對資源的增刪改查操做,基本也沒什麼難度 。資源包含的字段以下:

圖片

其中,類別暫時分爲三類:

  • 框架/類庫。已經成熟的框架/類庫,基本不會修改其代碼,如jqueryrequirejs

  • 第三方組件。UI組件及功能組件,來自於第三方,不像框架那樣穩定且有長期維護,例如:datepicker、彈框插件

  • 自研模塊。公司內部本身寫的模塊,通用的業務模塊、功能模塊


關於發佈npm。在系統中上傳源碼的zip文件,先進行解壓,而後使用了nodejschild_process模塊用來執行npm install命令,代碼片斷以下:

圖片

至於cdn的同步,請到了咱們運維同窗的幫忙,我只要把文件上傳至相關目錄便可,後面的操做由他來搞~


至此,咱們的前端資源倉庫就搭建起來了,服務器上使用pm2來管理,把sinopia和資源管理系統的server.js起來就能夠了。

圖片

總結

搭建這個項目其實難度並不大,但因爲是抽空閒時間來搞,前先後後花了兩個月時間。主要是花在系統的設計上。目前仍是beta版,陸續會更新內容,先運行起來讓同事們嚐嚐,估計會有大量的建議和問題,後面再作升級吧。

圖片


後語

  • 你所在的團隊如今是用什麼管理來管理前端組件的呢?

  • 你們下載第三方組件的時候,淘寶npm不可錯過。http://npm.taobao.org/

相關文章
相關標籤/搜索