@types/node 安装 PnP 加载器 mjs 后不再被识别

@types/node not recognised anymore after PnP loader mjs install

我最近发现了 Yarn 3,到目前为止,我对 PnP 功能非常满意。因为我主要使用 monorepos,所以我想利用 Yarn workspaces。不幸的是,我无法让基本的东西工作。我已经建立了一个测试项目来突出问题。

设置和配置

[1] 项目结构如下

monorepo/
  .env
  - frontend/
    - app/
      - src/
  - tools/
    - scripts/
      - src/
         - script.ts

[2] 然后我通过 运行ning

初始化项目
yarn set version berry
yarn init

[3] 然后安装基本包以获取我的脚本 运行ning

yarn add -D typescript ts-node @types/node dotenv
yarn plugin import typescript

我还初始化了 scripts/ 文件夹中的脚本包,运行ning yarn init

[4] 然后我将我的工作区添加到新创建的 package.json

// package.json

{
  "name": "monorepo",
  "packageManager": "yarn@3.2.0",
  "devDependencies": {
    "@types/node": "^17.0.22",
    "dotenv": "^16.0.0",
    "ts-node": "^10.7.0",
    "typescript": "^4.6.2"
  },
  "workspaces": [
    "frontend/*",
    "tools/*"
  ],
}

[4]我运行

yarn install
yarn dlx @yarnpkg/sdks vscode

创建工作区并安装 VSCode SDK 以获得对我的 IDE.

的 Typescript 支持

到目前为止一切顺利,我可以打印工作区列表并且一切似乎都设置正确。但是,在我的 script.ts 文件中,我想从 .env 文件

中读取一个常量
// script.ts

import "dotenv/config";

const script = () => {
  const getEnv = process.env.SCRIPT;
  console.log(getEnv);
};

script();

我可以运行

yarn ts-node tools/scripts/script.ts

>> Hello script

没有问题。

问题

因为稍后我需要包 @graphql-codegen/cli 作为依赖项,所以我通过

安装了它
yarn workspace scripts add @graphql-codegen/cli

.pnp.loader.mjs 添加到根文件夹。只要 scripts/ 文件夹中没有 tsconfig.json,这不是问题!一旦我这样做,我就会得到错误

Cannot find name 'process'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`.

script.ts 文件中。如果我将 "types": ["node"] 添加到 tsconfig 中的编译器选项,我会得到

Can't get definition file for 'node'.

我看过几个帖子,但无法正常工作。为什么首先要安装 .pnp.loader.mjs?它似乎仍处于实验阶段(考虑到 Yarn 输出:

ESM support for PnP uses the experimental loader API and is therefore experimental

这让我发疯,有什么建议吗?谢谢!

好的,看来我已经解决了这个问题

我仍然不确定 .pnp.loader.mjs 到底发生了什么以及它到底做了什么。我也不知道为什么包 @graphql-codegen/cli 强制安装 PnP Loader 但它似乎无法处理工作区。我只需要通过

@types/node 添加到 scripts 包中的依赖项
yarn workspace scripts add @types/node

然后让我的 tsconfig.json 用于 scripts 包,例如

{
  "compilerOptions": {
    "types": ["node"]
  }
}

更新

您似乎也可以跳过 tsconfig 中的 "types": ["node"]