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 两个值引用是否一致

在 vite 和 webpack 下输出看看:

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 dev 和 prod 都会出现这个问题

相关推荐
Csvn2 小时前
WASM
前端
修己xj3 小时前
我用 AI 给自己写了一个 Markdown 编辑器,然后把它开源了
前端
FRing034 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
幸运小猿4 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
moshuying5 小时前
网购能买Token了!
前端
h_65432106 小时前
echarts实现柱状图加一条横线
前端·echarts
风骏时光牛马6 小时前
生成一个后端标题,只需要一个标题,不需要其他的任何文本。
前端
子非鱼@Itfuture6 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李6 小时前
openFeign入门
java·开发语言·前端
馒头不想说话6 小时前
AI当运营,帮你省人力
前端