node:12860) UnhandledPromiseRejectionWarning: TypeError: this.getResolve is not a function

在使用Vue.js项目并执行build时遇到一个错误:(node:12860) UnhandledPromiseRejectionWarning: TypeError: this.getResolve is not a function。问题源于css-loader的版本不兼容。解决此问题的方法是先通过cnpm uninstall css-loader卸载当前版本,然后安装指定版本css-loader@2.0.2:cnpm install css-loader@2.0.2 --save-dev。

下载了css-loder之后build报错如下

(node:12860) UnhandledPromiseRejectionWarning: TypeError: this.getResolve is not a function
at Object.loader (D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\css-loader\dist\index.js:62:27)
at LOADER_EXECUTION (D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\loader-runner\lib\LoaderRunner.js:119:14)
at runSyncOrAsync (D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\loader-runner\lib\LoaderRunner.js:120:4)
at Array. (D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\loader-runner\lib\LoaderRunner.js:205:4)
at Storage.finished (D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:40:15)
at D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:77:9
at D:\桌面\笔记\vuejs\day01\12-webpack的使用\03-webpack的loder\node_modules\grac

你遇到的错误: ``` Syntax Error: TypeError: this.getLogger is not a function ``` 这个错误通常出现在 **Webpack 构建过程中**,尤其是在使用某些 loader 或 plugin 时,特别是在 **Webpack 版本升级后(如从 v4 升级到 v5/v6)**。它表明某个模块试图调用 `this.getLogger()`,但当前上下文(`this`)并不是 Webpack 的正常 loader context,或者使用的 **loader / plugin 版本与 Webpack 不兼容**。 --- ## 🔍 错误原因详解 ### 📌 `this.getLogger()` 是什么? 在 **Webpack 5+** 中,Webpack 引入了新的 [Loader API](https://webpack.js.org/api/loaders/),其中提供了: ```js this.getLogger('some-identifier') // 返回一个 logger 实例 ``` 用于在 loader 中记录日志(调试、警告等)。这是一个 **Webpack 5+ 新增的方法**。 > ❌ 问题在于:如果你在 **Webpack 4 或更低版本** 中运行一个 **为 Webpack 5 设计的 loader**,那么 `this.getLogger` 就不存在,因此报错: ``` TypeError: this.getLogger is not a function ``` --- ## ✅ 常见触发场景 | 场景 | 描述 | |------|------| | 1. 使用了新版 loader(如 `css-loader@6+`, `less-loader@11+`)但 Webpack 是 v4 | 这些 loader 内部调用了 `this.getLogger()` | | 2. 自定义 loader 中使用了 `this.getLogger()` 但运行环境是 Webpack 4 | 方法未定义 | | 3. pnpm/yarn/npm 锁文件导致安装了不兼容的依赖版本 | 即使配置正确,也可能拉取高版本 loader | --- ## ✅ 解决方案 ### ✅ 方案一:确认 Webpack 版本并降级相关 loader #### 步骤 1:检查你的 Webpack 版本 ```bash npx webpack --version # 或 npm list webpack ``` 如果输出类似: ``` webpack 4.x.x ``` → 那么你不能使用任何依赖 `this.getLogger()` 的 loader(即 Webpack 5+ only 的 loader) #### 步骤 2:降级到 Webpack 4 兼容的 loader 版本 | Loader | Webpack 4 兼容版本 | Webpack 5+ 才支持的版本 | |--------|---------------------|--------------------------| | `css-loader` | `^5.2.7` | `^6.0.0` | | `style-loader` | `^2.0.0` | `^3.0.0` | | `less-loader` | `^7.3.0` | `^8.0.0` | | `sass-loader` | `^10.3.1` | `^12.0.0` | | `ts-loader` | `^6.2.2` | `^9.0.0` | 👉 示例:降级 `css-loader` 和 `style-loader` ```bash npm install css-loader@5.2.7 style-loader@2.0.0 --save-dev ``` 或使用 pnpm: ```bash pnpm add css-loader@5.2.7 style-loader@2.0.0 --dev ``` --- ### ✅ 方案二:升级 Webpack 到 v5+(推荐长期方案) 如果你希望使用现代 loader,最佳做法是将 Webpack 升级到 v5。 #### 升级命令: ```bash npm install webpack@5 webpack-cli@latest --save-dev ``` 然后更新 `webpack.config.js` 添加必要字段(如 `mode`): ```js module.exports = { mode: 'development', // 必须显式设置 entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } }; ``` ✅ 升级后,`this.getLogger()` 就可用,错误消失。 --- ### ✅ 方案三:排查自定义 loader 或第三方插件 如果你写了自定义 loader: ```js function myLoader(source) { const logger = this.getLogger(); // ❌ 在 Webpack 4 下会失败 logger.debug('Processing file...'); return source; } ``` #### 修复方法:添加兼容性判断 ```js function myLoader(source) { let logger; if (typeof this.getLogger === 'function') { logger = this.getLogger('my-loader'); logger.debug('Processing file...'); } else { console.log('[MyLoader] Processing file...'); } return source; } ``` 这样可以在 Webpack 4 和 5 下都安全运行。 --- ### ✅ 方案四:清理依赖树,避免版本冲突 有时即使你指定了低版本 loader,但由于依赖锁或嵌套安装机制(尤其是 pnpm),仍可能加载了高版本。 #### 检查实际加载的版本: ```bash npm ls css-loader # 或 pnpm list css-loader ``` 确保没有意外的 `6.x` 版本被引入。 #### 清理重建: ```bash # 删除 node_modules 和 lock 文件 rm -rf node_modules package-lock.json # 或 pnpm: rm -rf node_modules pnpm-lock.yaml # 重新安装 npm install # 或 pnpm install ``` --- ### ✅ 示例:Webpack 4 安全配置(CSS 处理) ```js // webpack.config.js const path = require('path'); module.exports = { mode: 'development', entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, module: { rules: [ { test: /\.css$/, use: [ 'style-loader', // 使用 ^2.0.0 'css-loader' // 使用 ^5.2.7 ] } ] } }; ``` 安装命令: ```bash npm install style-loader@2.0.0 css-loader@5.2.7 --save-dev ``` --- ## ✅ 如何预防此类问题? 1. ✅ 查看 loader 的 `peerDependencies`: ```bash npm info css-loader@6.0.0 peerDependencies ``` 输出: ```json { "webpack": "^5.0.0" } ``` → 明确告诉你必须用 Webpack 5+ 2. ✅ 使用 `resolutions`(yarn)或 `pnpm override` 强制版本控制 yarn: ```json "resolutions": { "css-loader": "5.2.7" } ``` pnpm: ```json // pnpm-lock.yaml 同级的 package.json "pnpm": { "overrides": { "css-loader": "5.2.7" } } ``` 3. ✅ 开发前统一技术栈版本,避免混用新旧工具链 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值