当前位置: 首页 > 知识库问答 >
问题:

javascript - 需要怎么配置才能在TypeScript中使用ESM方式引入nodejs的库?

边银龙
2024-08-29

我看到ts代码有:如下的引用:

import * as fs from "fs";
import { promises as fsp } from "fs";

但是我下载repo本地会报错:
QQ_1724773966823.png

fs 应该是nodejs的库,一般我们知道是:require方式进行引入, 但是为何这里使用import引入也可以呢,是需要额外配置哪里才能使用ESM引入吗?

共有2个答案

云宝
2024-08-29

可以看看报错信息说的是什么?理论上ts是支持这样写的。试试看配置esModuleInteropallowSyntheticDefaultImports
esModuleInterop 属性用于提供对 ES 模块的兼容性支持。当我们在 TypeScript 项目中引入 CommonJS 模块时,可以通过设置 esModuleInterop 为 true 来避免引入时的错误。

{
  "compilerOptions": {
    ...,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
  }
}

来源是官网的兼容性说明:
https://www.typescriptlang.org/docs/handbook/modules/appendic...
中文版本:
https://ts.nodejs.cn/docs/handbook/modules/appendices/esm-cjs...
事实上这只是编译器对于这种写法的不兼容,如果你用原生的require写法的话就不会这种问题
image.png

潘涵煦
2024-08-29

在TypeScript中使用ESM(ECMAScript Modules)方式引入Node.js的库(如fs模块),通常需要在你的项目中做一些配置,以确保TypeScript编译器(tsc)和Node.js运行时都能正确处理ESM。以下是几个步骤和要点来帮助你配置:

1. 确保Node.js版本支持ESM

首先,确保你的Node.js版本支持ESM。从Node.js v12开始,ESM的支持逐步增加,但直到Node.js v14及更高版本,ESM的支持才变得更加完整和稳定。

2. 配置tsconfig.json

在你的tsconfig.json文件中,你需要设置几个关键的编译选项来支持ESM。主要是设置module选项为ESNextES2020(取决于你的具体需求),并确保target选项与你的Node.js版本兼容。同时,你可以设置esModuleInteroptrue来允许默认导入非ESM模块。

{
  "compilerOptions": {
    "module": "ESNext",
    "target": "ES2018", // 根据你的Node.js版本调整
    "esModuleInterop": true,
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

3. 在package.json中启用ESM

对于Node.js项目,你可以在package.json文件中添加一个"type": "module"字段,这样Node.js就会将.js文件作为ESM来处理。但是,由于你正在使用TypeScript,这主要影响.js文件的直接运行。对于.ts文件,TypeScript编译器的配置(如上所述)更为重要。

{
  "name": "your-project-name",
  "version": "1.0.0",
  "type": "module",
  "main": "dist/index.js",
  "scripts": {
    "build": "tsc"
  },
  "dependencies": {
    // 你的依赖
  },
  "devDependencies": {
    "typescript": "^4.x.x" // 确保是支持ESM的版本
  }
}

4. 编译TypeScript到ESM

使用上述tsconfig.json配置,TypeScript编译器(tsc)将默认编译.ts文件为.js文件,并保留ESM的importexport语句。然后,你可以直接在支持ESM的Node.js环境中运行这些编译后的.js文件。

5. 注意事项

  • 确保你的所有依赖项都支持ESM,或者你已经找到了与你的项目兼容的替代方案。
  • 在某些情况下,你可能需要使用.mjs扩展名来明确指定文件为ESM,但这在TypeScript项目中通常不是必需的。
  • 调试和排错时,注意检查Node.js的错误消息,它们通常会提供关于为什么文件被视为CommonJS模块而不是ESM的线索。

按照这些步骤操作后,你应该能够在TypeScript项目中使用ESM方式引入Node.js的库,包括fs模块。

 类似资料:
  • 我试图让VSCode启动并使用TypeScript运行,但收效甚微。 我正在看以下内容: https://code.visualstudio.com/docs/languages/typescript 看起来,一旦安装了编译器VSCode,就应该可以正常工作,但考虑到以下情况: tsconfig.json 包裹json tasks.json 项目 你好世界ts 从终端运行构建任务或tsc会正确指示

  • bebel.config.js中配置: 已安装core-js useBuiltIns: 'usage', babel文档或者网上搜到,配置这个东西,可以自动引入polyfill,但是我在编译之后,并没有自动引入,需要怎么处理才能自动引入polyfill

  • 问题内容: 如何在类中加载常规的NodeJS模块(从)? 当我尝试编译包含以下内容的文件时: 在此范围内,编译器提示无法使用require。(该行位于文件的开头)。 问题答案: 当无法找到符号时,Typescript总是会抱怨。编译器随附了的一组默认定义,这些定义在名为的文件中指定。如果我在此文件中执行grep,则找不到函数的定义。因此,我们必须使用以下语法告诉编译器我们该函数将在运行时存在: 在

  • nodejs中怎么引入有ES6语法的npm包? nodejs中引入模块用的是require,需要用到的npm包使用的是import

  • 问题内容: 我认为这个问题已经存在,但是我找不到。 我不明白,为什么必须要有一个功能接口才能使用lambda。考虑以下示例: 这可以正常工作,但是如果您取消注释行,则不会。为什么?以我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。为什么我需要一个功能接口并炸毁我的代码? 编辑:链接的重复项没有回答我的问题,因为我在询问不同的方法参数。但是在这里,我得到了一些非常有用的答案,这要

  • 我已经在macOS中安装了virtualenv: 当我在使用virtualenv的时候: 请问是需要如何才能使用? 安装路径如下: 如何添加软连接呢?

  • 疑问 react虽然同时提供了commonjs导出和esm导出,但是其esm导出的文件仍然是commonjs的,在并未经过任何转译的情况下,为什么能直接使用import具名导入它呢?在index.mjs中具名导入本地的commonjs模块会出错,我仿照react做了一个模块也是报错 复现 仅安装react index.mjs 执行 结果 成功打印react版本 其他信息 react的package

  • 问题内容: 我想在我的网站上使用我的图像编辑工具。我还需要吗? 我不了解这种情况。如果我不需要它,那么我们什么时候可以同时使用nodejs和angularjs? 问题答案: 您不需要NodeJS即可创建客户端图像编辑工具。 AngularJS是一个由Google和社区维护的Web应用程序框架,可帮助创建单页应用程序,该应用程序由一个HTML页面组成,该页面包含客户端的CSS和JavaScript。