lerna 源码阅读
本地环境搞起来
- 下载源码,安装依赖
- vscode 创建默认 launch.json,添加参数
"args": ["ls"]
F5
运行看下是否打印出东西来- 在入口文件里面打断点尝试调试,如果断点成功,说明环境
OK
技术点整理
file:../abc
方式引入依赖包(优于 link),发布的时候自动替换为正常的版本号1
2
3
4
5
6
7
8{
"dependencies": {
"@lerna/global-options": "file:../global-options",
"dedent": "^0.7.0",
"npmlog": "^4.1.2",
"yargs": "^14.2.2"
}
}- JS事件循环,宏任务,微任务
1
2
3
4
5
6
7
8
9
10
11
12
13console.log(1)
setTimeout(()=>{
console.log('7:最后执行')
},0)
new Promise(()=>{
let chain=Promise.resolve();
chain.then(()=>console.log('3'))
chain.then(()=>console.log('4'))
chain.then(()=>console.log('5'))
})
let chain=Promise.resolve();
chain.then(()=>console.log('6'));
console.log(2) yargs
的使用参考—>cxvh-cli-testclone-deep
深拷贝(lodash
也有深拷贝方法)dedent
去掉反斜杠里面字符串的缩进import-local
本地存在一个脚手架命令,全局也有,优先选用node_modules
里面的!!!pkg-dir
会循环找到项目中package.json
文件path.join('/user','/test','..')
返回/test
path.resolve('/user','/test','..')
返回/
path.resolve('.')
返回当前的完整路径path.parse(path.resolve('.'))
解析路径find-up
的white(true){return 1||null}
方法用return
,否则会死循环locate-path
判断是否存在路径,存在返回第一个路径path-exists
判断路径是否存在(fs.accessSync(fp))
resolve-cwd
从当前工作目录解析模块的路径var a="123\x00321"
则a
为123 321
/(?:^|\/)\.?\.$)/.test(request)
匹配/..
或者/.
结尾的字符串fs.realpathSync(requestPath,{[internalFS.realpathCacheKey]:realpathCache})
返回已解析的路径名Object.create(null)
创建的对象没有原型链'/xxx/yyy'.indexOf('/',1)
跳过第一个开始查找,返回4
Module._nodeModulePaths
生成node_modules
可能的路径,如:['/a/b/c/node_modules','/a/b/node_modules','/a/node_modules'],'/node_modules']
- 判断路径是否为
/
,是返回['node_modules']
,否遍历各级目录,在目录后添加node_modules
,并存储到paths
- 判断路径是否为
Module._resolveFilename_
解析模块的真实路径- 是否为内置模块,是返回,否:
Module.resolveLookupPaths
将paths
和环境变量node_modules
合并,Module.findPath
在paths
中解析模块的真实路径
- 是否为内置模块,是返回,否:
- require()源码解读
fs.lstat(path[, options], callback)
:lstat()
与stat()
相同,只是如果path
是符号链接,则查看的是链接自身,而不是它指向的文件。fs.realpathSync()
查询缓存=>是:直接返回结果,否:
lerna
命令相当于执行node /users/sam/.nvm/versions/node/v12.11.1/lib/node_modules/lerna/cli.js
yargs是如何实现脚手架的?
- 脚手架构成
- bin(主命令):在
package.json
配置,本地安装用npm link
- command:命令
- options:参数(boolean、string、number)
- 文件顶部增加
#!/usr/bin/env node
(告诉操作系统,要在环境变量中查询到node
命令,通过node
命令来执行文件)
- bin(主命令):在
- 脚手架初始化流程
- 构建函数:
Yargs()
- 常用方法(增强脚手架功能):
Yargs.usage
用法说明Yargs.recommendCommands
输入错误会提示相似命令Yargs.demandCommand
限制命令数量Yargs.fail
错误处理Yargs.strict
严格模式Yargs.alias
别名Yargs.wrap
宽度Yargs.epilogue
页脚提示Yargs.options
选项(多个选项传数组)Yargs.options
选项(单个选项,传JSON)Yargs.group
分组
- 构建函数:
- 脚手架参数解析方法(识别命令)
hideBin(process.argv)
/Yargs.argv
Yargs.parse(argv,options)
- 命令注册方法
Lerna
是基于git
+npm
的多package
项目管理工具- 实现原理
- 通过
import-local
优先调用本地lerna
命令 - 通过
Yargs
生成脚手架,先注册全局属性,再注册命令,最后通过parse
方法解析参数 lerna
命令注册时需要传入builder
和handler
两个方法,builder
方法用于注册命令专属的options
,handler
用来处理命令的业务逻辑lerna
通过配置npm
本地依赖的方式来进行本地开发,具体写法是在package.json
的依赖中写入:file:../your/local/module/path
,在lerna publish
时会自动将该路径替换
- 通过
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BARAN的小站🔥🔥🔥!