Ecmascript 6でjsonファイルにアクセスするにはどうすればよいですか?以下は機能しません:
import config from '../config.json'
JavaScriptファイルをインポートしようとすると、これは正常に機能します。
webpack
して使用json-loader
することです。
Ecmascript 6でjsonファイルにアクセスするにはどうすればよいですか?以下は機能しません:
import config from '../config.json'
JavaScriptファイルをインポートしようとすると、これは正常に機能します。
webpack
して使用json-loader
することです。
回答:
簡単な回避策:
config.js
export default
{
// my json here...
}
その後...
import config from '../config.js'
既存の.jsonファイルのインポートは許可されませんが、ジョブは実行されます。
"postbuild": "node myscript.js"
これを行うためにreplace-in-fileを使用するパッケージ.jsonファイルにステップを追加しました。 myscript.js const replace = require('replace-in-file'); const options = { files: '_demo/typedocs/navexReact.td.js', from: /{/, to: 'export default {', }; const convertJsonOutputToJsModule = async () => { try { const changes = await replace(options) console.log('Converted json to module in files:', changes.join(', ')); } catch (error) { console.error('Error occurred:', error); } } convertJsonOutputToJsModule()
TypeScriptまたはBabelを使用して、コードにjsonファイルをインポートできます。
// Babel
import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'
リファレンス:https : //hackernoon.com/import-json-into-typescript-8d465beded79
Loading failed for the module with source "example.json"
。Chromeで「モジュールスクリプトの読み込みに失敗しました:サーバーがJavaScript以外のMIMEタイプ "application / json"で応答しました。HTML仕様ごとにモジュールスクリプトに厳密なMIMEタイプチェックが適用されています。」
tsc
たコードについて話していると思いましたが、実際には何が起こっているのかはわかりません。ブラウザでネイティブでES6モジュールを実行しようとしています(<script type="module">
)import
。その行を直接実行すると、上記のエラーが発生します。私が間違っていて、実際に実際のES6でJSONからインポートできることを意味していた場合は、修正してください。
import
には、ノードへのステートメントのTSトランスパイルがありますrequire()
(試してみてください)。2番目のリンクは、JSONインポートについては何も述べていません。ここでの問題は、パーサーやモジュールシステムではなく、ローダーです。ブラウザーのローダーは、JavaScript以外のインポートを解決しません。内部では、たとえビルドツールチェーンが抽象化しても、常にAJAX呼び出し(フェッチ/ XHR)を使用して結果を解析する必要があります。
残念ながら、ES6 / ES2015はモジュールのインポート構文によるJSONのロードをサポートしていません。しかし ...
あなたがそれを行うことができる多くの方法があります。ニーズに応じて、JavaScriptでファイルを読み取る方法(window.FileReader
ブラウザで実行している場合はオプションになる場合があります)を調べるか、他の質問で説明されているように他のローダーを使用できます(NodeJSを使用していると想定しています)。
IMOの最も簡単な方法は、おそらくJSONをJSオブジェクトとしてES6モジュールに入れ、それをエクスポートすることです。そうすれば、必要な場所にインポートできます。
また、Webpackを使用している場合、JSONファイルのインポートはデフォルトで機能します(以降webpack >= v2.0.0
)。
import config from '../config.json';
ノードを使用している場合は、次のことができます。
const fs = require('fs');
const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time
または
const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');
そうしないと:
// config.js
{
// json object here
}
// script.js
import { config } from '../config.js';
または
import * from '../config.json'
ビルドツールとJSONファイル内のデータ構造によっては、のインポートが必要になる場合がありますdefault
。
import { default as config } from '../config.json';
例:内での使用 Next.js
resolveJsonModule
であるtrue
あなたにtsconfig.json
。
少し遅れましたが、package.jsonバージョンに基づいてアプリのバージョンを送信することを含むWebアプリの分析を提供しようとしているときに、同じ問題に遭遇しました。
構成は次のとおりです。React+ Redux、Webpack 3.5.6
json-loaderはWebpack 2+以降はあまり機能していないため、少しいじってから削除しました。
私にとって実際に機能したソリューションは、単にフェッチを使用することでした。これはおそらく非同期アプローチに適応するためにいくつかのコード変更を強制しますが、特にフェッチがオンザフライでjsonデコードを提供するという事実を考えると、それは完全に機能しました。
だからここにあります:
fetch('../../package.json')
.then(resp => resp.json())
.then((packageJson) => {
console.log(packageJson.version);
});
ここでは特にpackage.jsonについて説明しているため、ファイルは通常、本番ビルド(または、その場合はdev)にバンドルされないため、CopyWebpackPluginを使用してアクセスする必要があることに注意してください。フェッチを使用する場合は、
file:///
URL からロードすることです、それはここで起こっていることではありません。
現時点ではimport
、JSON MIMEタイプのファイルは作成できません。JavaScriptMIMEタイプのファイルのみです。将来的に追加される機能かもしれません(公式ディスカッション)。
fetch('./file.json')
.then(response => response.json())
.then(obj => console.log(obj))
現在、--experimental-json-modules
フラグが必要です。それ以外の場合、デフォルトではサポートされていません。
実行してみてください
node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"
コンソールに出力されたobjコンテンツを確認します。