SharePoint 2019 SPFX环境引入d3.js执行gulp build时出现类型错误
问题场景
已完成SharePoint 2019/SPSE开发环境搭建,WebPart创建正常,但在WebPart中添加import * as d3 from 'd3'后,执行gulp build出现大量TypeScript类型定义语法错误,示例错误如下:
Error - typescript - node_modules@types\d3-array\index.d.ts(35,79): error TS1005: ';' expected.
[12:05:27] Error - typescript - node_modules@types\d3-array\index.d.ts(35,94): error TS1005: ',' expected.
[12:05:27] Error - typescript - node_modules@types\d3-array\index.d.ts(48,13): error TS1005: ')' expected.
[12:05:27] Error - typescript - node_modules@types\d3-scale-chromatic\index.d.ts(40,34): error TS1005: '=' expected.
当前环境配置
- Node 8.17.0
- SPFx 1.4.1
- @microsoft/generator-sharepoint@1.10.0
- npm@6.13.4
- TypeScript@3.3.4000
- yo@2.0.6
已尝试过的操作:检查报错文件语法、降级d3及@types/d3版本、单独导入特定D3函数,但仍存在模块未找到的错误,且控制台错误指向的代码与报错描述不符。
问题根因
SPFx 1.4.1依赖的TypeScript 3.3版本不兼容D3 v6及以上版本的类型定义——新版D3的类型定义使用了TS 3.4+才支持的语法特性,导致TS 3.3编译时解析失败。
解决步骤
- 卸载当前不兼容的D3包
执行以下命令移除现有d3和对应的类型定义:
npm uninstall d3 @types/d3 --save
- 安装适配TS 3.3的D3版本
选择D3 v5.x系列(该版本的类型定义完全兼容TS 3.3),执行安装:
npm install d3@5.16.0 @types/d3@5.16.0 --save
- 校验TS配置文件
打开项目根目录的tsconfig.json,确认以下配置项:
target保持为es5(SPFx 1.4.1默认配置)lib数组包含dom(D3需要操作DOM,必须启用该配置),示例:"lib": [ "es5", "dom", "es2015.promise" ]
- 重新构建项目
先清理缓存再执行构建:
gulp clean gulp build
备选方案(子模块单独导入)
如果全量导入仍有问题,可以尝试单独导入需要的D3子模块,降低类型定义的加载范围:
// 按需导入示例 import { select, selectAll } from 'd3-selection'; import { scaleLinear } from 'd3-scale'; import { max } from 'd3-array';
内容的提问来源于stack exchange,提问作者Liml

