0

我正在 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 ......

4

0 回答 0