yargs常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

const yargs = require('yargs/yargs')
// 页脚格式化插件
const dedent = require('dedent')
const pkg = require('../package.json')

const cli = yargs()
const argv = process.argv.slice(2)

const context = {
cliVersion: pkg.version
}

cli
.usage('Usage:lio-imooc-test [command] <options>')
.demandCommand(1, 'A command is required. Pass --help to see all available commands and options.最少要输入一个参数')// 最少要输入一个参数
.strict()
.recommendCommands()
.fail((err, msg) => {
console.log('err =======>', err)
console.log('msg =======>', msg)
})
.alias('h', 'help')
.alias('v', 'version')
.wrap(cli.terminalWidth())// 显示的宽度(撑满全屏)
.epilogue(dedent` hello
world`)// 去除缩进
.options({// 对所有的command添加的options都有效
debug: {// 添加debug命令
type: 'boolean',
describe: 'Bootstrap debug mode',
alias: 'd'
}
})
.option('ci', {
type: 'string',
describe: 'Define global registry',
alias: 'r'
})
.group(['debug'], 'Dev Options:')// 把debug添加到Dev Options中
.group(['registry'], 'Extra Options:')
.command('init [name]', 'Do init a project', (yargs) => {
yargs
.option('name', {
type: 'string',
describe: 'Name of a project',
alias: 'n'
})
}, (argv) => {
console.log(argv)
})
.command({
command: 'list',
aliases: ['ls', 'la', 'll'],
describe: 'List local packages',
builder: (yargs) => {

},
handler: (argv) => { }
})
.parse(argv, context)// 将默认参数与配置参数合并

lerna源码学习

node原生方法和属性

  • fs.statSync / fs.lstatSync
  • fs.accessSync(path)
  • fs.realpathSync() // 根据相对路径,返回绝对路径(如果是软链接,会一直寻到最终路径)
  • fs.toRealPath() // 调用生成真实路径,判断是否存在
  • Module._nodeModulePaths(path) // 返回path各层级的node_modules路径数组
  • Module._resolveFilename(filename) // 返回文件的真实路径
  • NativeModule.canBeRequiredByUsers(request) // 是否是内置模块
  • Module._resolveLookupPaths(request, parent) // 返回一个数组,当前模块可能存在的所有路径,将当前模块文件路径各层级的node_modules目录数组和node环境变量中的node_modules数组合并,这是一个有顺序的数组,离path最近的一层目录为首位
  • process.cwd() // 当前进程运行目录

第三方

  • import-local //查询是否是本地的包
  • pkg-dir // 查找当前文件或者目录层级最近的package.json
  • find-up
  • path-exists
  • locate-path
  • resolve-cwd

lerna用法

lerna安装及项目初始化

lerna是各大开源项目常用的npm项目包管理工具,非常值得研究和学习。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

cnpm i -g lerna

# 项目初始化,记得添加.gitignore
lerna init

# 创建package包
lerna create utils

# 为包添加依赖
lerna add lodash

# 为 package/core/ 添加 vue 依赖
lerna add vue package/core/

# 清空所有包的依赖
lerna clear

# 重新安装依赖
lerna bootstrap

# 在每个包的package.json中写好依赖关系及版本号,lerna link会为每个package创建彼此之间的依赖关系
lerna link

# lerna exec 为每个包执行命令
lerna exec -- rm -rf node_modules/

# 在指定的 @attack-i/core 包中执行命令
lerna exec --scope @attack-i/core -- rm -rf node_modules/

# lerna run 在每个包中执行npm scripts
lerna run test

# 在指定的 @attack-i/core 包中run script
lerna run --scope @attack-i/core test

lerna version

# 查看上本来依赖的所有变更
lerna changed

# 查看diff
lerna diff

# 发布
lerna publish

更多命令及详情中可以去readme文档中查看

用vscode进行nodejs代码调试

项目根路径的.vscode文件件内的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"version": "0.2.0",
"configurations": [
// {
// "name": "npm install",
// "type": "shell",
// "request": "attach",
// "processOd": "${coman:pickProcess}"
// },
{
"type": "node",
"request": "launch",
"name": "Lerna Debug",
"skipFiles": [
"<node_internals>/**"
],
// cwd 表示命令运行目录
"cwd": "${workspaceFolder}/lerna",
// program 代表将要执行的文件
"program": "${workspaceFolder}/lerna/core/lerna/cli.js",
// args 代表执行命令后面的参数
"args": [
"ls"
],
// 使用vscode的集成终端
"console": "integratedTerminal",
// 表示在执行当前debug之前要执行的命令
// "preLaunchTask": {
// "task": "get info",
// }
}
]
}

任务列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"version": "2.0.0",
"tasks": [
{
"label": "get info",
"type": "shell",
"command": "npm",
"args": [
"info"
],
"group": "build"
}
]
}

常用操作

  • step into 进入函数内部
  • step out 退出函数
  • step over 跳过函数

npm常用命令

npm link xxxx

  1. 以上指令会在node安装路径下的bin目录,为xxxx项目中所有的bin指令创建软链接,链接指向lib/node_modules的xxxx的软链接,
  2. 然后在node安装路径下的lib/node_modules创建名称为xxxx的软链接,链接指向当前项目所在目录

简单来说就是把当前的项目软链到全局的node_modules

1
2
3
4
5
6
7

# ./attr-cli-lib
npm init -y

npm link attr-cli-lib

cd ../attr-cli
1
2
3
4
5
# 如果 attr-cli-lib 正式上线之后,npm install 需要解除与本地的软链接
npm unlink attr-cli-lib

# 如果 unlink 不成功可以通过删除node_modules来取消链接
rm -rf node_modules