ES6模块的实现,如何加载json文件


87

我正在从https://github.com/moroshko/react-autosuggest实现一个示例

重要代码如下:

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

该示例中的复制粘贴代码(有效)在我的项目中出现错误:

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

如果我拿出前缀json !:

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

这样,我在编译时不会出错(导入已完成)。但是执行时出现错误:

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

如果我调试它,我可以看到郊区是一个对象,而不是一个数组,因此未定义过滤器功能。

但是在示例中,注释建议是一个数组。如果我像这样重写建议,那么一切都会起作用:

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

所以...什么json!前缀是在导入吗?

为什么不能将其放入代码中?一些babel配置?


1
请,请,请重新评估选择的答案,这实际上是希望您使用的是ES6模块。您根本不需要任何东西,只需要了解ES6模块的JS。 stackoverflow.com/a/53878451/124486
埃文·卡罗尔

Answers:


156

首先,您需要安装json-loader

npm i json-loader --save-dev

然后,有两种使用方式:

  1. 为了避免添加json-loader每个,import您可以添加webpack.config到此行:

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

    然后json像这样导入文件

    import suburbs from '../suburbs.json';
    
  2. json-loader直接在您的中使用import,例如您的示例:

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

注意:webpack 2.*代替关键字时loaders需要使用rules。,

也默认webpack 2.*使用json-loader

* .json文件现在不带json-loader支持。您仍然可以使用它。这不是一个重大变化。

v2.1.0-beta.28


1
非常感谢!json-loader的文档实际上是在显示webpack v2的设置,因此对我没有任何帮助(使用v1!)。因此,对于所有人来说,请使用装载程序,而不是规则!另外,就像该答案一样,将对象内部的“使用”更改为“加载器”!
nbkhope

5
如@ alexander-t所述,您现在可以在不使用json-loader的情况下导入json文件,但是,如果遇到无法识别json-loader的问题,则应在加载器配置中添加“ -loader”后缀像这样:{ test: /\.json$/, loader: 'json-loader' }
cvetanov

如果导入的json是通过打字稿导入的,为什么不将其复制到outDir中呢?
再见StackExchange

17

json-loader如果为数组,则不会加载json文件,在这种情况下,您需要确保它具有密钥,例如

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

好人,没想到!
Zachary Dahan

9

这仅适用于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 };
});

2

随着json-loader安装的,现在你可以简单地使用:

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

或者,甚至更简单地:

import suburbs from '../suburbs';

0

发现这个线程时我不能加载json-fileES6 TypeScript 2.6。我不断收到此错误:

TS2307(TS)找不到模块'json-loader!./ suburbs.json'

为了使其正常工作,我必须先声明该模块。我希望这可以为某人节省几个小时。

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

...

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

如果我试图忽略loaderjson-loader我得到了以下错误的webpack

突破性变化:使用装载程序时,不再允许省略“ -loader”后缀。您需要指定'json-loader'而不是'json',请参阅https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


0

节点v8.5.0 +

您不需要JSON加载程序。Node为ECMAScript Modules(支持ES6模块)提供了--experimental-modules标记,您可以像这样使用它

node --experimental-modules myfile.mjs

那很简单

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

然后将其绑定到变量myJSON

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.