web-dev-qa-db-fra.com

Comment utiliser TS-Node ESM avec des modules de noeuds?

Remarque: Je suis conscient que la question suivante concerne une fonctionnalité expérimentale. J'ai créé un clone sur le forum de discussion TS-noeud . Cependant, je crois que Stackoverflow a une exposition plus large et conduirait à une solution en moins de temps.

J'essaie de créer un script simple qui lit un fichier d'un endroit et le traite. Voici ce que j'ai jusqu'à présent, après avoir suivi # 1007 :

NODE: V12.22.1

my-app
├── .eslintrc.cjs
├── .gitignore
├── in
│   └── given.txt
├── node_modules
├── out
├── package-lock.json
├── package.json
├── src
│   ├── helper.ts
│   └── main.ts
└── tsconfig.json

paquet.json

{
  "name": "my-app",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx --max-warnings=0",
    "start": "node --experimental-specifier-resolution=node --experimental-modules --no-warnings --loader ts-node/esm ./src/main.ts"
  },
  "author": "Kaustubh Badrike",
  "devDependencies": {
    "@types/node": "^15.3.0",
    "@TypeScript-eslint/eslint-plugin": "^4.24.0",
    "@TypeScript-eslint/parser": "^4.24.0",
    "eslint": "^7.26.0",
    "ts-node": "^9.1.1",
    "TypeScript": "^4.2.4"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "ESNext",                           /* Specify module code generation: 'none', 'commonjs', 'AMD', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    
    /* Strict Type-Checking Options */
    "strict": true,                                 /* Enable all strict type-checking options. */
    
    /* Module Resolution Options */
    "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    
    /* Advanced Options */
    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
  }
}

main.ts

import { readFileSync } from "fs";

const contents = readFileSync('../in/given.txt');

Cependant, quand j'essaie npm run start, Je reçois ce qui suit

TypeError [ERR_INVALID_RETURN_PROPERTY_VALUE]: Expected string to be returned for the "format" from the "loader getFormat" function but got type 
object.
    at Loader.getFormat (internal/modules/esm/loader.js:125:13)
    at Loader.getModuleJob (internal/modules/esm/loader.js:247:20)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:49:17)
    at async Promise.all (index 0)
    at link (internal/modules/esm/module_job.js:53:9)

L'erreur ne se produit pas si je supprime l'importation de FS. Importer des éléments d'Helper.ts fonctionne également.

Qu'est-ce que je dois faire pour le faire fonctionner?

3
Kaustubh Badrike

Mise à jour 23.05.2021

TS-nœud v10.0.0. a été libéré et corrige des problèmes avec la résolution de modules intégrés au nœud dans ESM Loader sur Nodejs> = 12.20.0, <13 qui semble être le problème que vous faites face à .

Réponse originale

Je pourrais reproduire votre problème sur NodeJs 12.22.1 . Je peux également confirmer que cela fonctionne correctement sur Nodejs 14.16 .

Mise à jour de votre version de Nodejs une possibilité?

N'oubliez pas que la prise en charge de Nodejs à l'ESM est expérimentale pendant une longue période et les changements sont généralement attendus dans cette phase.

Aussi, liée à ce fait que vous utilisez une version de Nodejs (12.x) qui s'approche de fin de la vie de maintenance , ma recommandation est que vous mettez à jour votre nodejs à au moins la version 14.x Soit pour résoudre ce problème et pour vous permettre de bénéficier du dernier développement et de garantir un soutien à long terme.

Vous pouvez trouver une réponse plus complète sur les exigences et les configurations ici: Impossible d'importer le module ESM .TS dans le nœud

1
Felipe Plets