【问题标题】:Nodejs. Proper way to include modules节点。包含模块的正确方法
【发布时间】:2018-04-18 14:05:58
【问题描述】:

我有一个 server.js 文件,其中包含模块 puppeteer。

const puppeteer = require('puppeteer');

我想在 routes.js 中运行一个使用该模块的函数。

async function getPic(arg) {
    const browser = await puppeteer.launch(/*{headless: false}*/);
    const page = await browser.newPage();
    await page.goto(arg);
    await page.setViewport({width: 1000, height: 500})
    await page.screenshot({path: 'pic.png'});

    await broswer.close();
}

当我尝试运行它时它不起作用,因为“未定义 puppeteer”。

那么解决这个问题的最佳方法是什么? Obvisouly 我无法在 routes.js 中重新包含 puppeteer 模块 那么我是否将 server.js 文件包含在 routes.js 中?或者这可能会导致模块、变量和函数被实例化两次? (一次是 server.js 运行 - 因为它是起点,一次是 routes.js 运行并重新运行 server.js)

【问题讨论】:

  • “显然我无法在 routes.js 中重新包含 puppeteer 模块” 你可以,这是正确的做法。
  • puppeteer,如果是一个设计合理的模块,应该可以是多个文件中的required。这里唯一的风险是,如果模块在成为 required 时做了一些有副作用的事情,而一个合理的模块不会这样做。
  • @AhmedFasih - “合理的模块”是什么意思?无论你在里面写什么,require 总是只执行一次。
  • 我的意思是,如果 puppeteer 是您在 npmjs (which it is) 上找到的一个模块,它将被设计为来自您应用程序中多个位置的 require'd,所以继续前进并 @ 987654328@ 它在 routes.js 和 server.js 中,就像@Ry 说的那样。
  • @AhmedFasih - 我更感兴趣的是如何编写不是为多个地方需要而设计的模块?您无法控制 Node.js 如何处理需求。每个模块(基本上是每个文件)都可以从多个地方需要,无论你在里面写什么。

标签: javascript node.js


【解决方案1】:

在 routes.js 中写入 const puppeteer = require('puppeteer');,这就是 Node.js 的工作方式。每个单独的模块都表现得像单例,它在第一次需要时执行,然后保存到内存中。接下来的 require 只是返回指向该内存的指针(因此需要来自 server.js 和 routes.js 的 puppeteer 将指向同一个对象)。

【讨论】:

  • 谢谢!但是除了简单地包含一个模块...如果您想对包含的模块进行一些配置...是否建议在第一个要求中也这样做?或者您在 .js 文件上执行此操作,该模块将在其中发挥作用?
  • @user1584421 - 我有文件夹“组件”用于需要一些初始化和配置的模块。所以在那个组件文件夹中,我有一个名为“myMongoose”的文件夹,它需要猫鼬,设置它,它还返回原始(和配置的)猫鼬模块。在应用程序的其余部分,我需要“myMongoose”,它保证我它具有正确的配置,并且它允许我轻松地模拟组件(仅基于一些配置我可以返回猫鼬或者我可以返回看起来像猫鼬的模拟)
  • 谢谢!然后你通过 module.exports 暴露它?
  • @user1584421 - 是的
  • 但是 require 语句在 module.exports 里面?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2016-07-19
  • 1970-01-01
  • 2021-04-28
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多