Pesquisa de site

next.js - NextJS: Executar um script TypeScript no servidor


Eu tenho um projeto NextJS/Typescript onde quero adicionar um script CLI que deve processar alguns arquivos no servidor.

Infelizmente, eu não consigo executar o script.

Exemplo de script src/cli.ts:

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

Eu tentei executar o script com:

ts-node src/cli.ts

Mas eu recebo esta mensagem de erro:

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.

Quando adiciono uma declaração vazia 'export {}' eu recebo esta mensagem de erro:

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

Até onde eu sei, agora não é possível usar NextJS com módulos ES.

Existe outra maneira de executar o script em um projeto NextJS? Talvez eu precise alterar a configuração do webpack?

Estou usando as versões mais recentes: Next 11, Typescript 4.3, Node 14.18, ts-node 10.13 com o tsconfig.json padrão, package.json.

Resposta #1

Você pode usar TSX, que funciona bem com NextJS, tanto para JavaScript quanto para TypeScript. Não há necessidade de configuração extra ou qualquer outra coisa.

Instale-o:

yarn add -D tsx

Declare seu script em package.json:

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

Execute:

yarn my-cli-script

Resposta #2

Execute isto em vez disso:

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

Referência: https://github.com/TypeStrong/ts-node#tsconfig

A flag --skip-project não irá resolver/carregar seu tsconfig.json e, portanto, ignorará o "isolatedModules": true exigido pelo Next.js.

Você também pode criar um arquivo tsconfig separado para ts-node e usar a opção --project [path].

Outra maneira é sobrescrever a configuração para ts-node no seu próprio tsconfig.json assim:

{
  "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
  }
}

Referência: https://github.com/TypeStrong/ts-node#via-tsconfigjson-recommended

Artigos relacionados