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?
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 à .
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