web-dev-qa-db-ja.com

deno JSONファイルをモジュールとしてインポート

Jsonをインポートする単純なファイルがあります。

main.ts

import json from './file.json'

ただし、jsonファイルをインポートすると、denoは次のエラーをスローします。

$ 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)

ファイルパスは正しく、ファイルは有効なJSONです。 TypeScriptコンパイラはデフォルトでこれを許可する必要があります

また、resolveJsonModuleを明示的に有効にしようとしました:

tsconfig.json

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

そしてそれを設定で実行しますが、それでも同じエラーが発生します:

$ 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)

ここで何が問題になっていますか?

2
Jankapunkt

次のように、jsonファイルを読み取るためのスレッドサポートは、deno 1.0を出荷する直前に削除されました

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

ただし、jsonファイルの読み取りには次の構文を使用できます。

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

または

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

また、上記のコードを含むファイルは必ず--allow-read 国旗。それ以外の場合は、権限拒否エラーが発生します

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

Afeefの回答の代わりに、JSONファイルは有効なオブジェクトリテラルであるため、export defaultを追加して拡張子を.jsに変更できます。

from settings.json

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

settings.js

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

そして今、あなたはimportを使うことができます

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

短所は別として、--allow-readアクセスが必要ないという利点があります。

2