【发布时间】: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