ES模块环境下gulp引入gulp-sass后yargs.argv.prod报错如何解决
问题原因
- 第一个
require is not defined报错:因为你的项目package.json中配置了"type": "module",Node.js会将所有.js后缀文件识别为ES模块,ES模块标准下不支持CommonJS的require引入语法,因此原生require方法不存在。 - 第二个
Cannot read property 'prod' of undefined报错:你调整sass引入为ES模块写法后,yargs的API调用方式不符合ES模块和新版yargs的规范。yargs v16及以上版本在ES模块环境下,不再支持直接通过yargs.argv获取命令行参数,此时yargs.argv返回undefined,读取其prod属性就会触发该报错。
解决方案
提供两种可任选的修复方案:
方案1:保留ES模块规范,修改对应代码
- 首先安装最新版yargs:
npm install yargs@latest --save-dev
- 替换所有依赖引入为ES模块写法,核心代码调整如下:
// 引入gulp-sass和sass import gulpSass from 'gulp-sass'; import dartSass from 'sass'; const sass = gulpSass(dartSass); // 引入yargs并获取参数 import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; const argv = yargs(hideBin(process.argv)).parse(); const PRODUCTION = argv.prod;
- 项目中其他的
require引入也全部替换为对应的import写法即可。
方案2:退回CommonJS规范,无需修改业务代码
直接将你的gulp配置文件从gulpfile.js重命名为gulpfile.cjs,Node.js会自动将.cjs后缀文件识别为CommonJS模块,你原来所有的require写法、yargs.argv.prod逻辑都可以正常使用,不需要调整代码。
内容的提问来源于stack exchange,提问作者askcoder
相关产品推荐
相关产品推荐

