ES6モジュールの実装、jsonファイルをロードする方法


87

https://github.com/moroshko/react-autosuggestから例を実装してい ます

重要なコードは次のとおりです。

import React, { Component } from 'react';
import suburbs from 'json!../suburbs.json';

function getSuggestions(input, callback) {
  const suggestions = suburbs
    .filter(suburbObj => suburbMatchRegex.test(suburbObj.suburb))
    .sort((suburbObj1, suburbObj2) =>
      suburbObj1.suburb.toLowerCase().indexOf(lowercasedInput) -
      suburbObj2.suburb.toLowerCase().indexOf(lowercasedInput)
    )
    .slice(0, 7)
    .map(suburbObj => suburbObj.suburb);

  // 'suggestions' will be an array of strings, e.g.:
  //   ['Mentone', 'Mill Park', 'Mordialloc']

  setTimeout(() => callback(null, suggestions), 300);
}

この例のコピーアンドペーストコード(機能します)には、私のプロジェクトでエラーがあります:

Error: Cannot resolve module 'json' in /home/juanda/redux-pruebas/components

接頭辞jsonを削除すると!:

import suburbs from '../suburbs.json';

このようにして、コンパイル時にエラーが発生しませんでした(インポートが実行されます)。ただし、実行するとエラーが発生しました。

Uncaught TypeError: _jsonfilesSuburbsJson2.default.filter is not a function

デバッグすると、郊外は配列ではなくObjectcであることがわかります。そのため、フィルター関数は定義されていません。

ただし、この例ではコメント付きの提案は配列です。このような提案を書き直すと、すべてが機能します。

  const suggestions = suburbs
  var suggestions = [ {
    'suburb': 'Abbeyard',
    'postcode': '3737'
  }, {
    'suburb': 'Abbotsford',
    'postcode': '3067'
  }, {
    'suburb': 'Aberfeldie',
    'postcode': '3040'
  } ].filter(suburbObj => suburbMatchRegex.test(suburbObj.suburb))

だから...なんてjson!プレフィックスはインポートで実行されていますか?

コードに入れられないのはなぜですか?いくつかのbabel構成?


1
ES6モジュールを実際に使用したいという選択した回答を再評価してください。ES6モジュールを理解するJSだけで、何も必要ありません。 stackoverflow.com/a/53878451/124486
Evan Carroll

回答:


156

まず最初にインストールする必要がありますjson-loader

npm i json-loader --save-dev

次に、それを使用する方法が2つあります。

  1. json-loaderそれぞれの追加を回避するために、次の行にimport追加できますwebpack.config

    loaders: [
      { test: /\.json$/, loader: 'json-loader' },
      // other loaders 
    ]
    

    次にjson、このようなファイルをインポートします

    import suburbs from '../suburbs.json';
    
  2. あなたの例のように、でjson-loader直接使用しますimport

    import suburbs from 'json!../suburbs.json';
    

注: ではwebpack 2.*代わりにキーワードをloaders使用する必要がありますrules

デフォルトでもwebpack 2.*使用json-loader

* .jsonファイルは、json-loaderなしでサポートされるようになりました。あなたはまだそれを使うことができます。それは重大な変化ではありません。

v2.1.0-beta.28


1
どうもありがとうございます!json-loaderのドキュメントには、実際にはwebpack v2の設定が示されていたため、(v1を使用して)何も機能しませんでした。ですから、ルールではなくローダーを使用してください。さらに、この答えのように、そのオブジェクト内の「use」を「loader」に変更してください!
nbkhope 2017

5
@ alexander-tが述べたように、json-loaderなしでjsonファイルをインポートできるようになりましたが、json-loaderが認識されない問題が発生した場合は、ローダー構成に「-loader」サフィックスを追加する必要があります。このように:{ test: /\.json$/, loader: 'json-loader' }
cvetanov 2017

typescriptを介してインポートされている場合、インポートされたjsonがoutDirにコピーされないのはなぜですか?
さようならStackExchange 2017

17

json-loaderは、配列の場合はjsonファイルをロードしません。この場合、たとえば、キーがあることを確認する必要があります。

{
    "items": [
    {
      "url": "https://api.github.com/repos/vmg/redcarpet/issues/598",
      "repository_url": "https://api.github.com/repos/vmg/redcarpet",
      "labels_url": "https://api.github.com/repos/vmg/redcarpet/issues/598/labels{/name}",
      "comments_url": "https://api.github.com/repos/vmg/redcarpet/issues/598/comments",
      "events_url": "https://api.github.com/repos/vmg/redcarpet/issues/598/events",
      "html_url": "https://github.com/vmg/redcarpet/issues/598",
      "id": 199425790,
      "number": 598,
      "title": "Just a heads up (LINE SEPARATOR character issue)",
    },
    ..... other items in array .....
]}

いい人、それについては考えていませんでした!
Zachary Dahan 2017

9

これはReact&ReactNativeでのみ機能します

const data = require('./data/photos.json');

console.log('[-- typeof data --]', typeof data); // object


const fotos = data.xs.map(item => {
    return { uri: item };
});


0

私は読み込むことができませんでした。このスレッド見つけjson-fileてをES6 TypeScript 2.6。私はこのエラーを受け取り続けました:

TS2307(TS)モジュール 'json-loader!./ suburbs.json'が見つかりません

それを機能させるには、最初にモジュールを宣言する必要がありました。これが誰かのために数時間を節約することを願っています。

declare module "json-loader!*" {
  let json: any;
  export default json;
}

...

import suburbs from 'json-loader!./suburbs.json';

私はオミットしようとした場合loaderjson-loaderIから、次のエラーを得ましたwebpack

重大な変更:ローダーを使用するときに「-loader」サフィックスを省略できなくなりました。「json」の代わりに「json-loader」を指定する必要があります。https: //webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removedを参照してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.