javascript - read - Implementación de módulos es6, cómo cargar un archivo json
mostrar json en html (6)
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á hecha). Sin embargo, recibí 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, las sugerencias comentadas son 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! Qué prefijo está haciendo en la importación?
¿Por qué no puedo ponerlo en mi código? ¿Alguna configuración de babel?
Nodo v8.5.0 +
No necesita el cargador JSON.
Node proporciona
módulos ECMAScript (soporte para módulos ES6)
con el
--experimental-modules
, puede usarlo así
node --experimental-modules myfile.mjs
Entonces es muy simple
import myJSON from ''./myJsonFile.json'';
console.log(myJSON);
Luego lo vinculará a la variable
myJSON
.
Con
json-loader
instalado, ahora simplemente puede usar
import suburbs from ''../suburbs.json'';
o también, incluso más simplemente
import suburbs from ''../suburbs'';
Encontré este hilo cuando no pude cargar un
json-file
con
ES6 TypeScript 2.6
.
Seguí recibiendo este error:
TS2307 (TS) No se puede encontrar el módulo ''json-loader! ./ suburbs.json''
Para que funcione, primero tuve que declarar el módulo. Espero que esto ahorre algunas horas para alguien.
declare module "json-loader!*" {
let json: any;
export default json;
}
...
import suburbs from ''json-loader!./suburbs.json'';
Si intenté omitir el
loader
de
json-loader
, recibí el siguiente error de
webpack
:
CAMBIO DE INTERRUPCIÓN: ya no se permite omitir el sufijo ''-loader'' cuando se usan cargadores. Debe especificar ''json-loader'' en lugar de ''json'', consulte https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed
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 };
});
Primero que nada necesitas instalar
json-loader
:
npm i json-loader --save-dev
Luego, hay dos formas de cómo puede usarlo:
-
Para evitar agregar
json-loader
en cadaimport
, puede agregar awebpack.config
esta línea:loaders: [ { test: //.json$/, loader: ''json-loader'' }, // other loaders ]
Luego importe archivos
json
como esteimport suburbs from ''../suburbs.json'';
-
Use
json-loader
directamente en suimport
, como en su ejemplo:import suburbs from ''json!../suburbs.json'';
Nota:
en el
webpack 2.*
lugar de los
loaders
de palabras clave, deben usar
rules
.
también
webpack 2.*
usa
json-loader
por defecto
Los archivos * .json ahora son compatibles sin el cargador json. Aún puedes usarlo. No es un cambio radical.
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 .....
]}