Jak mogę uzyskać dostęp do pliku JSON w Ecmascript 6? Poniższe nie działa:
import config from '../config.json'
Działa to dobrze, jeśli spróbuję zaimportować plik JavaScript.
webpack
i json-loader
przy jego pomocy.
Jak mogę uzyskać dostęp do pliku JSON w Ecmascript 6? Poniższe nie działa:
import config from '../config.json'
Działa to dobrze, jeśli spróbuję zaimportować plik JavaScript.
webpack
i json-loader
przy jego pomocy.
Odpowiedzi:
Proste obejście:
config.js
export default
{
// my json here...
}
następnie...
import config from '../config.js'
nie pozwala na import istniejących plików .json, ale wykonuje swoje zadanie.
"postbuild": "node myscript.js"
krok w moim pliku package.json, który używa funkcji zamiany w pliku, aby zrobić to za mnie. myscript.js const replace = require('replace-in-file'); const options = { files: '_demo/typedocs/navexReact.td.js', from: /{/, to: 'export default {', }; const convertJsonOutputToJsModule = async () => { try { const changes = await replace(options) console.log('Converted json to module in files:', changes.join(', ')); } catch (error) { console.error('Error occurred:', error); } } convertJsonOutputToJsModule()
W języku TypeScript lub przy użyciu Babel możesz zaimportować plik JSON w swoim kodzie.
// Babel
import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'
Źródła: https://hackernoon.com/import-json-into-typescript-8d465beded79
Loading failed for the module with source "example.json"
; w przeglądarce Chrome pojawia się komunikat „Nie udało się załadować skryptu modułu: serwer odpowiedział typem MIME innym niż JavaScript„ application / json ”. Ścisłe sprawdzanie typu MIME jest wymuszane dla skryptów modułu zgodnie ze specyfikacją HTML”.
tsc
ale tak naprawdę nie jest to, co się dzieje. Próbuję uruchomić moduły ES6 natywnie w przeglądarce ( <script type="module">
), a powyższe błędy są tym, co otrzymujesz, jeśli uruchomisz tę import
linię bezpośrednio. Proszę mnie poprawić, jeśli się mylę, a faktycznie chodziło Ci o to, że można importować z formatu JSON w rzeczywistym ES6.
import
instrukcję do węzła require()
(spróbuj!), A drugie łącze nie mówi nic o imporcie JSON. Problem tutaj nie dotyczy parsera ani systemu modułów, jest to moduł ładujący - moduł ładujący przeglądarki nie rozwiąże importu niczego innego niż JavaScript. Pod maską zawsze musisz użyć wywołania AJAX (fetch / XHR) i przeanalizować wynik, nawet jeśli twój łańcuch narzędzi kompilacji to abstrahuje.
Niestety ES6 / ES2015 nie obsługuje ładowania JSON poprzez składnię importu modułu. Ale ...
Można to zrobić na wiele sposobów. W zależności od potrzeb możesz sprawdzić, jak czytać pliki w JavaScript ( window.FileReader
może to być opcja, jeśli używasz przeglądarki) lub użyć innych programów ładujących, jak opisano w innych pytaniach (zakładając, że używasz NodeJS).
Najprostszym sposobem IMO jest prawdopodobnie umieszczenie JSON jako obiektu JS w module ES6 i wyeksportowanie go. W ten sposób możesz po prostu zaimportować go tam, gdzie go potrzebujesz.
Warto również zauważyć, że jeśli używasz Webpack, importowanie plików JSON będzie działać domyślnie (od webpack >= v2.0.0
).
import config from '../config.json';
Używam babel + browserify i mam plik JSON w katalogu ./i18n/locale-en.json z przestrzenią nazw tłumaczeń (do użycia z ngTranslate).
Bez konieczności eksportowania czegokolwiek z pliku JSON (co przy okazji nie jest możliwe), mogłem dokonać domyślnego importu jego zawartości z następującą składnią:
import translationsJSON from './i18n/locale-en';
Jeśli używasz węzła, możesz:
const fs = require('fs');
const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time
LUB
const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');
Jeszcze:
// config.js
{
// json object here
}
// script.js
import { config } from '../config.js';
LUB
import * from '../config.json'
W zależności od narzędzi kompilacji i struktury danych w pliku JSON może wymagać zaimportowania pliku default
.
import { default as config } from '../config.json';
np. użycie w ramach Next.js
resolveJsonModule
jest true
w tobie tsconfig.json
.
Trochę późno, ale właśnie natknąłem się na ten sam problem, próbując dostarczyć dane analityczne dla mojej aplikacji internetowej, które obejmowały wysyłanie wersji aplikacji na podstawie wersji package.json.
Konfiguracja wygląda następująco: React + Redux, Webpack 3.5.6
Moduł ładujący json nie robi zbyt wiele od czasu Webpack 2+, więc po kilku majstrowaniu przy nim skończyło się na jego usunięciu.
Rozwiązaniem, które faktycznie zadziałało, było po prostu użycie funkcji pobierania. Chociaż najprawdopodobniej wymusi to pewne zmiany w kodzie, aby dostosować się do podejścia asynchronicznego, zadziałało doskonale, zwłaszcza biorąc pod uwagę fakt, że pobieranie będzie oferować dekodowanie json w locie.
Więc oto jest:
fetch('../../package.json')
.then(resp => resp.json())
.then((packageJson) => {
console.log(packageJson.version);
});
Należy pamiętać, że ponieważ mówimy tutaj konkretnie o package.json, plik zwykle nie będzie dołączony do twojej kompilacji produkcyjnej (lub nawet dev, jeśli o to chodzi), więc będziesz musiał użyć CopyWebpackPlugin, aby mieć dostęp do podczas korzystania z funkcji pobierania.
file:///
adresów URL, a nie to, co się tutaj dzieje.
W tej chwili nie możemy import
plików z typem MIME JSON, tylko pliki z typem MIME JavaScript. Może to być funkcja dodana w przyszłości ( oficjalna dyskusja ).
fetch('./file.json')
.then(response => response.json())
.then(obj => console.log(obj))
Obecnie wymaga --experimental-json-modules
flagi , w przeciwnym razie nie jest obsługiwana domyślnie.
Spróbuj biegać
node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"
i zobacz zawartość obj wyprowadzoną do konsoli.