node 版本选择
结论:选择偶数的 LTS 版本
https://zhuanlan.zhihu.com/p/145243810 (opens in a new tab)
npm & yarn 安装差异
- npm 的由来
- 全称:a Javascript package manager,不要把它作为缩写(不是 Node Package Manager)
- 如果你在创作技术文档的过程中,如果使用到这三个字母,期望也可以使用全小写。
https://segmentfault.com/a/1190000017075256 (opens in a new tab)
看这一篇就大致了解 npm 和 yarn 的区别了,但是这篇文章最后的实验部分做的不太合理
我们重新做一下(npm 6.14.4,yarn 1.22.4)
新建两个文件夹test_yarn
和test_npm
中分别yarn init
,npm init
然后分别
yarn add react-router-native@4.3.0 react-router-dom@4.3.1
npm install -s react-router-native@4.3.0 react-router-dom@4.3.1
查看各自的 node_modules
发现也没差多少。。。。react-router 也都被扁平化提到最上层了。。。
npm 下也没出现嵌套的模块安装
体验总归是趋同的,两者现在完全不差多少,可能只是命令上的差异罢了。。。
也不一定要用 yarn 了
关于 npm 锁的历史:https://zoucz.com/blog/2020/05/31/f23b2980-a30c-11ea-90b5-eb40e9720ed0/ (opens in a new tab)
TODO 问题:这些 lock 文件,设计上有没有什么问题?
Registry
登记处?每个包的发布的所在地,像一个中心一样交给他托管这些包,安装个 nrm 来管理 npm 使用的包“源”
npm -------- https://registry.npmjs.org/
* yarn ------- https://registry.yarnpkg.com/
cnpm ------- http://r.cnpmjs.org/
taobao ----- https://registry.npm.taobao.org/
nj --------- https://registry.nodejitsu.com/
npmMirror -- https://skimdb.npmjs.com/registry/
edunpm ----- http://registry.enpmjs.org/
大概那么多吧
配置
如果你需要发布包到指定的 registry
npm config set registry https://registry.npm.yourcompany.com
lerna
foreword
请阅读https://blog.npmjs.org/post/186494959890/monorepos-and-npm (opens in a new tab)
我们经常会将一整个项目分割为多个小的子模块(module)来管理,这在架构上是非常好的,但是会出现多个子包所导致的四个头疼的事情:
- Discovery:新包的加入,每个人都要在心里记一下。。成百上千个包就比较麻烦了
- Access control:每个仓库会遇到权限问题,新人会遇到依赖循环的问题
- Versioning:版本控制会非常碎片化,并且:asking humans to remember to do this across a large collection of packages (including packages they haven’t had to touch) is asking for trouble.
- Duplication:每个子包(package)的依赖会极大的增加安装的速度(比如在 npm 生态)
Monorepo
单一的 repository。来解决上面多模块所产生的问题。
解决方法就是:将所有的 modules(packages) 都放到一个 repository 中去集中管理
注意的是:单一仓库的权限会让使用者获取到所有的代码
a peek at Lerna
快速入门,lerna (opens in a new tab): A tool for managing JavaScript projects with multiple packages.
全局安装 lerna
npm i -g lerna
创建一个目录作为 monorepo,用 lerna 初始化
lerna init
我们可以看到一个lerna.json
的配置文件
{
"packages": ["packages/*"],
"version": "0.0.0"
}
接着 npm 登陆 registry,如果有 scope 就指定一下,登陆之后 lerna 就会为子包配置publishConfig
npm login –scope test
新增 package
lerna create @test/a
lerna create @test/b
新增的两个子包(npm package)都是版本0.0.0
的
此时需要 git remote add
一下远程仓库,并且 commit 和 push 一下,才能继续进行发版操作
比如升级主版本
lerna version major
发布
lerna publish from-git
详细使用
由于并没有真正用到 lerna 做大项目,只是简单的了解了解
详细用法请看官网 (opens in a new tab)
有谁在用 lerna:
Projects like Babel (opens in a new tab), React (opens in a new tab), Angular (opens in a new tab), Ember (opens in a new tab), Meteor (opens in a new tab), Jest (opens in a new tab), and many others develop all of their packages within a single repository.
官网有个 list
npm
npm 相关指令,特性
指令
npm fund [<pkg>]
retrieves information on how to fund the dependencies of a given project.
查看一个包是如何被 fund 起来的,说人话也就是查看包的依赖树信息和访问这个包的 url,通常都是 github
一些参数可以改变展示的格式
-
--unicode
-
--json
-
--browser
-
which
:参数的 number,如果有多个 funding source 可以指定展示的下标