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

相关推荐
于慨10 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz10 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶10 小时前
前端交互规范(Web 端)
前端
@yanyu66610 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
CHU72903511 小时前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing11 小时前
Page-agent MCP结构
前端·人工智能
王霸天11 小时前
💥别再抄网上的Scale缩放代码了!50行源码教你写一个永不翻车的大屏适配
前端·vue.js·数据可视化
小领航11 小时前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
@大迁世界11 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
PieroPc11 小时前
一个功能强大的 Web 端标签设计和打印工具,支持服务器端直接打印到局域网打印机。Fastapi + html
前端·html·fastapi