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','..')返回/testpath.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)跳过第一个开始查找,返回4Module._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.argvYargs.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的小站🔥🔥🔥!





