NestJS/TypeScript引入SheetJS报错:require()不支持ES模块如何解决?
解决NestJS/TypeScript中SheetJS ES模块导入错误
问题场景
使用NestJS/TypeScript开发时,在服务文件中按照SheetJS文档引入模块,代码如下:
/* load the codepage support library for extended support with older formats */ import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs'; import * as XLSX from 'xlsx/xlsx.mjs'; /* load 'fs' for readFile and writeFile support */ import { Injectable } from '@nestjs/common'; import { DSRequestContextService } from '@shared/services/context/context_service'; import { DSLogService } from '@shared/services/log/log.service'; XLSX.set_fs(fs); XLSX.stream.set_readable(Readable); XLSX.set_cptable(cpexcel);
运行时出现错误:
[ERROR] 18:11:27 Error: require() of ES Module /mnt/d/Repos/document-engine/node_modules/xlsx/dist/cpexcel.full.mjs not supported.
Instead change the require of /mnt/d/Repos/document-engine/node_modules/xlsx/dist/cpexcel.full.mjs to a dynamic import() which is available in all CommonJS modules.
解决方案
方法1:使用SheetJS的CommonJS兼容导入
直接导入SheetJS的CommonJS版本,无需单独引入cpexcel(最新版本已整合相关支持,或自动处理codepage依赖):
import * as XLSX from 'xlsx'; import * as fs from 'fs'; import { Readable } from 'stream'; import { Injectable } from '@nestjs/common'; import { DSRequestContextService } from '@shared/services/context/context_service'; import { DSLogService } from '@shared/services/log/log.service'; XLSX.set_fs(fs); XLSX.stream.set_readable(Readable); // 如需手动指定codepage,可使用CommonJS版本的cpexcel // XLSX.set_cptable(require('xlsx/dist/cpexcel.full.js'));
方法2:使用动态导入处理ES模块
按照错误提示改用动态import(),在异步函数中加载cpexcel模块:
import * as XLSX from 'xlsx/xlsx.mjs'; import * as fs from 'fs'; import { Readable } from 'stream'; import { Injectable } from '@nestjs/common'; import { DSRequestContextService } from '@shared/services/context/context_service'; import { DSLogService } from '@shared/services/log/log.service'; @Injectable() export class YourExcelService { async processExcel() { // 动态导入cpexcel模块 const cpexcel = await import('xlsx/dist/cpexcel.full.mjs'); XLSX.set_cptable(cpexcel); XLSX.set_fs(fs); XLSX.stream.set_readable(Readable); // 后续Excel处理逻辑 } }
方法3:调整项目模块系统配置
在项目根目录的package.json中添加"type": "module",同时修改tsconfig.json对应配置:
- 将
compilerOptions.module设为ESNext - 将
compilerOptions.target设为ES2020或更高版本 - 确保
compilerOptions.moduleResolution设为NodeNext
注意:此修改会影响整个项目的模块导入方式,需要验证所有依赖是否兼容ES模块。
内容的提问来源于stack exchange,提问作者Antonio Pavicevac-Ortiz
相关产品推荐
相关产品推荐

