我正在参与掘金会员专属活动-源码共读第一期,点击参与
学习目标:
- 学习 Symbol.iterator 的使用场景
- 这期比较简单,主要学会通过测试用例调试源码。 可以多关注怎么发布npm包的、esm、测试用例 、ts 等(也可以不关注)。
- 建议克隆代码下来,关注测试用例,自己多通过测试用例调试,自己调试过才能够学会,感受更深一些。
分析源码
源码库地址:github.com/sindresorhu…
我们先将源码下载下来
git clone https://github.com/sindresorhus/arrify
看一下项目目录结构
tree arrify
arrify
├── index.d.ts
├── index.js
├── index.test-d.ts
├── license
├── package.json
├── readme.md
└── test.js
0 directories, 7 files
- index.js 入口文件
- index.d.ts 类型定义
查看一下package.json
cat package.json
{
"name": "arrify",
"version": "3.0.0",
"description": "Convert a value to an array",
"license": "MIT",
"repository": "sindresorhus/arrify",
"funding": "https://github.com/sponsors/sindresorhus",
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "https://sindresorhus.com"
},
"type": "module",
"exports": "./index.js",
"engines": {
"node": ">=12"
},
"scripts": {
"test": "xo && ava && tsd"
},
"files": [
"index.js",
"index.d.ts"
],
"keywords": [
"array",
"arrify",
"arrayify",
"convert",
"value",
"ensure"
],
"devDependencies": {
"ava": "^3.15.0",
"tsd": "^0.14.0",
"xo": "^0.39.1"
}
}
这里有三个开发依赖,依靠这三个依赖,Lint到测试全流程无需任何配置
- xo 一个开箱即用的Linter,内部是ESLint
- ava Node.js环境下的测试运行器,执行根目录下test.js测试文件
- tsd 为类型定义编写测试,创建一个.test-d.ts后缀文件就行
还有一个测试启动脚本 test: "xo && ava && tsd"
- 先让xo对js和ts文件做Lint
- 再交给ava跑test.js测试index.js
- 最后是tsd跑index.test-d.ts测试index.d.ts
查看源码
export default function arrify(value) {
if (value === null || value === undefined) {
return [];
}
if (Array.isArray(value)) {
return value;
}
if (typeof value === 'string') {
return [value];
}
if (typeof value[Symbol.iterator] === 'function') {
return [...value];
}
return [value];
}
通过源码我们可以知道arrify的转换规则是
- Null和Undefined返回空数组
- 数组不必再转换,返回本身
- String属于可迭代对象,但希望它保持整体作为数组元素存在
- 可迭代对象,浅拷贝迭代值创建新数组
- 其他类型直接被数组包裹
运行测试用例
npm install
npm run test
什么是Symbol.iterator
github小技巧
进入arrify仓库 github.com/sindresorhu… , 按下Cmd + k
,再输入>
,可以打开在线编辑器编辑当前仓库
Codespace官网上介绍自己是“超级快的云端开发环境”,它是支持Visual Studio代码的高性能虚拟机,可以在几秒内启动。