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

相关推荐
秋子aria2 分钟前
模块的原理及使用
前端·javascript
菜市口的跳脚长颌2 分钟前
一个 Vite 打包配置,引发的问题—— global: 'globalThis'
前端·vue.js·vite
胖虎2653 分钟前
实现无缝滚动无滚动条的 Element UI 表格(附完整代码)
前端·vue.js
小左OvO4 分钟前
基于百度地图JSAPI Three的城市公交客流可视化(一)——线路客流
前端
星链引擎6 分钟前
企业级智能聊天机器人 核心实现与场景落地
前端
GalaxyPokemon7 分钟前
PlayerFeedback 插件开发日志
java·服务器·前端
爱加班的猫8 分钟前
深入理解防抖与节流
前端·javascript
用户12039112947269 分钟前
从零实现AI Logo生成器:前端开发者的DALL-E 3实战指南
javascript
信码由缰13 分钟前
Java智能体框架的繁荣是一种代码异味
javascript·ai编程
自由日记22 分钟前
学习中小牢骚1
前端·javascript·css