我想在我的 JavaScript 代码中包含几个 JSON 文件,它们与我的 JavaScript 源文件位于同一目录中。
如果我想包含另一个 JavaScript 文件,我可以简单地使用 require
。现在我使用 readFileSync
和 __dirname
来获取 JSON,我认为这是一种丑陋的方式。
是否有类似的要求使我能够加载 JSON 文件?
从节点 v0.5.x 开始,是的,您可以像需要 js 文件一样需要 JSON。
var someObject = require('./somefile.json')
在 ES6 中:
import someObject from ('./somefile.json')
JSON 文件不需要显式的导出语句。您无需导出即可将其用作 Javascript 文件。
因此,您可以仅将 require
用于有效的 JSON 文档。
数据.json
{
"name": "Freddie Mercury"
}
main.js
var obj = require('data.json');
console.log(obj.name);
//Freddie Mercury
最常见的两种
第一种方式:
let jsonData = require('./JsonFile.json')
let jsonData = require('./JsonFile')
// 如果我们省略 .json 也可以
或者
import jsonData from ('./JsonFile.json')
第二种方式:
1) 同步
const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))
2) 异步
const fs = require('fs')
let jsonData = {}
fs.readFile('JsonFile.json', 'utf-8', (err, data) => {
if (err) throw err
jsonData = JSON.parse(data)
})
注意:1)如果我们改变了 JsonFile.json ,即使我们重新运行 require('./JsonFile.json') 也不会得到新的数据
2) fs.readFile 或 fs.readFileSync 将始终重新读取文件,并获取更改
不可以。请使用 readFile
或 readFileSync
(后者仅在启动时使用)。
或使用现有的库,如
cjson
或者将您的配置写入 js 文件而不是 json 文件,例如
module.exports = {
// json
}
__dirname
来制作相对路径。
一个用于节点 15 模块的漂亮的非缓存异步单线:
import { readFile } from 'fs/promises';
const data = await readFile('{{ path }}').then(json => JSON.parse(json)).catch(() => null);
您可以使用 node.js v14 实验性 json 模块标志导入 json 文件。更多详情here
文件.js
import data from './folder/file.json'
export default {
foo () {
console.log(data)
}
}
你用 node --experimental-json-modules file.js
调用它
您甚至可以在不指定扩展名 .json 的情况下使用 JSON 的 require。它可以让您将文件扩展名更改为 .js,而无需对导入进行任何更改。
假设我们在同一目录中有 ./myJsonFile.json 。
const data = require('./myJsonFile')
如果将来您将 ./myJsonFile.json 更改为 ./myJsonFile.js,则在导入中不应更改任何内容。
./myJsonFile.js
令人困惑。如果它具有 .js 扩展名,为什么它会被称为“myJsonFile”?不过还有一个有用的事实:如果您使用 require('./file')
并且 file.js
和 file.json
都存在,那么它将使用 file.js
。
您可以使用模块来创建需求。
import { createRequire } from 'module'
const require = createRequire(import.meta.url)
const foo = require('./foo.js')
如果您使用的是 typescript,您可以在 tsconfig.json 中添加一个名为 resolveJsonModule: true 的新字段,然后您可以像这样导入任何 .json 文件的所有信息:
import * as jsonfile from "./path/to/json"
.json
似乎很重要.json
以外的其他文件解析为 json,您可以教 require 如何读取它。require.extensions['.har'] = require.extensions['.json']; var blar = require('./file.har');
现在将被视为 json