仅Electron构建时web worker中出现Can't resolve crypto报错
问题复现
Module build failed (from ./node_modules/worker-plugin/dist/loader.js): ModuleNotFoundError: Module not found: Error: Can't resolve 'crypto' in ...
该报错仅出现在Quasar 1.x + Webpack 4.44.2 环境下执行quasar dev -m electron构建、同时使用worker-plugin的场景,主浏览器线程运行、普通Web应用使用worker-plugin构建均无异常。
根因
Webpack 4 处理worker-plugin生成的Web Worker线程代码时采用独立编译规则,不会主动继承主渲染线程的模块解析配置。Quasar 1.x的Electron构建默认给主渲染线程配置了Node内置模块的访问/Polyfill规则,但该配置未同步到Worker的编译流程中,识别到代码中的crypto引用时无法匹配到对应模块。
解决方案
场景1:代码使用浏览器原生Crypto API(推荐)
如果你的业务代码仅调用浏览器标准crypto全局对象(如crypto.subtle系列接口),无需依赖Node版本crypto模块,无需安装额外依赖,直接修改配置即可:
- 打开项目根目录
quasar.conf.js,定位到build.extendWebpack配置项,更新为以下内容:
build: { extendWebpack (cfg) { // 将crypto引用直接指向Worker/主线程通用的全局原生对象 cfg.resolve.alias.crypto = 'self.crypto' // 给worker-plugin注入全局解析规则 cfg.module.rules.forEach(rule => { if (rule.loader === 'worker-plugin/dist/loader.js') { rule.options = rule.options || {} rule.options.resolve = cfg.resolve } }) // 兼容Webpack4的node模块解析开关 cfg.node = cfg.node || {} cfg.node.crypto = true } }
场景2:代码依赖Node crypto模块专属API
如果业务代码用到了Node crypto模块的特有功能,需要手动安装对应Polyfill:
- 先安装依赖包:
npm install crypto-browserify stream-browserify buffer --save-dev - 修改
quasar.conf.js的build配置:
build: { extendWebpack (cfg) { // 配置Node内置模块别名到对应Polyfill cfg.resolve.alias = { ...cfg.resolve.alias, 'crypto': require.resolve('crypto-browserify'), 'stream': require.resolve('stream-browserify'), 'buffer': require.resolve('buffer') } // 同步解析规则到worker-plugin cfg.module.rules.forEach(rule => { if (rule.loader && rule.loader.includes('worker-plugin/dist/loader.js')) { rule.options = rule.options || {} rule.options.resolve = cfg.resolve rule.options.node = { crypto: true, stream: true, buffer: true } } }) // 全局开启对应Node模块支持 cfg.node = { ...cfg.node, crypto: true, stream: true, buffer: true } } }
验证
修改配置后重新执行quasar dev -m electron即可正常完成构建。
内容的提问来源于stack exchange,提问作者Darren Cook
相关产品推荐
相关产品推荐

