Lerna重新设计简历
正在加载今日诗词....2022-04-04
简历简介
简历中简介部分至关重要,因为它位于简历的第一屏,是面试官最容易关注的部分,所以我们应该在简介部分充分突出我们的个人特长和优势
学完本章后应该怎么改简历?
完全掌握本章内容的同学可以在简历中增加:
- 熟悉Yargs脚手架开发框架
- 熟悉多Package管理工具Lerna的使用方法和实现原理
- 深入理解Node.js模块路径解析流程
面试官问起细节后如何回答?
yargs
- 脚手架构成
- bin:package.json中配置bin属性,npm link 本地安装
- command:命令
- options:参数(boolean/string/number)
- 文件顶部增加
#!/usr/bin/env node
- 脚手架初始化流程
- 构造函数:Yargs()
- 常用方法:
- Yargs.options
- Yargs.option
- Yargs.group
- Yargs.demandCommand
- Yargs.recommendCommands
- Yargs.strict
- Yargs.fail
- Yargs.alias
- Yargs.wrap
- Yargs.epilogue
- 脚手架参数解析方法
- hideBin(process.argv) / Yargs.argv
- Yargs.parse(argv, options)
- 命令注册方法
- Yargs.command(command, describe, builder, handler)
- Yargs.command({ command, describe, builder, handler })
Lerna
- 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 时会自动将该路径替换
Node.js 模块路径解析流程
Node.js 项目模块路径解析是通过
require.resolve方法来实现的require.resolve就是通过Module._resolveFileName方法实现的require.resolve实现原理:
Module._resolveFileName方法核心流程有 3 点:
- 判断是否为内置模块
- 通过
Module._resolveLookupPaths方法生成 node_modules 可能存在的路径 - 通过
Module._findPath查询模块的真实路径
Module._findPath核心流程有 4 点:
- 查询缓存(将 request 和 paths 通过
\x00合并成 cacheKey) - 遍历 paths,将 path 与 request 组成文件路径 basePath
- 如果 basePath 存在则调用
fs.realPathSync获取文件真实路径 - 将文件真实路径缓存到
Module._pathCache(key 就是前面生成的 cacheKey)
- 查询缓存(将 request 和 paths 通过
fs.realPathSync核心流程有 3 点:
查询缓存(缓存的 key 为 p,即
Module._findPath中生成的文件路径)从左往右遍历路径字符串,查询到
/时,拆分路径,判断该路径是否为软链接,如果是软链接则查询真实链接,并生成新路径 p,然后继续往后遍历,这里有 1 个细节需要特别注意:
- 遍历过程中生成的子路径 base 会缓存在 knownHard 和 cache 中,避免重复查询
遍历完成得到模块对应的真实路径,此时会将原始路径 original 作为 key,真实路径作为 value,保存到缓存中
require.resolve.paths等价于Module._resolveLookupPaths,该方法用于获取所有 node_modules 可能存在的路径require.resolve.paths实现原理:
- 如果路径为
/(根目录),直接返回['/node_modules'] - 否则,将路径字符串从后往前遍历,查询到
/时,拆分路径,在后面加上 node_modules,并传入一个 paths 数组,直至查询不到/后返回 paths 数组
- 如果路径为
Copyright © 2022 @filway