Как мне включить стиль начальной загрузки в Svelte с помощью webpacker

#webpack #sass #svelte #svelte-3

#webpack #sass #стройный #svelte-3

Вопрос:

Я разрабатываю приложение, используя Ruby-on-Rails для серверной части и Svelte для интерфейса. В качестве RoR Svelte компилируется с использованием Webpacker (с использованием RoR Webpack для установки Svelte). Я использую Bootstrap 4 для оформления страниц. Хотя я могу использовать классы начальной загрузки в HTML-частях файла Svelte, я не могу использовать @extend в style разделе, если я не включу Bootstrap его в конкретный компонент.

Вот мои файлы. Процесс загрузки контролируется config/webpack/loaders/svelte.js :

 const autoPreprocess = require('svelte-preprocess');

module.exports = {
  test: /.svelte(.erb)?$/,
  use: {
    loader: 'svelte-loader',
    options: {
      dev: true,
      hotReload: false,
      preprocess: autoPreprocess()
    }
  }
};
 

Приложение svelte запускается в браузере с помощью HTML-файла, загружающего следующие сценарии в app/javascript/packs/start_svelte.js :

 /* eslint no-console: 0 */

// This file provides the mechanism to load the Svelte app itself.  Invoked from application.html.erb
import 'bootstrap';
import '@fortawesome/fontawesome-free/js/all';

import App from "../components/App.svelte";

document.addEventListener('DOMContentLoaded', () => {
  const app = new App({
    target: document.body,
    props: {
      name: 'Svelte'
    }
  });

  window.app = app;
});
 

Это app/javascript/components/App.svelte загружается из приведенного выше:

 <script lang="ts">
    import Router from 'svelte-spa-router'
</script>

<style lang="scss" global>
  @import 'node_modules/bootstrap/scss/bootstrap';
</style>

<!-- Navigation -->
... core page structure

<Router {routes}/>
 

У меня есть файл компонента ExpenseEntryTable.svelte . Я могу использовать классы начальной загрузки непосредственно в HTML без каких-либо проблем. Однако я могу использовать их в этом разделе только в том случае, если я включу файл Bootstrap.scss локально. Вот мой файл компонента (сокращенный):

 <script lang="ts">
    import { flip } from 'svelte/animate';

    import ExpenseEntryRow from "./ExpenseEntryRow.svelte";
    import RailsFields from "./RailsFields.svelte";

    export let expenseEntries;

    ... code to handle some interactive stuff
</script>

<div class="expenses-claim-table">
    <div class="form col-12">
        <div id="expense-entries-header" class="form-row">
            <div class="form-group col-1">Seq</div>
            <div class="form-group col-1">Date</div>

           ... more columns 
        </div>
    </div>

   ... more stuff to do with the column
</div>

<style lang="scss">
    @import "node_modules/bootstrap/scss/bootstrap"; // without this compiler throws error two lines down

    .expenses-claim-table {
        @extend .list-group;  // without local import this line generates the error
    }
</style>
 

Вот дамп ошибки компилятора Svelte, если @include не включен локально:

 ERROR in ./app/javascript/components/ExpenseEntryTable.svelte
Module build failed (from ./node_modules/svelte-loader/index.js):
Error: ".expenses-claim-table" failed to @extend ".list-group".
The selector ".list-group" was not found.
Use "@extend .list-group !optional" if the extend should be able to fail.
 

Я бы предпочел не включать @import на каждую страницу, на которой я хочу использовать классы и переменные начальной загрузки в <style> разделе, и подумал, что глобальный флаг в App.svelte сделает это ненужным. Есть предложения?