dateformat@5.0.1报dateFormat is not a function 无type:module配置下如何解决
问题根源
你遇到的报错是两个原因共同导致的:
dateformat从v5.0.0版本开始转为纯ESM模块,不再支持CommonJS规范的require()直接导入,而你的项目未设置type: module,默认是CommonJS运行环境,二者规范不匹配。- 你使用的动态
import('dateformat')语法返回值是Promise对象,不是dateformat导出的方法本身,直接作为函数调用必然会报错。
解决方案(推荐优先用方案1,适配性最高)
方案1:降级dateformat到支持CommonJS的4.x版本
这是改动最小的适配方式,无需修改项目其他配置:
- 执行命令卸载当前版本并安装4.x分支的最后稳定版:
npm uninstall dateformat npm install dateformat@4.6.3
- 将你的导入语句改回CommonJS规范写法即可:
// 把原来的var dateFormat = import('dateformat');替换成下面这句 const dateFormat = require('dateformat');
其余业务代码完全不用修改,即可正常调用dateFormat方法。
方案2:保留v5.x版本的适配方式
如果你确实需要使用v5版本的新特性,按如下方式修改代码:
因为CommonJS环境下无法直接导入ESM模块,你需要处理动态import返回的Promise,同时要获取ESM模块的default导出:
var fs = require('fs'); var cluster = require('cluster'); // 先预加载模块 let dateFormat; import('dateformat').then(mod => { dateFormat = mod.default; }); module.exports = function(logSystem) { process.on('uncaughtException', function(err) { // 加个防护逻辑,避免模块加载完成前触发报错调用 if (!dateFormat) return; console.log('\n' + err.stack + '\n'); var time = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'); fs.appendFile(config.logging.files.directory + '/' + logSystem + '_crash.log', time + '\n' + err.stack + '\n\n', function(err) { if (cluster.isWorker) process.exit(); }); }); };
内容的提问来源于stack exchange,提问作者dagwood
相关产品推荐
相关产品推荐

