【问题标题】:JSON file accessible without module exports无需模块导出即可访问的 JSON 文件
【发布时间】:2021-03-02 15:18:49
【问题描述】:

在一个教程中,作者说“require”函数可以执行其他文件,但它不能访问其他文件的函数和变量,除非它们通过模块导出来导出。

但如果文件是 JSON,则默认导出。其他文件无需模块导出即可访问。为什么?

例如,

index.js

let app = require('./app');
let greetings = require('./greetings.json');
console.log('greetings', greetings); // Won't throw error
app.greet(); // throw Error

app.js

    function greet() {
       console.log('hello')
    }
    greet()

greetings.json

{
   english: "Hello",
   spanish: "Hola"
}

【问题讨论】:

    标签: node.js requirejs node-modules


    【解决方案1】:

    您似乎在 app.js 中调用了 greet 函数而不是导出它,因此您无法访问该方法。您已经加载了应用程序文件,但没有告诉模块可以从中访问什么。另一边的文件是整体加载的。

    因此,如果您要将 greet 函数导出为默认函数或模块的一部分

    module.exports = greet
    

    这将使它可以调用。

    【讨论】:

    • 我想我在我的问题中提到了所有这些。我的问题是为什么在没有导出的情况下调用 greet() 会引发错误,但问候 JSON 值不会引发错误
    • 就像我从您的代码中所说的那样,应该会发生以下情况。你应该得到一个 Hello,因为你需要 app.js 并在那里调用 greet()。您加载了整个 json 文件,它现在作为对象而不是作为函数存在于 index.js 中。您将在加载 Json 文件时记录它的内容。当您从 app.js 调用“私有”函数时,您会收到错误消息。如果您想从 app.js 访问任何内容,您必须将其导出。在您这样做之前,它是不可见的。
    【解决方案2】:

    这就是 CommonJS 模块的工作方式。您必须指定要成为模块的公共对象。其余的你可能想要私密,在外面不可见。我认为这是一个很好的架构决策,除了你想要私有的东西之外,所有的东西都是私有的。这使代码更安全。

    但是你给出的 JSON,它是数据的表示,那你为什么希望它有私有/公共部分呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多