携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
- 本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
- 这是源码共读的第36期,omit.js
前言
工欲善其事必先利其器,日常开发中,为了提高开发效率,相信不少小伙伴都用过lodash库处理数据、请求等,对其omit、pick等方法应该都不会觉得陌生,接下来就一起来学习一下实用又简单的用于剔除对象属性的omit.js源码
目标
- 掌握omit.js的核心编程思想
- 掌握npm包的发布 3.omit.js测试用例
下载源码
omit.js github地址
git clone https://github.com/benjycui/omit.js.git
目录结构分析
|-- omitjs
|-- .eslintignore eslint忽略文件
|-- .eslintrc.js eslint配置
|-- .fatherrc.js father打包配置
|-- .gitignore git忽略文件
|-- .travis.yml
|-- index.d.ts omit.js ts类型文件
|-- index.js 入口文件地址
|-- LICENSE
|-- package.json npm包、脚本命令
|-- README.md 使用说明
|-- src
| |-- index.js omit.js js文件
|-- tests 测试用例
|-- index.test.js
package.json分析
{
"name": "omit.js",
"version": "2.0.2",
"description": "Utility function to create a shallow copy of an object which had dropped some fields.",
"main": "lib/index.js",
"module": "es/index.js",
"types": "index.d.ts",
"files": [
"lib",
"es",
"dist",
"index.d.ts"
],
"scripts": {
"start": "father doc dev --storybook",
"build": "father doc build --storybook",
"compile": "father build",
"gh-pages": "father doc deploy",
"prepublishOnly": "npm run compile && np --yolo --no-publish",
"lint": "eslint .",
"test": "father test",
"coverage": "father test --coverage"
},
"repository": {
"type": "git",
"url": "git+https://github.com/benjycui/omit.js.git"
},
"keywords": [
"object",
"omit"
],
"author": "Benjy Cui<benjytrys@gmail.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/benjycui/omit.js/issues"
},
"homepage": "https://github.com/benjycui/omit.js#readme",
"devDependencies": {
"@umijs/fabric": "^2.2.2",
"assert": "^1.4.1",
"eslint": "^7.4.0",
"father": "^2.29.5",
"np": "^6.3.1",
"rc-tools": "^6.3.3"
}
}
重点关注一下scripts跟devDependencies这两个标签,scripts是运行脚本,devDependencies是开发依赖
devDependencies
-
@umijs/fabric ——eslint、prettier、stylelint的配置文件合集
-
用法
-
yarn add @umijs/fabric -D
-
- 根目录新建配置文件eslint.js&eslintignore 或prettierrc.js 或 stylelintrc.js
-
- 配置文件,如omit.js的eslint.js
const base = require('@umijs/fabric/dist/eslint'); module.exports = { ...base, rules: { ...base.rules, 'no-template-curly-in-string': 0, 'prefer-promise-reject-errors': 0, 'react/no-array-index-key': 0, 'react/sort-comp': 0, 'import/no-named-as-default': 0, 'import/no-named-as-default-member': 0, }, }; -
-
father —— 打包发布前端工具库
-
用法
-
yarn add father
-
- 配置文件fatherrc.js, 如omit.js的配置:
export default { entry: ['src/index.js'], // 指定入口文件 cjs: 'babel', // 指定cjs的打包方式为babel esm: { type: 'babel', importLibToEs: true }, // 指定esm的打包类型为babel, 在esm模式下把import项里的/lib/ 转换为 /es/ doc: { base: '/switch' }, preCommit: { eslint: true, prettier: true, }, };scripts —— 脚本命令
调试
"test": "father test"- 运行测试用例命令:
yarn test,结果如下,也可以单独debug某一段用例
-
源码分析
function omit(obj, fields) {
// eslint-disable-next-line prefer-object-spread
const shallowCopy = Object.assign({}, obj);
for (let i = 0; i < fields.length; i += 1) {
const key = fields[i];
delete shallowCopy[key];
}
return shallowCopy;
}
export default omit;
omit方法实现逻辑
-
object.assign 浅拷贝入参
-
for循环遍历剔除属性
编写测试用例调试omit.js
describe('testOmit',()=>{
const tests = [
{args:{name:'yuexia',age:18},omitkey:['age'],expected:{name:'yuexia'}},
{args:{name:'yuexia'},omitkey:[],expected:{name:'yuexia'}},
]
tests.forEach(({args,omitkey,expected})=>{
it(`correctly omit args`, function(){
const res = omit(args,omitkey)
assert.deepEqual(res,expected)
})
})
})
- 测试结果
- 当把deepEqual换成strictEqual,测试用例则不能通过,进一步说明omit只是浅拷贝传入值
总结
通过对omit目录的分析,学习了利用father打包npm包,以及发布自己的npm包时通过@umijs/fabric来集合配置eslint、prettier、stylelint,实践了一下通过编写测试用例来调试omit.js,分析了omit的实现,加深了对omit的理解~