npm-modules

vue3 中的 @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 工具方法,也新增了一些,可以仔细品一下,为什么要设计这些的方法

知识点

扩展

// 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 方法!
}