Implementierung von ES6-Modulen, Laden einer JSON-Datei


86

Ich implementiere ein Beispiel von https://github.com/moroshko/react-autosuggest

Wichtiger Code ist wie folgt:

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);
}

Dieser Code zum Kopieren und Einfügen aus dem Beispiel (der funktioniert) hat einen Fehler in meinem Projekt:

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

Wenn ich das Präfix json herausnehme!:

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

Auf diese Weise habe ich beim Kompilieren keine Fehler erhalten (der Import ist abgeschlossen). Bei der Ausführung sind jedoch Fehler aufgetreten:

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

Wenn ich es debugge, sehe ich, dass Vororte ein Objektc und kein Array sind, sodass die Filterfunktion nicht definiert ist.

Im Beispiel wird jedoch kommentiert, dass Vorschläge ein Array sind. Wenn ich solche Vorschläge umschreibe, funktioniert alles:

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

Also ... was für ein Json! Präfix macht im Import?

Warum kann ich es nicht in meinen Code einfügen? Eine Babel-Konfiguration?


1
Bitte, bitte, bitte bewerten Sie die gewählte Antwort neu. Dies ist eigentlich der Wunsch, dass Sie ES6-Module verwenden. Sie brauchen überhaupt nichts, nur einen JS, der ES6-Module versteht. stackoverflow.com/a/53878451/124486
Evan Carroll

Antworten:


155

Zunächst müssen Sie installieren json-loader:

npm i json-loader --save-dev

Dann gibt es zwei Möglichkeiten, wie Sie es verwenden können:

  1. Um zu vermeiden, dass Sie json-loaderjeweils importetwas hinzufügen, können Sie webpack.configdieser Zeile Folgendes hinzufügen :

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

    Importieren Sie dann solche jsonDateien

    import suburbs from '../suburbs.json';
  2. Verwenden Sie json-loaderdirekt in Ihrem import, wie in Ihrem Beispiel:

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

Hinweis: In webpack 2.*anstelle von Schlüsselwort loadersmuss verwendet werden rules.,

auch webpack 2.*verwendet json-loaderstandardmäßig

* .json-Dateien werden jetzt ohne den json-loader unterstützt. Sie können es weiterhin verwenden. Es ist keine bahnbrechende Veränderung.

v2.1.0-beta.28


1
Ich danke dir sehr! Die Dokumentation für json-loader zeigte tatsächlich die Einstellungen für Webpack v2, sodass für mich nichts funktionierte (mit v1!). Verwenden Sie also für Sie alle da draußen Lader, keine Regeln! Ändern Sie außerdem 'use' in diesem Objekt in 'loader', genau wie diese Antwort!
nbkhope

5
Wie bei @ alexander-t erwähnt, können Sie jetzt JSON-Dateien ohne den JSON-Loader importieren. Wenn Sie jedoch auf ein Problem stoßen, bei dem der JSON-Loader nicht erkannt wird, sollten Sie der Loader-Konfiguration einfach ein Suffix '-loader' hinzufügen wie { test: /\.json$/, loader: 'json-loader' }
folgt

Warum wird der importierte JSON nicht in outDir kopiert, wenn er über Typoskript importiert wird?
Auf Wiedersehen StackExchange

17

json-loader lädt keine json-Datei, wenn es sich um ein Array handelt. In diesem Fall müssen Sie beispielsweise sicherstellen, dass es einen Schlüssel enthält

{
    "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 .....
]}

Schön, habe nicht darüber nachgedacht!
Zachary Dahan

7

Dies funktioniert nur bei React & React Native

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

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


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


0

Fand diesen Thread , wenn ich nicht laden konnte json-filemit ES6 TypeScript 2.6. Ich bekam immer wieder diesen Fehler:

TS2307 (TS) Modul 'json-loader! ./ suburbs.json' kann nicht gefunden werden.

Damit es funktioniert, musste ich zuerst das Modul deklarieren. Ich hoffe, das spart jemandem ein paar Stunden.

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

...

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

Wenn ich weglassen versuche loaderaus json-loaderIch habe die folgenden Fehler aus webpack:

BREAKING CHANGE: Bei Verwendung von Loadern darf das Suffix '-loader' nicht mehr weggelassen werden. Sie müssen 'json-loader' anstelle von 'json' angeben, siehe https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


0

Knoten v8.5.0 +

Sie benötigen keinen JSON-Loader. Node stellt ECMAScript-Modulen (ES6-Modulunterstützung) das --experimental-modulesFlag zur Verfügung. Sie können es so verwenden

node --experimental-modules myfile.mjs

Dann ist es sehr einfach

import myJSON from './myJsonFile.json';
console.log(myJSON);

Dann haben Sie es an die Variable gebunden myJSON.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.