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

相关推荐
Coca6 分钟前
Vue 3 缩放盒子组件 ScaleBox:实现内容动态缩放与坐标拾取偏移矫正
前端
枫叶kx7 分钟前
发布一个angular的npm包(包含多个模块)
前端·npm·angular.js
工呈士8 分钟前
Webpack 剖析与策略
前端·面试·webpack
lyc2333339 分钟前
鸿蒙Next智能家居:轻量化模型的场景化落地
前端
天生我材必有用_吴用9 分钟前
Three.js开发必备:几何体BufferGeometry顶点详解
前端
憨憨是条狗10 分钟前
Vue + Vant H5 应用中实现 SSE 实时通知及系统通知功能
前端
dremtri10 分钟前
双 Token 认证机制详解与完整 Demo
前端·后端
CnLiang11 分钟前
fnm无缝切换项目的pnpm和node脚本化实践
前端·javascript
ze_juejin12 分钟前
JavaScript类型之Symbol
javascript
设计师也学前端13 分钟前
SVG数据可视化组件基础教程:带刻度的仪表盘2
前端