Triển khai mô-đun ES6, cách tải tệp json


87

Tôi đang triển khai một ví dụ từ https://github.com/moroshko/react-autosuggest

Mã quan trọng như sau:

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

Mã sao chép-dán này từ ví dụ (hoạt động), có lỗi trong dự án của tôi:

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

Nếu tôi lấy ra tiền tố json !:

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

Bằng cách này, tôi không gặp lỗi tại thời điểm biên dịch (nhập xong). Tuy nhiên, tôi gặp lỗi khi thực thi nó:

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

Nếu tôi gỡ lỗi nó, tôi có thể thấy vùng ngoại ô là một objectc, không phải là một mảng nên chức năng lọc không được xác định.

Tuy nhiên trong ví dụ được nhận xét gợi ý là một mảng. Nếu tôi viết lại các đề xuất như thế này, mọi thứ đều hoạt động:

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

Vậy ... json! tiền tố đang làm gì trong quá trình nhập?

Tại sao tôi không thể đưa nó vào mã của mình? Một số cấu hình babel?


1
Xin vui lòng, vui lòng đánh giá lại câu trả lời đã chọn, đây là thực sự muốn bạn đang sử dụng mô-đun ES6. Bạn không cần bất cứ thứ gì, chỉ cần một JS hiểu các mô-đun ES6. stackoverflow.com/a/53878451/124486
Evan Carroll

Câu trả lời:


156

Trước hết, bạn cần cài đặt json-loader:

npm i json-loader --save-dev

Sau đó, có hai cách bạn có thể sử dụng nó:

  1. Để tránh thêm json-loadertừng thứ importbạn có thể thêm vào webpack.configdòng này:

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

    Sau đó nhập jsoncác tệp như thế này

    import suburbs from '../suburbs.json';
    
  2. Sử dụng json-loadertrực tiếp trong của bạn import, như trong ví dụ của bạn:

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

Lưu ý: Trong webpack 2.*thay vì loaderscần sử dụng từ khóa rules.,

cũng webpack 2.*sử dụng json-loadertheo mặc định

Các tệp * .json hiện được hỗ trợ mà không có trình tải json. Bạn vẫn có thể sử dụng nó. Nó không phải là một thay đổi đột phá.

v2.1.0-beta.28


1
Cảm ơn bạn rất nhiều! Tài liệu cho json-loader thực sự hiển thị các cài đặt cho webpack v2, vì vậy không có gì hiệu quả với tôi (sử dụng v1!). Vì vậy, đối với tất cả các bạn ngoài kia, hãy sử dụng bộ nạp, không phải quy tắc! Ngoài ra, hãy thay đổi 'use' bên trong đối tượng đó thành 'loader', giống như câu trả lời này!
nbkhope

5
Như @ alexander-t đã đề cập, bây giờ bạn có thể nhập tệp json mà không cần trình tải json, nhưng nếu bạn gặp sự cố không nhận dạng được trình tải json, bạn chỉ nên thêm hậu tố '-loader' trong cấu hình trình tải. như thế này:{ test: /\.json$/, loader: 'json-loader' }
cvetanov

Tại sao json đã nhập không được sao chép vào outDir nếu nó được nhập thông qua bản ghi?
Tạm biệt StackExchange

17

json-loader không tải tệp json nếu đó là mảng, trong trường hợp này, bạn cần đảm bảo rằng nó có khóa, chẳng hạn

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

Tốt một, không nghĩ về điều đó!
Zachary Dahan

9

Điều này chỉ hoạt động trên 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 };
});


0

Tìm thấy chủ đề này khi tôi không thể tải a json-filevới ES6 TypeScript 2.6. Tôi tiếp tục gặp lỗi này:

TS2307 (TS) Không thể tìm thấy mô-đun 'json-loader! ./ ngoại ô.json'

Để nó hoạt động, tôi phải khai báo mô-đun trước. Tôi hy vọng điều này sẽ tiết kiệm một vài giờ cho ai đó.

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

...

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

Nếu tôi cố gắng bỏ qua loadertừ json-loadertôi đã nhận lỗi sau đây từ webpack:

THAY ĐỔI ĐỘT PHÁ: Không còn được phép bỏ qua hậu tố '-loader' khi sử dụng trình tải. Bạn cần chỉ định 'json-loader' thay vì 'json', hãy xem https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


0

Nút v8.5.0 +

Bạn không cần trình tải JSON. Node cung cấp các Mô-đun ECMAScript (hỗ trợ Mô-đun ES6) với --experimental-modulescờ, bạn có thể sử dụng nó như thế này

node --experimental-modules myfile.mjs

Vậy thì nó rất đơn giản

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

Sau đó, bạn sẽ có nó liên kết với biến myJSON.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.