next.js - NextJS: Kör ett Typescript-skript på servern


Jag har ett NextJS/Typescript-projekt där jag vill lägga till ett CLI-skript som ska bearbeta några filer på servern.

Tyvärr lyckas jag inte köra skriptet.

Exempel på skript src/cli.ts:

console.log("Hello world");
// Process files

Jag försökte köra skriptet med:

ts-node src/cli.ts

Men jag får detta felmeddelande:

src/cli.ts:1:1 - error TS1208: 'cli.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.

När jag lägger till en tom 'export {}'-sats får jag detta felmeddelande:

(node:15923) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.

Såvitt jag vet är det nu inte möjligt att använda NextJS med ES-moduler.

Finns det ett annat sätt att köra skriptet i ett NextJS-projekt? Kanske behöver jag ändra webpack-konfigurationen?

Jag använder de senaste versionerna: Next 11, Typescript 4.3, Node 14.18, ts-node 10.13 med standard tsconfig.json, package.json.

Svar #1

Du kan använda TSX, som fungerar bra med NextJS, både för JavaScript och TypeScript. Ingen extra konfiguration eller något behövs.

Installera det:

yarn add -D tsx

Deklarera ditt skript i package.json:

...
"scripts": {
  ...
  "my-cli-script": "tsx src/cli.ts"
},

Kör den:

yarn my-cli-script

Svar #2

Kör detta istället:

npx ts-node --skip-project src/cli.ts

Referens: https://github.com/TypeStrong/ts-node#tsconfig

--skip-project-flaggan kommer inte att lösa/ladda din tsconfig.json och kommer därför att ignorera "isolatedModules": true som krävs av Next.js.

Du kan också skapa en separat tsconfig-fil för ts-node och använda --project [path]-alternativet.

Ett annat sätt är att åsidosätta konfigurationen för ts-node i din tsconfig.json själv på detta sätt:

{
  "extends": "ts-node/next/tsconfig.json",

  "ts-node": {
    "compilerOptions": {
      // compilerOptions specified here will override those declared below,
      // but *only* in ts-node.  Useful if you want ts-node and tsc to use
      // different options with a single tsconfig.json.

      "isolatedModules": false
    }
  },

  "compilerOptions": {
    // typescript options here
  }
}

Referens: https://github.com/TypeStrong/ts-node#via-tsconfigjson-recommended

Relaterade artiklar