年后会开发一个颇有挑战性的项目,在这个项目进行以前,须要作一些技术上的前期准备。前端
首当其冲的就是项目的组织和管理。一般,咱们在开发前端项目时都是单个包的,也就是只有一个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