я использую puppeteer в модуле nodejs на MacOS 14.5
$ jq -r '.type' package.json
module
$ jq -r '.devDependencies.puppeteer' package.json
22.11.0
у меня есть базовый шаблон следующим образом
$ cat puppeteer.config.cjs
// empty config
$ cat test.js
import puppeteer from "puppeteer";
import puppeteerConfig from "./puppeteer.config.cjs";
console.info("i am a puppet");
но я получаю ошибку при выполнении
$ node test.js
node:internal/assert:14
throw new ERR_INTERNAL_ASSERTION(message);
^
Error [ERR_INTERNAL_ASSERTION]: This is caused by either a bug in Node.js or incorrect usage of Node.js internals.
Please open an issue with this stack trace at https://github.com/nodejs/node/issues
at assert (node:internal/assert:14:11)
at cjsLoader (node:internal/modules/esm/translators:347:7)
at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:297:7)
at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:123:5) {
code: 'ERR_INTERNAL_ASSERTION'
}
Node.js v20.14.0
если я изменю порядок импорта, ошибка исчезнет
$ cat test.js
import puppeteerConfig from "./puppeteer.config.cjs";
import puppeteer from "puppeteer";
console.info("i am a puppet");
$ node test.js
i am a puppet
я не могу дальше отлаживать и не понимаю, почему это происходит, и буду признателен за вашу помощь.
мой код работал нормально. затем в каждом файле я отсортировал импорт, а затем код сломался. копание заставило меня обнаружить, что порядок импорта нарушил код, и мне интересно, почему. при работе на платформе Linux у меня все работает, но на MacOS не работает.
Протестировано на MacOS с несколькими версиями Node.js, воспроизвести невозможно.
@Mureinik какая версия MacOS? это интел или яблочный кремний?
@Мистер. Сонома 14,5, процессор м2.
@Мистер. ты нам показываешь cat test.js
, но потом бежишь node src/test.js
. Это один и тот же файл?
@Mureinik, у тебя острый взгляд :) это опечатка.
@Mureinik странно, у меня такое бывает на макосах с интером и яблочным чипом.
я думаю, что это связано с механизмом кэширования импорта/требования. когда puppeteer требуется/импортируется, он требует/импортирует файл конфигурации (автоматически), который, вероятно, кэширует конфигурацию. позже, когда конфигурация снова запрашивается/импортируется, все становится запутанным...
проблема возникает из-за кэширования модулей в nodejs и в cosmiconfig , который является модулем, который puppeteer использует для чтения своего файла конфигурации
$ npm view puppeteer dependencies.cosmiconfig
9.0.0
Эту проблему можно обойти, используя cosmiconfig для чтения файла конфигурации, а не импортируя его напрямую. у меня сработало что-то следующее.
import cosmiconfig from "cosmiconfig";
const explorerSync = cosmiconfig.cosmiconfigSync("puppeteer");
const { config } = explorerSync.load("./puppeteer.config.cjs");
У меня оба отлично работают на Node 20.11.1 и Ubuntu 22.04, Pupp 22.10.0. Как правило, конфигурации хранятся на верхнем уровне, а не внутри src, и я не уверен, зачем вам вообще нужно импортировать их в скрипт. Что вы пытаетесь достичь?