我正在 Typescript 中制作 NodeJs 库,并计划使其支持 Node@14+。因此,我决定将这个项目作为 ESModule 而不是 CommonJs。现在需要一些 CommonJs 库,我正在安装它们的@types
. 我的打字稿文件的导入如下所示:
import { Command } from 'commander';
import inquirer from 'inquirer';
import { resolve } from 'path';
import { render } from 'mustache';
import { copySync, readdirSync, readFile, readFileSync, writeFile } from 'fs-extra';
tsconfig.json
看起来像这样:
{
"include": ["src/**/*"],
"compilerOptions": {
// type checking
"exactOptionalPropertyTypes": true,
"noFallthroughCasesInSwitch": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noPropertyAccessFromIndexSignature": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"strict": true,
// module
"module": "ES2020",
"moduleResolution": "node",
"rootDir": "src",
"resolveJsonModule": true,
// emit
"outDir": "dist",
// "importHelpers": true,
// imterop constraints
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
// language and environment
"lib": ["ES2020"],
"target": "ES2020",
// completeness
"skipLibCheck": true
}
}
如您所见,我的目标是 ES2020,因为 Node@14+ 完全支持它,并且我的配置基于此处令人难以置信的答案https://stackoverflow.com/a/61305579/5863472。另外,我正在设置"type": "module"
我的package.json
.
这构建没有问题,但不运行。Node抛出的错误是
从'fs-extra'导入{copySync,readdirSync,readFile,readFileSync,writeFile};
^^^^^^^^
语法错误:未找到命名导出“readFile”。请求的模块“fs-extra”是一个 CommonJS 模块,它可能不支持所有 module.exports 作为命名导出。
CommonJS 模块总是可以通过默认导出导入,例如使用:
从“fs-extra”导入 pkg;
常量 { copySync,readdirSync,readFile,readFileSync,writeFile } = pkg;
"module": "ES2020"
相同的代码库在 my 中使用tsconfig.json
并删除 my 中的type
密钥可以很好地编译package.json
。
我发现解决此问题的方法是遵循错误消息。这工作正常:
import { Command } from 'commander';
import inquirer from 'inquirer';
import { resolve } from 'path';
import mustache from 'mustache';
import fs from 'fs-extra';
const { copySync, readdirSync, readFile, readFileSync, writeFile } = fs;
const { render } = mustache;
但这感觉像是一种痛苦,并且似乎可以被工具化。我是否缺少编译选项或可以自动转换import { foo } from 'bar'
为import bar from 'bar'; const { foo } = bar
.
PS 我真的不想使用 Babel ......