如何在Ecmascript 6中访问json文件?以下无效:
import config from '../config.json'
如果我尝试导入JavaScript文件,则效果很好。
webpack
和json-loader
使用它。
如何在Ecmascript 6中访问json文件?以下无效:
import config from '../config.json'
如果我尝试导入JavaScript文件,则效果很好。
webpack
和json-loader
使用它。
Answers:
一个简单的解决方法:
config.js
export default
{
// my json here...
}
然后...
import config from '../config.js'
不允许导入现有的.json文件,但可以完成工作。
"postbuild": "node myscript.js"
在package.json文件中添加了一个步骤,该步骤使用replace-in-file为我完成此操作。 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()
在TypeScript或使用Babel中,您可以在代码中导入json文件。
// Babel
import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'
参考:https : //hackernoon.com/import-json-into-typescript-8d465beded79
Loading failed for the module with source "example.json"
;在Chrome上,我收到“无法加载模块脚本:服务器以非JavaScript MIME类型“ application / json”响应。根据HTML规范对模块脚本实施了严格的MIME类型检查。”
tsc
,但实际上并不是发生了什么。我正在尝试在浏览器(<script type="module">
)上本机运行ES6模块,而如果import
直接运行该行,则会得到上面的错误。如果我错了,请更正我,而实际上您的意思是可以在实际的ES6中从JSON导入。
import
语句转译到节点上require()
(尝试一下!),第二篇链接未提及JSON导入。这里的问题不在于解析器或模块系统,而是加载程序 -浏览器的加载程序无法解析Javascript以外的任何其他内容的导入。在后台,您始终必须使用AJAX调用(访存/ XHR)并解析结果,即使构建工具链将其抽象化了也是如此。
不幸的是,ES6 / ES2015不支持通过模块导入语法加载JSON。但 ...
有很多方法可以做到。根据您的需求,您可以研究如何在JavaScript中读取文件(window.FileReader
如果您正在浏览器中运行,则可以选择),也可以使用其他问题中所述的其他加载程序(假设您正在使用NodeJS)。
IMO最简单的方法可能是将JSON作为JS对象放入ES6模块并导出。这样,您就可以将其导入所需的位置。
同样值得注意的是,如果您使用的是Webpack,则默认情况下(因为webpack >= v2.0.0
),JSON文件的导入将可以进行。
import config from '../config.json';
如果您正在使用节点,则可以:
const fs = require('fs');
const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time
要么
const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');
其他:
// config.js
{
// json object here
}
// script.js
import { config } from '../config.js';
要么
import * from '../config.json'
根据您的构建工具和JSON文件中的数据结构,可能需要导入default
。
import { default as config } from '../config.json';
例如在 Next.js
resolveJsonModule
是true
你tsconfig.json
。
有点晚了,但是当我尝试为我的Web应用程序提供涉及基于package.json版本发送应用程序版本的分析时,我偶然发现了同一问题。
配置如下:React + Redux,Webpack 3.5.6
自从Webpack 2+以来,json-loader并没有做太多事情,所以在摆弄它之后,我最终将其删除。
实际上对我有用的解决方案只是使用fetch。尽管这很可能会强制执行一些代码更改以适应异步方法,但它的运行效果非常好,特别是考虑到fetch可以即时提供json解码的事实。
所以这里是:
fetch('../../package.json')
.then(resp => resp.json())
.then((packageJson) => {
console.log(packageJson.version);
});
请记住,由于我们在这里专门讨论package.json,因此该文件通常不会捆绑在您的生产版本中(甚至是开发包),因此您必须使用CopyWebpackPlugin来访问使用提取时将其保存。
file:///
URL 加载,而不是在这里发生。
目前,我们不能import
使用JSON MIME类型的文件,而只能使用JavaScript MIME类型的文件。它可能是将来添加的功能(正式讨论)。
fetch('./file.json')
.then(response => response.json())
.then(obj => console.log(obj))
目前需要--experimental-json-modules
标志,否则默认情况下不支持。
尝试跑步
node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"
并查看输出到控制台的obj内容。