ES6 modülleri uygulaması, json dosyası nasıl yüklenir


89

Https://github.com/moroshko/react-autosuggest adresinden bir örnek uyguluyorum

Önemli kod şuna benzer:

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

Örnekteki (işe yarayan) bu kopyala-yapıştır kodunun projemde bir hatası var:

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

Öneki json !:

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

Bu şekilde derleme zamanında hata almadım (içe aktarma yapıldı). Ancak çalıştırdığımda hatalar alıyorum:

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

Eğer hata ayıklarsam, banliyölerin bir nesne olduğunu, bir dizi olmadığını görebiliyorum, bu yüzden filtre fonksiyonu tanımlanmadı.

Ancak örnekte yorumlanmış öneriler bir dizidir. Önerileri şöyle yeniden yazarsam, her şey çalışır:

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

Peki ... ne json! önek içe aktarmada yapıyor mu?

Neden koduma koyamıyorum? Bazı babel konfigürasyonu?


1
Lütfen, lütfen, lütfen seçilen cevabı yeniden değerlendirin, bu aslında ES6 modüllerini kullanmanızı istiyor. Hiçbir şeye ihtiyacınız yok, sadece ES6 modüllerini anlayan bir JS. stackoverflow.com/a/53878451/124486
Evan Carroll

Yanıtlar:


157

Öncelikle yüklemeniz gerekenler json-loader:

npm i json-loader --save-dev

Ardından, onu nasıl kullanabileceğiniz iki yol vardır:

  1. Ekleyerek önlemek için json-loaderher importsen ekleyebileceğiniz webpack.configbu hat:

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

    Ardından jsonbunun gibi dosyaları içe aktarın

    import suburbs from '../suburbs.json';
    
  2. Örneğinizde olduğu gibi json-loaderdoğrudan kendi içinde kullanın import:

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

Not: In webpack 2.*yerine anahtar kelimelerinin loaderskullanılması gerek rules.

ayrıca varsayılan olarak webpack 2.*kullanırjson-loader

* .json dosyaları artık json yükleyici olmadan desteklenmektedir. Yine de kullanabilirsiniz. Bu önemli bir değişiklik değil.

v2.1.0-beta.28


1
Çok teşekkür ederim! Json-loader belgeleri aslında webpack v2 ayarlarını gösteriyordu, bu yüzden benim için hiçbir şey işe yaramadı (v1 kullanarak!). Yani dışarıdaki hepiniz için, kuralları değil, yükleyicileri kullanın! Ayrıca, bu cevapta olduğu gibi, o nesnenin içindeki 'kullan'ı' yükleyici 'olarak değiştirin!
nbkhope

5
@ Alexander-t'nin bahsettiği gibi, artık json dosyalarını json yükleyici olmadan içe aktarabilirsiniz, ancak json yükleyicinin tanınmadığı bir sorunla karşılaşırsanız, yükleyici yapılandırmasına bir '-loader' soneki eklemeniz yeterlidir. bunun gibi:{ test: /\.json$/, loader: 'json-loader' }
cvetanov

İçe aktarılan json, typcript aracılığıyla içe aktarılıyorsa neden outDir'e kopyalanmıyor?
Goodbye StackExchange

17

json-loader, diziyse json dosyasını yüklemez, bu durumda, örneğin bir anahtarı olduğundan emin olmanız gerekir.

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

Güzel olan, bunu düşünmedim!
Zachary Dahan

9

Bu sadece React & React Native üzerinde çalışıyor

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

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


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


0

Bir json-fileile yükleyemediğimde bu konuyu buldum ES6 TypeScript 2.6. Bu hatayı almaya devam ettim:

TS2307 (TS) 'json-loader! ./ suburbs.json' modülü bulunamıyor

Çalışması için önce modülü bildirmem gerekiyordu. Umarım bu, birine birkaç saat kazandırır.

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

...

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

Ben ihmal kalksa loaderdan json-loaderaşağıdaki hatayı aldım webpack:

KIRILMA DEĞİŞİMİ: Yükleyiciler kullanılırken artık '-yükleyici' sonekinin çıkarılmasına izin verilmiyor. 'Json' yerine 'json-loader' belirtmeniz gerekiyor, bkz. Https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


0

Düğüm v8.5.0 +

JSON yükleyiciye ihtiyacınız yok. Node, ECMAScript Modülleri (ES6 Modül desteği) ile --experimental-modulesbayrak sağlar, bunu şu şekilde kullanabilirsiniz

node --experimental-modules myfile.mjs

O zaman çok basit

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

Sonra onu değişkene bağlayacaksınız myJSON.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.