happypack两次报错的问题

happypack两次报错的问题happypack 有点问题 happypack4 0 0 beta1 版本以及以前的版本 并不能很好的兼容 webpack2 以上的版本 这个问题并不大 但是目前来说比较影响观瞻 这个问题实际反映在哪里呢 当我使用 webpack3 的时候 经常发现 happypack 报两个重复的错误 static client js tool app

happypack有点问题

happypack4.0.0@beta1版本以及以前的版本,并不能很好的兼容webpack2以上的版本。

这个问题并不大,但是目前来说比较影响观瞻。

这个问题实际反映在哪里呢?

当我使用webpack3的时候,经常发现happypack报两个重复的错误。

./static/client/js/tool/app.js (Emitted value instead of an instance of Error) /Users/lipenghui/works/qietv-mobile/static/client/js/tool/app.js 6:5 warning 'downloadbtn' is never reassigned. Use 'const' instead prefer-const 8:5 warning 'url' is never reassigned. Use 'const' instead prefer-const 10:5 warning 'mask' is never reassigned. Use 'const' instead prefer-const 15:14 error Missing semicolon semi 24:7 error Missing semicolon semi ✖ 5 problems (2 errors, 3 warnings) 2 errors, 3 warnings potentially fixable with the `--fix` option. NonErrorEmittedError: (Emitted value instead of an instance of Error) /Users/lipenghui/works/qietv-mobile/static/client/js/tool/app.js 6:5 warning 'downloadbtn' is never reassigned. Use 'const' instead prefer-const 8:5 warning 'url' is never reassigned. Use 'const' instead prefer-const 10:5 warning 'mask' is never reassigned. Use 'const' instead prefer-const 15:14 error Missing semicolon semi 24:7 error Missing semicolon semi ✖ 5 problems (2 errors, 3 warnings) 2 errors, 3 warnings potentially fixable with the `--fix` option. at Object.emitError (/Users/lipenghui/works/qietv-mobile/node_modules/webpack/lib/NormalModule.js:120:14) at Object.emitError (/Users/lipenghui/works/qietv-mobile/node_modules/happypack/lib/HappyRPCHandler.js:85:12) at HappyRPCHandler.execute (/Users/lipenghui/works/qietv-mobile/node_modules/happypack/lib/HappyRPCHandler.js:58:22) at ChildProcess.acceptMessageFromWorker (/Users/lipenghui/works/qietv-mobile/node_modules/happypack/lib/HappyThread.js:80:27) at emitTwo (events.js:125:13) at ChildProcess.emit (events.js:213:7) at handleMessage (internal/child_process.js:753:14) at Pipe.channel.onread (internal/child_process.js:472:11)

从报错分析,我们的其中一个错误是经过Object.emitError时报出的NonErrorEmittedError: (Emitted value instead of an instance of Error)。 查阅webpack/lib/NormalModule.js的源代码可知,在webpack2及以上的版本中,emitError和emitWarning在接受到的消息不是一个错误的时候,会重新生成一条错误记录,扔进errorStack里。。。。

emitWarning: (warning) => { if(!(warning instanceof Error)) warning = new NonErrorEmittedError(warning); this.warnings.push(new ModuleWarning(this, warning)); }, emitError: (error) => { if(!(error instanceof Error)) error = new NonErrorEmittedError(error); this.errors.push(new ModuleError(this, error)); },

在现有loader的代码中,很多对LoaderContext版本进行了处理,或者干脆新版本里传过去的错误消息就是继承于Error,比如eslint-loader,源代码中有一句

// 注,该webpack为LoaderContext实例,非webpack实例 emitter(webpack.version === 2 ? new ESLintError(messages) : messages)

如果LoaderContext的版本是2,就扔出一个继承自Error的消息

// webpack/lib/NormalModule.js中创建loaderContext的方法 // version === 2 createLoaderContext(resolver, options, compilation, fs) { const loaderContext = { version: 2, emitWarning: (warning) => { if(!(warning instanceof Error)) warning = new NonErrorEmittedError(warning); this.warnings.push(new ModuleWarning(this, warning)); }, emitError: (error) => { if(!(error instanceof Error)) error = new NonErrorEmittedError(error); this.errors.push(new ModuleError(this, error)); }, exec: (code, filename) => { const module = new NativeModule(filename, this); module.paths = NativeModule._nodeModulePaths(this.context); module.filename = filename; module._compile(code, filename); return module.exports; }, 。。。

高潮来了。

happypack本身会建立一个假的loaderContext用以分线程处理任务,这个loaderContext的version是1。。。

unction HappyFakeLoaderContext(initialValues) {
  var loader = {};

  // for compiler RPCs, like this.resolve()
  loader._compiler = null;

  // for loader RPCs, like this.emitWarning()
  loader._remoteLoaderId = null;

  loader.version = 1; // https://webpack.github.io/docs/loaders.html#version
  loader.webpack = false;
  loader.request = null;
  loader.query = null;

  loader.context = null;
  loader.resource = null;
  loader.resourcePath = null;
  loader.resourceQuery = null

于是在接洽真正的loader并获得errorMessage抛给主进程的时候,我们的happypack就跪了,于是我们有了两个报错。。。

然后,就有人修复了是不是~

对,有人修复了并给作者push了一下。兼容方案如下

 HappyRPCHandler.prototype.execute = function(type, payload, done) { var compiler, loader; if (payload.message.happyPackIsError) { var oldMessage = payload.message; payload.message = new Error(oldMessage.message); delete payload.message.stack; for (var i in oldMessage) { if (i !== 'message' && i !== 'happyPackIsError') { payload.message[i] = oldMessage[i]; } } }

完全无视了version,这样也好。。也好,毕竟我们npm是可以指定模块版本的。。

然鹅。。在本篇文章发表12小时前。。。

clipboard.png

修复代码没有通过ci的构建,并没有解决该问题。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176698.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:16
下一篇 2026年3月26日 下午9:17


相关推荐

  • C语言中动态分配数组

    C语言中动态分配数组很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时候就…

    2022年7月22日
    10
  • 物联网服务器_物联网接口

    物联网服务器_物联网接口一、第一次上线本主机于2018年12月23日正式上线,初装了4个设备,管理474只表,由于是手抄改网络抄表不是新安装,考虑到人工再去布线的成本远高于设备成本,因此多用了几个设备,每个设备通道都没有用完。1、设备号为663183的设备在安装后有一个通道在抄读水表的时候有短路发生,那是因为…

    2022年8月31日
    5
  • matlab理想低通滤波器代码_matlab简单低通滤波器

    matlab理想低通滤波器代码_matlab简单低通滤波器低通滤波器的设计设计低通滤波器的要求:设低通滤波器通带截止频率为ωp=0.2π,阻带截止频率为ωs=0.4π,通带波纹Ag=0.5dB,最小阻带衰减Ar=50dB。wp=0.2*pi;wr=0.4*pi;trwidth=wr-wp;%过渡带宽度N=ceil(6.64*pi/trwidth)+1;%滤波器的长度n=0:1:N-1;wc=(wr+wp)/2;hd=ideal_lp(wc,N);w_…

    2025年8月11日
    6
  • pycharm如何在运行时打开控制台[通俗易懂]

    pycharm如何在运行时打开控制台[通俗易懂]pycharm如何在运行时打开控制台解决方案:

    2022年8月25日
    6
  • FindWindowEX的实例

    FindWindowEX的实例 FindWindowEX的实例  [日期:2004-12-24]  [来自:本站原创]函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。   函数原型:HWNDFindWindowEx(HWNDhwndParent,HWNDhwndChildAfter,LPCT

    2022年5月29日
    31
  • gliffy confluen插件gliffy-confluence-plugin-5.1.ja激活成功教程

    gliffy confluen插件gliffy-confluence-plugin-5.1.ja激活成功教程为什么 80 的码农都做不了架构师 gt gt gt

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号