Использование Paper.js в приложении Vue SSR - PullRequest
0 голосов
/ 01 июля 2018

Я использую пользовательское приложение Vue SSR, которое примерно соответствует примеру в официальном руководстве. Я попытался установить paper.js в него, и я получаю следующие ошибки, которые полностью воспроизводятся на этой ссылке Pastebin :

WARNING in ./node_modules/paper/dist/node/extend.js
48:32-39 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

WARNING in ./node_modules/paper/dist/node/canvas.js
Module not found: Error: Can't resolve 'canvas' in '/Users/chaseries/Desktop/ANIMATION_FINAL_2/node_modules/paper/dist/node'

WARNING in ./node_modules/paper/dist/node/self.js
Module not found: Error: Can't resolve 'jsdom' in '/Users/chaseries/Desktop/ANIMATION_FINAL_2/node_modules/paper/dist/node'

WARNING in ./node_modules/paper/dist/node/extend.js
require.extensions is not supported by webpack. Use a loader instead.

ERROR in ./node_modules/paper/dist/node/canvas.js
Module not found: Error: Can't resolve 
'jsdom/lib/jsdom/living/generated/utils' in 

Код обидчика - это просто выражение import paper from "paper"; на верхнем уровне одной из моих страниц. Приложение не запускается вообще.

Теперь это имеет смысл для меня на некотором уровне: код на стороне сервера пытается использовать paper.js и терпит неудачу с неудовлетворенными зависимостями. Поэтому я попытался переместить импорт в условный метод mounted, например:

...
mounted () {
    let paper;
    if (process.browser) {
        paper = require("paper");
    }
...
}

Webpack выдает те же предупреждения и ошибки, но на самом деле он компилируется и фактически работает. Я видел несколько других вопросов, в точности похожих на этот, которые говорят, что требуют "paper/dist/paper-full.js", а не просто "paper", но это ничего не делает, чтобы заставить меня замолчать предупреждения и ошибки.

Что здесь происходит? Почему импорт оценивается вообще, если он не будет предварительно отображаться на сервере? Я попытался решить эту проблему путем установки соответствующих библиотек, но это целое «гнездо шипов»: веб-пакет жалуется, что не может оценить некоторый специфичный для узла код, особенно в node-canvas, и все решения, которые я пробовал упал. (Я бы хотел, чтобы этот код был изоморфным, но я искренне боюсь запрыгнуть в эту кроличью нору, недостаточно зная о webpack, и учитывая недостаток документации по запуску paper.js в узле.)

Рабочий пример можно найти на моем Github для целей отладки.

Примечание: если все скомпилируется нормально, откройте ./src/page/Index.vue, повторно сохраните его, и должна появиться ошибка - это еще одна странность, которая продолжает происходить. Время от времени при сохранении, webpack выплевывает чистый зеленый и говорит, что все хорошо, только чтобы испугаться при следующем спасении.

Кроме того, вопреки тому, что я читал в другом месте, проблема, похоже, не имеет ничего общего с самим веб-пакетом, потому что импорт paper в проект веб-пакета только на стороне клиента не работает.

...