【问题标题】:is there a require for json in node.jsnode.js 中是否需要 json
【发布时间】:2011-11-02 01:06:59
【问题描述】:

我想在我的 JavaScript 代码中包含几个 JSON 文件,它们与我的 JavaScript 源文件位于同一目录中。

如果我想包含另一个 JavaScript 文件,我可以简单地使用 require。 现在我使用readFileSync__dirname 来获取JSON,我认为这是一种丑陋的方式。

是否有类似于 require 的东西可以让我加载 JSON 文件?

【问题讨论】:

标签: json node.js require


【解决方案1】:

从节点 v0.5.x 开始,是的,您可以像需要 js 文件一样需要 JSON。

var someObject = require('./somefile.json')

在 ES6 中:

import someObject from ('./somefile.json')

【讨论】:

  • 你需要使用 require('./somefile.json') 假设文件在同一个目录中(注意点和斜线)。
  • 这有一个问题。结果将被缓存!因此,如果您出于某种原因需要再次加载数据(例如在 cronjob 中),您将得到相同的旧结果。
  • 注意:扩展名.json 似乎很重要
  • 格式良好的 json 也有帮助
  • 请注意,如果您确实希望将 .json 以外的其他文件解析为 json,您可以教 require 如何读取它。 require.extensions['.har'] = require.extensions['.json']; var blar = require('./file.har'); 现在将被视为 json
【解决方案2】:

JSON 文件不需要显式的导出语句。您无需导出即可将其用作 Javascript 文件。

因此,您可以只使用require 来获取有效的 JSON 文档。

data.json

{
  "name": "Freddie Mercury"
}

main.js

var obj = require('data.json');

console.log(obj.name); 
//Freddie Mercury

【讨论】:

    【解决方案3】:

    两个最常见的

    第一种方式:

    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 将始终重新读取文件,并获取更改

    【讨论】:

    • 请注意,fs 方法使用启动节点的目录作为起点,而不是执行读取的源代码所在的目录,而“require”方法使用相对于导入源代码位置。因此,只要将内容存储在不同的文件夹中,两种方法之间的路径就会有所不同。
    【解决方案4】:

    没有。使用readFilereadFileSync(后者仅在启动时使用)。

    或使用现有的库,如

    或者将您的配置写入 js 文件而不是 json 文件,例如

    module.exports = {
      // json
    }
    

    【讨论】:

    • @coen 是的,我们总是使用__dirname 来制作相对路径。
    • 跑到这里,它将在本地导入 JSON,但不在 AWS 中我的 EC2 实例上的 docker 容器中......我没有尝试配置 mime 类型,而是切换到 JS 而不是JSON。希望这可以帮助某人。
    【解决方案5】:

    一个用于节点 15 模块的漂亮的非缓存异步单线:

    import { readFile } from 'fs/promises';
    
    const data = await readFile('{{ path }}').then(json => JSON.parse(json)).catch(() => null);
    

    【讨论】:

      【解决方案6】:

      您可以使用 node.js v14 实验性 json 模块标志导入 json 文件。更多详情here

      file.js

      import data from './folder/file.json'
      
      export default {
        foo () {
          console.log(data)
        }
      }
      

      你用node --experimental-json-modules file.js调用它

      【讨论】:

        【解决方案7】:

        您甚至可以在不指定扩展名 .json 的情况下使用 JSON 的 require。 它可以让您将文件扩展名更改为 .js,而无需对导入进行任何更改。

        假设我们在同一目录中有 ./myJsonFile.json

        const data = require('./myJsonFile')
        

        如果将来您将 ./myJsonFile.json 更改为 ./myJsonFile.js,则在导入中不应进行任何更改。

        【讨论】:

        • 这令人困惑。您提出的想要将 json 要求更改为 js 要求的示例是想象力的延伸。您的答案应该坚持事实并避免假设情况。我还建议您假设的文件名 ./myJsonFile.js 令人困惑。如果它具有 .js 扩展名,为什么它会被称为“myJsonFile”?不过还有一个有用的事实:如果您使用require('./file') 并且file.jsfile.json 都存在,那么它将使用file.js
        【解决方案8】:

        你可以使用一个模块来创建一个需求。

        import { createRequire } from 'module'
        const require = createRequire(import.meta.url)
        const foo = require('./foo.js')
        

        【讨论】:

          【解决方案9】:

          如果你使用 typescript,你可以在你的 tsconfig.json 中添加一个名为 resolveJsonModule: true 的新字段,然后你可以像这样导入任何.json文件的所有信息:

          import * as jsonfile from "./path/to/json"

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-04
            • 1970-01-01
            • 2014-04-15
            • 2017-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多