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
