Лучшие практики внешних зависимостей Sapper / Svelte / Rollup?

Умные люди!

Я новичок в сборщике, и у меня есть вопрос о зависимостях с косой чертой.

  • На yarn dev run я получаю сообщение об ошибке: Не могу найти модуль '@ sveltejs / svelte-scroller' ...
  • У меня сапер / стройный / сверток / пряжа
  • плагин svelte-scroller

Плагин по умолчанию загружается как внешний в rollup.config.js:

{ ..., server: { ..., external: <**package.json-dependencies-arr**> } ... }

И когда я использую его в .svelte-component:

import Scroller from '@sveltejs/svelte-scroller';

//...

<Scroller />

... ошибка бьет меня по лицу.

Примечания

  • rollup.config.js не отличается от клона шаблона

  • Если я удалю плагин из dependencies-arr, загруженного как внешние в rollup.config.js , ошибка исчезнет.

  • ... который сообщает мне, что накопительный пакет не должен загружать зависимость как внешнюю (при условии, что единственной целью является устранение указанной ошибки).

  • И поскольку цель svelte-scroller здесь связана с взаимодействием с клиентом, я полагаю, что он в любом случае не должен быть частью пакета.

  • Конечно, в киберпространстве есть связанные проблемы, но я не могу найти четкого примера передовой практики, как с этим справиться.

  • Поэтому мой текущий обходной путь:

     // in rollup.config.js
     import pkg from './package.json';
    
     // filter out those "not external dependencies" 
     const notExternals = ['@sveltejs/svelte-scroller'];
     const externals = Object.keys(pkg.dependencies).filter(plugin =>
         notExternals.some(not => not === plugin) ? false : true
     );
    
     export default {
         // ...,
         server: {
             // ...,
             // bundle filtered externals (along with default built in modules)
             external: externals.concat(require('module').builtinModules),
         },
         // ...
     }
    

И если ошибка повторяется с другой зависимостью, я просто добавляю ее в notExternals-arr.

Вопрос

  1. Принимая во внимание установку sapper / svelte / rollup-setup, является ли этот подход наилучшей практикой при обработке клиентских подключаемых модулей, вызывающих аналогичные ошибки?

Заранее спасибо!

Куча

internal/modules/cjs/loader.js:896
  throw err;
  ^

Error: Cannot find module '@sveltejs/svelte-scroller'
Require stack:

    - /.../__sapper__/dev/server/server.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:893:15)
    at Function.Module._load (internal/modules/cjs/loader.js:743:27)
    at Module.require (internal/modules/cjs/loader.js:965:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/.../__sapper__/dev/server/server.js:8:16)
    at Module._compile (internal/modules/cjs/loader.js:1076:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:941:32)
    at Function.Module._load (internal/modules/cjs/loader.js:782:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/.../__sapper__/dev/server/server.js'
  ]
}

Воспроизвести, если осмелишься

шаблон

npx degit "sveltejs/sapper-template#rollup" <app-name>

плагин

yarn add @sveltejs/svelte-scroller

импортировать плагин в .svelte-component

<script>
   import Scroller from '@sveltejs/svelte-scroller';
</script>

//...

<Scroller />

go

yarn run dev

person Kiiim    schedule 25.09.2020    source источник
comment
Привет @Kiiim, это очень хороший вопрос, за исключением одного момента: вы должны попытаться задать единственный вопрос; желательно, чей ответ не связан с личным мнением. Это упрощает ответ на вопрос и делает его по существу, что также может принести пользу другим людям с аналогичными проблемами.   -  person guzmonne    schedule 25.09.2020
comment
@guzmonne да, ооочень сложно сохранять лаконичность, когда ваши вопросы кажутся скованными. Но согласен, отредактировал :)   -  person Kiiim    schedule 25.09.2020


Ответы (1)


Поскольку @sveltejs/svelte-scroller является компонентом Svelte, а не модулем JS, он должен обрабатываться компилятором Svelte во время сборки, а не импортироваться во время выполнения. Другими словами, он должен быть частью вашего пакета.

Обычный способ сделать это, если содержимое dependencies обрабатывается как external, состоит в том, чтобы вместо этого добавить пакет в devDependencies:

yarn add -D @sveltejs/svelte-scroller
person Rich Harris    schedule 25.09.2020
comment
Из всех ответов это явно выделяется! Шутки в сторону, одевание всех подобных модулей, отличных от js, под devDeps, по-видимому, работает. И да, кажется логичным позволить компилятору делать свою работу. Кроме того, слово «обычный» дает мне душевный покой, когда я двигаюсь вперед с этим подходом. Спасибо, сэр @Rich. - person Kiiim; 26.09.2020