@vue/shared
工具函数参考好文:
可以将源码 ts 转为 js,打包后更容易分析。在 .github/contributing.md 找到贡献指南,查看说明
# 全局安装 pnpm 和 ni
npm i -g pnpm @antfu/ni
nr build
TODO: 另需要学习
查看 core/packages/shared/dist/shared.esm-bundler.js
有些同 vue2 的 shared 工具方法,也新增了一些,可以仔细品一下,为什么要设计这些的方法
startsWith()
isMap
isSet
instanceof
typeof
8 种Symbol
Promise
\B
Object.is
vs ===
是否严格相等, 区别两点
+0
=== -0
trueNaN
=== NaN
falseObject.defineProperty
算是一个非常重要的 API, 参看 learn-javascript
Object.defineProperties
globalThis
ES2020
// instanceof
const isDate = (val) => val instanceof Date;
// 例子:
isDate(new Date()); // true
// `instanceof` 操作符左边是右边的实例。但不是很准,但一般够用了。原理是根据原型链向上查找的。
isDate({__proto__: new Date()}); // true
// 实际上是应该是 Object 才对。
// 所以用 instanceof 判断数组也不准确。
// 再比如
({__proto__: [] }) instanceof Array; // true
// 实际上是对象。
// 所以用 数组本身提供的方法 Array.isArray 是比较准确的。
Object.is
polyfill
// https://github.com/zloirock/core-js/blob/master/packages/core-js/internals/same-value.js#L1-L7
// `SameValue` abstract operation
// https://tc39.es/ecma262/#sec-samevalue
// eslint-disable-next-line es/no-object-is -- safe
module.exports = Object.is || function is(x, y) {
// eslint-disable-next-line no-self-compare -- NaN check
return x === y ?
x !== 0 || 1 / x === 1 / y : // +0 != -0
x != x && y != y; // NaN == NaN
};
globalThis
polyfill
vue3 @vue/shared
中是如下实现的
const getGlobalThis = () => {
if (typeof globalThis !== 'undefined') { return globalThis; }
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
return {};
};
var globals = getGlobalThis();
if (typeof globals.setTimeout !== 'function') {
// 此环境中没有 setTimeout 方法!
}