web-dev-qa-db-fra.com

deno importer un fichier JSON en tant que module

J'ai un fichier simple qui importe un json:

main.ts

import json from './file.json'

Cependant, deno renvoie l'erreur suivante lors de l'importation d'un fichier json:

$ deno run main.ts
Compile file:///home/path/to/project/main.ts
error: Uncaught TypeError: Cannot resolve extension for "file:///home/path/file.json" with mediaType "Json".
    at getExtension ($deno$/compiler.ts:218:13)
    at new SourceFile ($deno$/compiler.ts:263:22)
    at Function.addToCache ($deno$/compiler.ts:339:16)
    at processImports ($deno$/compiler.ts:743:31)
    at async processImports ($deno$/compiler.ts:753:7)
    at async compile ($deno$/compiler.ts:1316:31)
    at async tsCompilerOnMessage ($deno$/compiler.ts:1548:22)
    at async workerMessageRecvCallback ($deno$/runtime_worker.ts:74:9)

Le chemin du fichier est correct et le fichier est un JSON valide. Le le compilateur TypeScript devrait permettre cela par défaut .

J'ai également essayé d'activer explicitement resolveJsonModule:

tsconfig.json

{
  "compilerOptions": {
    "resolveJsonModule": true
  },
  "include": [
    "**/*"
  ]
}

et exécutez-le avec la configuration mais obtenez toujours la même erreur:

$ deno run main.ts --config=tsconfig.json
Compile file:///home/path/to/project/main.ts
error: Uncaught TypeError: Cannot resolve extension for "file:///home/path/file.json" with mediaType "Json".
    at getExtension ($deno$/compiler.ts:218:13)
    at new SourceFile ($deno$/compiler.ts:263:22)
    at Function.addToCache ($deno$/compiler.ts:339:16)
    at processImports ($deno$/compiler.ts:743:31)
    at async processImports ($deno$/compiler.ts:753:7)
    at async compile ($deno$/compiler.ts:1316:31)
    at async tsCompilerOnMessage ($deno$/compiler.ts:1548:22)
    at async workerMessageRecvCallback ($deno$/runtime_worker.ts:74:9)

Quel est le problème ici?

2
Jankapunkt

Selon le thread suivant, la prise en charge de la lecture des fichiers json a été supprimée juste avant l'envoi de deno 1.0

https://github.com/denoland/deno/issues/56

Cependant, vous pouvez utiliser la syntaxe suivante pour lire un fichier json

Deno.readTextFile('./file.json').then(data => {
    console.log(JSON.parse(data))
})

ou

const data = JSON.parse(Deno.readTextFileSync('./file.json'));

Veillez également à exécuter le fichier contenant le code ci-dessus avec --allow-read drapeau. Sinon, vous obtiendrez une erreur d'autorisation refusée

deno run --allow-read index.ts
7
Afeef Janjua

Comme alternative à la réponse d'Afeef, puisqu'un fichier JSON est un littéral d'objet valide, vous pouvez ajouter export default et remplacez l'extension par .js.

de settings.json

{
   "something": {
      "foo": "bar"
   } 
}

à settings.js

export default {
   "something": {
      "foo": "bar"
   } 
}

Et maintenant, vous pouvez utiliser import

import settings from './settings.js'
console.log(typeof settings) // object
constole.log(settings.something.foo) // bar

L'avantage, en plus d'être plus court, c'est que vous n'avez pas besoin de --allow-read accès

2