Estoy implementando un ejemplo de https://github.com/moroshko/react-autosuggest
El código importante es así:
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);
}
Este código de copiar y pegar del ejemplo (que funciona), tiene un error en mi proyecto:
Error: Cannot resolve module 'json' in /home/juanda/redux-pruebas/components
Si saco el prefijo json !:
import suburbs from '../suburbs.json';
De esta manera no obtuve errores en el momento de la compilación (la importación está lista). Sin embargo, obtuve errores cuando lo ejecuto:
Uncaught TypeError: _jsonfilesSuburbsJson2.default.filter is not a function
Si lo depuro, puedo ver que los suburbios son un objectc, no una matriz, por lo que la función de filtro no está definida.
Sin embargo, en el ejemplo se comentan las sugerencias es una matriz. Si reescribo sugerencias como esta, todo funciona:
const suggestions = suburbs
var suggestions = [ {
'suburb': 'Abbeyard',
'postcode': '3737'
}, {
'suburb': 'Abbotsford',
'postcode': '3067'
}, {
'suburb': 'Aberfeldie',
'postcode': '3040'
} ].filter(suburbObj => suburbMatchRegex.test(suburbObj.suburb))
Entonces ... ¡qué json! prefijo está haciendo en la importación?
¿Por qué no puedo ponerlo en mi código? ¿Alguna configuración de babel?
javascript
json
reactjs
webpack
usuario2670996
fuente
fuente
Respuestas:
Primero que nada necesitas instalar
json-loader
:Entonces, hay dos formas de usarlo:
Para evitar agregar
json-loader
en cadaimport
uno, puede agregar awebpack.config
esta línea:loaders: [ { test: /\.json$/, loader: 'json-loader' }, // other loaders ]
Luego importa
json
archivos como esteimport suburbs from '../suburbs.json';
Úselo
json-loader
directamente en suimport
, como en su ejemplo:import suburbs from 'json!../suburbs.json';
Nota: En
webpack 2.*
lugar de la palabra clave esloaders
necesario utilizarrules
.,también
webpack 2.*
usajson-loader
por defectofuente
{ test: /\.json$/, loader: 'json-loader' }
json-loader no carga el archivo json si es una matriz, en este caso debe asegurarse de que tenga una clave, por ejemplo
{ "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 ..... ]}
fuente
Esto solo funciona en 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 }; });
fuente
Con
json-loader
instalado, ahora puede simplemente usar:import suburbs from '../suburbs.json';
o, aún más simplemente:
import suburbs from '../suburbs';
fuente
Encontré este hilo cuando no pude cargar un archivo
json-file
conES6 TypeScript 2.6
. Seguí recibiendo este error:Para que funcione, primero tuve que declarar el módulo. Espero que esto le ahorre algunas horas a alguien.
declare module "json-loader!*" { let json: any; export default json; } ... import suburbs from 'json-loader!./suburbs.json';
Si intenté omitir
loader
dejson-loader
, obtuve el siguiente error dewebpack
:fuente
Nodo v8.5.0 +
No necesita el cargador JSON. El nodo proporciona módulos ECMAScript (soporte del módulo ES6) con la
--experimental-modules
bandera, puede usarlo asíEntonces es muy simple
import myJSON from './myJsonFile.json'; console.log(myJSON);
Entonces lo tendrás vinculado a la variable
myJSON
.fuente