arrify转数组-阅读只有19行的源码

51 阅读2分钟

我正在参与掘金会员专属活动-源码共读第一期,点击参与

学习目标:

  • 学习 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

image.png

什么是Symbol.iterator

github小技巧

进入arrify仓库 github.com/sindresorhu… , 按下Cmd + k,再输入>,可以打开在线编辑器编辑当前仓库

Codespace官网上介绍自己是“超级快的云端开发环境”,它是支持Visual Studio代码的高性能虚拟机,可以在几秒内启动。

image.png