dts-gen ReferenceError: jQuery не определен - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать файл определения для jquery-colorbox. Я использую из своего проекта root:

dts-gen -m jquery-colorbox

, что не с:

Unexpected crash! Please log a bug with the commandline you specified.
/usr/local/lib/node_modules/dts-gen/bin/lib/run.js:130
        throw e;
        ^

ReferenceError: jQuery is not defined
    at Object.<anonymous> (/home/adr/Projects/albums/node_modules/jquery-colorbox/jquery.colorbox.js:1105:3)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/dts-gen/bin/lib/run.js:57:67)
    at Module._compile (module.js:653:30)

У меня установлены jQuery и другие необходимые библиотеки (глобально и локально). Как мне «сказать» dts-gen «загрузить» / «использовать» jQuery?

1 Ответ

0 голосов
/ 30 октября 2018

Первая проблема заключается в том, что dts-gen необходимо фактически загрузить указанный вами модуль, чтобы проверить его структуру, а jquery-colorbox ожидает, что jQuery, document и window будут определены в глобальном объекте , которых нет в Node.js. Один из возможных подходов (который я не преследовал) - использовать экспериментальную поддержку dts-gen для генерации объявлений на основе браузера . Другой способ - загрузить совместимую с Node.js реализацию DOM, такую ​​как jsdom, и установить необходимые глобальные переменные, чтобы вы могли успешно загрузить jquery-colorbox. В частности, если вы напишите в файле с именем jquery-colorbox-wrapper.js следующее (на основе этот ответ ):

var jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.jQuery = require('jquery')(window);
global.document = document;
global.window = window;
require("jquery-colorbox");

и затем запустите dts-gen --expression-file jquery-colorbox-wrapper.js, он должен успешно работать.

Тогда вы столкнетесь со второй проблемой: сгенерированный файл объявления пуст, потому что jquery-colorbox, как плагин jQuery, добавляет объекты в объект jQuery и не имеет собственного экспорта. Если вы измените скрипт-обертку так, чтобы он возвращал объект jQuery, тогда вы получите объявления для jquery-colorbox, смешанные с объявлениями самого jQuery. Разумный подход состоит в том, чтобы различать файлы объявлений, которые вы получаете для jQuery с jquery-colorbox и без него. То есть, добавьте global.jQuery; к файлу jquery-colorbox-wrapper.js, как указано выше, запустите dts-gen один раз, затем закомментируйте строку require("jquery-colorbox"); и снова запустите dts-gen с другим выходным файлом, и, наконец, отразите два файла. Это оставляет меня с jquery-colorbox -специфичными объявлениями, а также с некоторыми различиями в sizzle* переменных, имена которых содержат метку времени, которую легко удалить. Конечно, файл декларации потребует значительной очистки.

...