年後會開發一個頗有挑戰性的項目,在這個項目進行以前,須要作一些技術上的前期準備。前端
首當其衝的就是項目的組織和管理。一般,咱們在開發前端項目時都是單個包的,也就是隻有一個package.json文件以及一個node_modules文件夾。單個包項目的優勢不言而喻,簡單,可靠,便於管理。可是,當一個大的項目庫代碼量劇增以後,管理起來就是一件比較麻煩的事情,爲了方便代碼的共享,就須要將代碼庫拆分紅獨立的包。Lerna即是優化和管理JS多包項目的利器。node
lerna的項目結構長這樣:react
multi-packages/ package.json packages/ package-1/ package.json package-2/ package.json
packages文件夾就是用來承載多個項目的目錄。git
lerna項目中最經常使用到的命令是lerna bootstrap和lerna publish。lerna bootstrap用於爲全部項目安裝依賴,相似於npm i/yarn ; lerna publish用於提交對項目的更新。基於以上兩點,須要在項目中使用npm和git。github
爲了使用lerna,須要全局安裝lerna:npm
npm i -g lerna
或json
yarn global add lerna
lerna安裝完成以後,就須要使用lerna 初始化項目,使用(在使用該命令前,應該已經使用git init初始化過該項目):bootstrap
lerna init
這個時候lerna會在自動項目下生成packages文件夾和lerna.json文件,並在package.json文件中的devDependencies字段中生成lerna對應的依賴信息。babel
使用lerna管理項目時,能夠選擇兩種模式。默認的爲固定模式(Fixed mode),當使用lerna init命令初始化項目時,就默認爲固定模式,也可使用 lerna init --independent 命令初始化項目,這個時候就爲獨立模式(Independent mode)。固定模式中,packages下的全部包共用一個版本號(version),會自動將全部的包綁定到一個版本號上(該版本號也就是lerna.json中的version字段),因此任意一個包發生了更新,這個共用的版本號就會發生改變。而獨立模式容許每個包有一個獨立的版本號,在使用lerna publish命令時,能夠爲每一個包單獨制定具體的操做,同時能夠只更新某一個包的版本號。優化
而後這裏介紹一下lerna add 命令,其命令簽名是:
lerna add <package>[@version] [--dev]
該命令用於爲packages文件夾下的package安裝依賴。該命令有許多的用法,一般說來有以下幾種,仍是之前面的文件夾爲例,其目錄結構以下:
multi-packages/ package.json packages/ package-1/ package.json package-2/ package.json
- lerna add babel , 該命令會在package-1和package-2下安裝babel
- lerna add react --scope=package-1 ,該命令會在package-1下安裝react
- lerna add package-2 --scope=package-1,該命令會在package-1下安裝package-2
從上面的三個實例看出,使用lerna add 能夠指定爲某一個或全部的包安裝依賴,依賴能夠爲外部(經過npm install的方式),也能夠爲內部(即packages文件夾下的包),同時當指定的內部依賴版本號跟目標版本號不匹配時,將使用npm install的方式來安裝外部依賴。
而後就是最重要的lerna publish了,用於發佈更新,運行該命令會執行以下的步驟:
- 運行lerna updated來決定哪個包須要被publish
- 若是有必要,將會更新lerna.json中的version
- 將全部更新過的的包中的package.json的version字段更新
- 將全部更新過的包中的依賴更新
- 爲新版本建立一個git commit或tag
- 將包publish到npm上
同時,該命令也有許多的參數,例如--skip-git 將不會建立git commit或tag,--skip-npm將不會把包publish到npm上。
lerna updated/lerna diff 對包是否發生過變動
lerna ls,顯示packages下的各個package的version
lerna clean 清理node_modules
lerna run 運行npm script,能夠指定具體的package