Bagaimana saya bisa mengakses file json di Ecmascript 6? Berikut ini tidak berfungsi:
import config from '../config.json'
Ini berfungsi dengan baik jika saya mencoba mengimpor file JavaScript.
webpack
dan json-loader
dengannya.
Bagaimana saya bisa mengakses file json di Ecmascript 6? Berikut ini tidak berfungsi:
import config from '../config.json'
Ini berfungsi dengan baik jika saya mencoba mengimpor file JavaScript.
webpack
dan json-loader
dengannya.
Jawaban:
Solusi sederhana:
config.js
export default
{
// my json here...
}
kemudian...
import config from '../config.js'
tidak mengizinkan impor file .json yang ada, tetapi melakukan pekerjaan.
"postbuild": "node myscript.js"
langkah dalam file package.json saya yang menggunakan ganti-in-file untuk melakukan ini untuk saya. 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()
Dalam TypeScript atau menggunakan Babel, Anda dapat mengimpor file json dalam kode Anda.
// Babel
import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'
Referensi: https://hackernoon.com/import-json-into-typescript-8d465beded79
Loading failed for the module with source "example.json"
; di Chrome saya mendapatkan "Gagal memuat skrip modul: Server merespons dengan tipe MIME non-JavaScript" application / json ". Pemeriksaan tipe MIME ketat diterapkan untuk skrip modul per spesifikasi HTML."
tsc
tetapi itu tidak benar-benar apa yang terjadi. Saya mencoba menjalankan modul ES6 secara native di browser ( <script type="module">
) dan kesalahan di atas adalah apa yang Anda dapatkan jika Anda menjalankan import
baris itu secara langsung. Tolong perbaiki saya jika saya salah dan Anda memang bermaksud untuk mengimpor dari JSON di ES6 yang sebenarnya.
import
pernyataan ke sebuah noderequire()
tautkan (coba saja!), Dan tautan kedua tidak mengatakan apa pun tentang impor JSON. Masalahnya di sini bukan dengan parser atau sistem modul, itu adalah pemuat - pemuat peramban tidak akan menyelesaikan impor untuk hal lain selain Javascript. Di bawah tenda, Anda selalu harus menggunakan panggilan AJAX (fetch / XHR) dan mem-parsing hasilnya, bahkan jika build tool abstrak Anda.
Sayangnya ES6 / ES2015 tidak mendukung memuat JSON melalui sintaks impor modul. Tapi ...
Ada banyak cara untuk melakukannya. Tergantung pada kebutuhan Anda, Anda dapat melihat cara membaca file dalam JavaScript ( window.FileReader
bisa menjadi pilihan jika Anda menjalankan di browser) atau menggunakan beberapa loader lainnya seperti yang dijelaskan dalam pertanyaan lain (dengan asumsi Anda menggunakan NodeJS).
Cara paling sederhana IMO mungkin adalah dengan hanya menempatkan JSON sebagai objek JS ke dalam modul ES6 dan mengekspornya. Dengan begitu Anda bisa mengimpornya di tempat yang Anda butuhkan.
Juga patut dicatat jika Anda menggunakan Webpack, mengimpor file JSON akan berfungsi secara default (sejak webpack >= v2.0.0
).
import config from '../config.json';
Saya menggunakan babel + browserify dan saya memiliki file JSON di direktori ./i18n/locale-en.json dengan terjemahan namespace (untuk digunakan dengan ngTranslate).
Tanpa harus mengekspor apa pun dari file JSON (yang tidak mungkin dilakukan oleh btw), saya dapat membuat impor default kontennya dengan sintaks ini:
import translationsJSON from './i18n/locale-en';
Jika Anda menggunakan simpul, Anda dapat:
const fs = require('fs');
const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time
ATAU
const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');
Lain:
// config.js
{
// json object here
}
// script.js
import { config } from '../config.js';
ATAU
import * from '../config.json'
Bergantung pada perkakas bangunan Anda dan struktur data dalam file JSON, mungkin perlu mengimpor default
.
import { default as config } from '../config.json';
mis. penggunaan di dalam Next.js
resolveJsonModule
ada true
di Anda tsconfig.json
.
Sedikit terlambat, tetapi saya hanya menemukan masalah yang sama ketika mencoba memberikan analisis untuk aplikasi web saya yang melibatkan pengiriman versi aplikasi berdasarkan versi package.json.
Konfigurasi adalah sebagai berikut: React + Redux, Webpack 3.5.6
Json-loader tidak melakukan banyak hal sejak Webpack 2+, jadi setelah beberapa mengutak-atiknya, saya akhirnya menghapusnya.
Solusi yang benar-benar bekerja untuk saya, hanya menggunakan fetch. Sementara ini kemungkinan besar akan memberlakukan beberapa perubahan kode untuk beradaptasi dengan pendekatan async, itu bekerja dengan sempurna, terutama mengingat fakta bahwa fetch akan menawarkan json decoding on the fly.
Jadi begini:
fetch('../../package.json')
.then(resp => resp.json())
.then((packageJson) => {
console.log(packageJson.version);
});
Perlu diingat, bahwa karena kita berbicara tentang package.json khusus di sini, file tersebut biasanya tidak akan disertakan dalam build produksi Anda (atau bahkan dev dalam hal ini), jadi Anda harus menggunakan CopyWebpackPlugin untuk memiliki akses ke saat menggunakan fetch.
file:///
URL, yang tidak terjadi di sini.
Saat ini, kami tidak dapat import
file dengan tipe mime JSON, hanya file dengan tipe mime JavaScript. Mungkin fitur yang ditambahkan di masa depan ( diskusi resmi ).
fetch('./file.json')
.then(response => response.json())
.then(obj => console.log(obj))
Saat ini membutuhkan --experimental-json-modules
bendera , jika tidak didukung secara default.
Coba jalankan
node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"
dan lihat konten obj yang dikeluarkan untuk konsol.