javascript - Node 20.9.0 LTS: Hvordan kjøre TypeScript med ts-node med esm-støtte?


Jeg har oppgradert min Node.js-versjon fra 18 til 20.9.0 LTS. Jeg har et prosjekt med TypeScript, Express og Node. Dette er package.json:

{
  "name": "myproject",
  "version": "1.0.0",
  "private": "true",
  "license": "UNLICENSED",
  "main": "dist/index.js",
  "scripts": {
    "dev": "NODE_ENV=development nodemon",
    "dev-lite": "NODE_ENV=development node --loader ts-node/esm src/index.ts",
  },
  "dependencies": {
   
  },
  "devDependencies": {
   
  }
}

Dette er min tsconfig:

{
  "compilerOptions": {
    "module": "CommonJS",
    "esModuleInterop": true,
    "target": "ES6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "strict": true,
    "paths": {
      "*": [
        "node_modules/*"
      ]
    }
  },
  "include": [
    "src/**/*"
  ]
}

Etter å ha oppgradert til Node.js 20.9.0, når jeg kjører yarn dev lite, får jeg følgende feil:

yarn run v1.22.19
NODE_ENV=development node --loader ts-node/esm src/index.ts
(node:12820) ExperimentalWarning: `--experimental-loader` may be removed in the future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use `node --trace-warnings ...` to show where the warning was created)
(node:12820) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(node:12820) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
/home/mumin/welcome_localdev/sc-graphql-store-writer/src/index.ts:1
import app from './app';
^^^^^^

SyntaxError: Cannot use import statement outside a module
  at internalCompileFunction (node:internal/vm:73:18)
  at wrapSafe (node:internal/modules/cjs/loader:1153:20)
  at Module._compile (node:internal/modules/cjs/loader:1205:27)
  at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
  at Module.load (node:internal/modules/cjs/loader:1091:32)
  at Module._load (node:internal/modules/cjs/loader:938:12)
  at cjsLoader (node:internal/modules/esm/translators:284:17)
  at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:234:7)
  at ModuleJob.run (node:internal/modules/esm/module_job:217:25)
  at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)

Node.js v20.9.0
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Jeg har lagt til type: "module" i config.json. Så får jeg dette:

yarn run v1.22.19
NODE_ENV=development node --loader ts-node/esm src/index.ts
(node:21831) ExperimentalWarning: `--experimental-loader` may be removed in the future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use `node --trace-warnings ...` to show where the warning was created)
file:///home/mumin/welcome_localdev/sc-graphql-store-writer/src/index.ts:5
Object.defineProperty(exports, "__esModule", { value: true });
                      ^

ReferenceError: exports is not defined in ES module scope
    at file:///home/mumin/welcome_localdev/sc-graphql-store-writer/src/index.ts:5:23
    at ModuleJob.run (node:internal/modules/esm/module_job:217:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
    at async loadESM (node:internal/process/esm_loader:34:7)
    at async handleMainPromise (node:internal/modules/run_main:66:12)

Node.js v20.9.0
error Command failed with exit code 1.

Jeg har også endret "module: Node16" og "module: ESNext" i tsconfig.json. Etter det fikk jeg følgende feil:

yarn run v1.22.19
NODE_ENV=development node --loader ts-node/esm src/index.ts
(node:28358) ExperimentalWarning: `--experimental-loader` may be removed in the future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use `node --trace-warnings ...` to show where the warning was created)
file:///home/mumin/welcome_localdev/sc-graphql-store-writer/src/index.ts:5
Object.defineProperty(exports, "__esModule", { value: true });
                      ^

ReferenceError: exports is not defined in ES module scope
    at file:///home/mumin/welcome_localdev/sc-graphql-store-writer/src/index.ts:5:23
    at ModuleJob.run (node:internal/modules/esm/module_job:217:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
    at async loadESM (node:internal/process/esm_loader:34:7)
    at async handleMainPromise (node:internal/modules/run_main:66:12)

Node.js v20.9.0
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Kunne ikke finne noen måte å løse problemet på. Har du noen anbefaling?

Svar #1

Du kan ikke bruke "module": "CommonJS" med type: "module", bruk es2022 eller node16 (se autokomplettering)

Relaterte artikler