vite instanceof 失效

背景:给一个巨石单体项目进行标准化模块拆分,封装出来的模块代码用 vite 进行构建,但模块启动后页面上的表现一直和 webpack 那版不一致

一步步 debug 后,发现问题出在下面这个判断条件

js 复制代码
const GeneratorFunction = function* () {}.constructor;

function(func){
    if (func instanceof GeneratorFunction){ 
        // do something
    } else {
        // do something
    }
}

问:当 func 是生成器函数时,判断条件输出 true 还是 false


答案:

vite:false

webpack:true

为什么

条件判断的本质是在判断 func.__proto__ 和 GeneratorFunction.prototype 两个值引用是否一致

vitewebpack 下输出看看:

js 复制代码
console.log(func.__proto__)   ==> ƒ GeneratorFunctionPrototype() { }
console.log(GeneratorFunction.prototype)   ==> ƒ GeneratorFunctionPrototype() { }

两个值看起来一样,但进行引用比较

js 复制代码
func.__proto__ === GeneratorFunction.prototype

会发现在 vite 输出 false,在 webpack 输出 true

谁对谁错?

当我在控制台搜索 GeneratorFunctionPrototype

发现 vite 编译后的产物里但凡使用了生成器函数,这个模块里都会重复声明一次 GeneratorFunctionPrototype

webpack 的编译产物里只有这一个来源,所以引用是一致的

GeneratorFunctionPrototype 应该是全局标准的唯一引用,因此 webpack 的表现是正确的

怎么解决

很遗憾,在 vite 里现阶段还无法通过有效手段编译出唯一 GeneratorFunctionPrototype

(如果你有方法请留言评论哦,蟹蟹)

我只能把判断条件换一种写法:

js 复制代码
function(func){
    if (saga.constructor.name.startsWith('GeneratorFunction')){ 
        // do something
    } else {
        // do something
    }
}

注:vite devprod 都会出现这个问题

相关推荐
love530love1 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
王码码20352 小时前
Flutter for OpenHarmony:Flutter 三方库 bluez 玩转 Linux 风格的蓝牙操作(蓝牙底层互操作)
linux·运维·服务器·前端·flutter·云原生·harmonyos
chilavert3184 小时前
技术演进中的开发沉思-371:final 关键字(中)
java·前端·数据库
2301_816997884 小时前
Vite构建工具
前端
yuki_uix5 小时前
深入理解 reduce:从面试题到设计思维
前端
凌云拓界5 小时前
TypeWell全攻略(二):热力图渲染引擎,让键盘发光
前端·后端·python·计算机外设·交互·pyqt·数据可视化
coding随想5 小时前
TypeScript 高级类型全攻略:从“可表达性”到“类型体操”的实践之路
前端·javascript·typescript
大时光6 小时前
gsap -滚动插件 ScrollTrigger 简单demo
前端