- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- **这是源码共读的第36期,链接:juejin.cn/post/711878…
omit.js 源码
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.js方法传入两个参数,第一个是要进行操作的对象,第二个参数为第一个对象要删除对象key组成的数组,最终返回删除后的对象。
- 代码内部首先使用Object.assign浅拷贝传进来的对象;
- 遍历传进来要删除项的数组
- 使用delete删除对象的key
- 抛出修改后的对象
使用到的依赖
"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"
}
- umijs/fabric:一个包含 prettier,eslint,stylelint 的配置文件合集
- assert:nodejs断言模块,用于test测试
- eslint:可配置的 JavaScript 语法规则和代码风格的检查工具
- father:father 是一款 NPM 包研发工具,能够帮助开发者更高效、高质量地研发 NPM 包、生成构建产物、再完成发布。它主要具备以下特性:
- ⚔️ 双模式构建: 支持 Bundless 及 Bundle 两种构建模式,ESModule 及 CommonJS 产物使用 Bundless 模式,UMD 产物使用 Bundle 模式
- 🎛 多构建核心: Bundle 模式使用 Webpack 作为构建核心,Bundless 模式使用 esbuild 及 Babel 两种构建核心,可通过配置自由切换
- 🔖 类型生成: 无论是源码构建还是依赖预打包,都支持为 TypeScript 模块生成
.d.ts类型定义 - 🩺 项目体检: 对 NPM 包研发常见误区做检查,让每一次发布都更加稳健
- 🏗 微生成器: 为项目追加生成常见的工程化能力,例如使用 jest 编写测试
- 📦 依赖预打包: 开箱即用的依赖预打包能力,帮助 Node.js 框架/库提升稳定性、不受上游依赖更新影响(实验性)
5.np:发布npm
测试
"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"
}
执行npm run test,会进入下面的单元测试
import assert from "assert";
import omit from "../src";
describe("omit", () => {
it("should create a shallow copy", () => {
const benjy = { name: "Benjy" };
const copy = omit(benjy, ["age"]);
assert.deepEqual(copy, benjy);
assert.notEqual(copy, benjy);
});
it("should drop fields which are passed in", () => {
const benjy = { name: "Benjy", age: 18 };
assert.deepEqual(omit(benjy, ["age"]), { name: "Benjy" });
assert.deepEqual(omit(benjy, ["name", "age"]), {});
});
});
assert.deepEqual:深度比较 actual 和 expected 参数,使用比较运算符(==)比较原始值。
只考虑可枚举的“自身”属性。
assert.notEqual:使用简单的反向比较运算符 (!=) 来比较实际参数和预期参数。当它们不相等时,断言通过;否则,它会失败。
// 代码通过
Debugger attached.
PASS tests/index.test.js
omit
✓ should create a shallow copy (3123ms)
✓ should drop fields which are passed in (1ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 5.217s
Ran all test suites.
Waiting for the debugger to disconnect...
Waiting for the debugger to disconnect...
总结: 这个omit.js方法还是比较简单的,主要是了解到了发布npm的大概操作操作流程,学习到了写测试用例