Как правильно импортировать внешние SCSS с помощью webpack и Vue.Яш?

как в Примере Material Component Web, я хочу иметь возможность импортировать SCSS из my node_modules такой:

@import '@material/elevation/mdc-elevation';

однако я получаю это сообщение об ошибке при попытке запустить сборку webpack:

File to import not found or unreadable: @material/elevation/mdc-elevation.

@import './~/@material/elevation/mdc-elevation.scss'; не работает.

Я уверен, что проблема где-то в моей конфигурации webpack, но я не могу понять, где.

что они сделали в Материальные Компоненты Web ' s Vue.Яш пример для того, чтобы заставить его работать?

вот мой npm-debug.log в случае, если вам это нужно. И вот соответствующий репозиторий Git: sk22/spg-tinf-sem03 / proj01

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

Edit: я хочу иметь возможность импортировать scss файлы, а не скомпилированный css.

2 ответов


получил его.

вот часть моей конфигурации webpack 2 module.rules:

{
  test: /\.(sass|scss)$/,
  use: [
    'style-loader',
    'css-loader',
    {
      loader: 'sass-loader',
      options: {
        includePaths: [path.resolve(__dirname, 'node_modules')],
      },
    },
  ],
},

так что же я сделал не так? Мой options объект был помещен в правило напрямую, а не в загрузчик.

старое правило конфигурации webpack выглядело так:

{
  test: /\.(sass|scss)$/,
  use: ['style-loader', 'css-loader', 'sass-loader'],
  options: { includePaths: [path.resolve(__dirname, './node_modules')] },
},

видите разницу? Вместо строки "Sass-loader" я расширил ее до объекта, содержащего loader имя и по крайней мере с моей предыдущей конфигурации. Но это нарушит 3rd party SCSS фреймворки вроде Материальные Компоненты Web, потому что они используют @import заявления без ~ сами, например здесь.

внутри .файлы Vue

это не будет работать .файлы Vue, как vue-loader просто использует Sass-loader без каких-либо вариантов по умолчанию. Поэтому, если вы хотите, чтобы это работало, вам, вероятно, нужно использовать собственные параметры Vue-loader, как описано в его документация.

(Я не могу заставить его работать по какой-то причине я не знаю...)


EDIT: Webpack теперь имеет раздел на Sass-loader:https://webpack.js.org/loaders/sass-loader/ также упоминая includepaths.

у меня была такая же проблема с @material и Vue. Мне удалось решить проблему, не регулируя use собственность напрямую.

решение

Шаг 1: сначала создайте проект Vue 2.1 По умолчанию с помощью CLI. Ваша файловая структура будет иметь ./build справочник.

Шаг 2: откройте файл "utils" вы увидите cssLoaders() функция, которая возвращает объект / карту для языков vue-loader поддерживает.

вы увидите как sass и scss в этой карте.

Шаг 3: изменить значения sass и scss в:

  sass:    generateLoaders('sass', {
    indentedSyntax: true,
    includePaths:   [path.resolve(__dirname, '../node_modules')]
  }),
    scss:    generateLoaders('sass', {
  includePaths: [path.resolve(__dirname, '../node_modules')]
}),

Шаг 4: перейти на .файл Vue вы используете и изменить в своем <style> элемент либо sass или scss.

Шаг 5: после того, как вы это сделали, перейдите к терминалу/консоли и установите sass-loader С:

npm установить узел Sass-loader-Sass webpack --save-dev

Шаг 6: запустите npm run dev и это должно сработать.

почему это работает?

библиотеки

я покопался немного и оказалось Сасс-погрузчик использует node-sass который имеет некоторые параметры, такие какincludePaths упомянутая @22samuelk. IncludePaths сообщает node-sass или, скорее, базовую библиотеку LibSass включить файлы sass из этого каталога / пути.

Vue

параметры Sass-loader

по умолчанию Vue ожидает, что ваши активы будут в ваших проектах (поправьте меня, если я ошибаюсь). Однако вы можете использовать ~ чтобы указать, что вы хотите начать с корня ваших проектов, который будет выглядеть как ' ~ / node_modules / @material/smth / mdc-smth.scss.

теперь, если вы хотите, чтобы ваш Sass-loader использовал что-то другое, чем эти параметры, вам нужно явно сказать им.

отсюда path.resolve(__dirname, '../node_modules' С находится в ./build и вам нужно использовать абсолютный путь для sass-loader чтобы понять, где искать.

Vue-погрузчик config

это не совсем специфично для вопроса, но конфигурация Vue-loader определена в vue-loader.conf.js работает следующим образом:

он использует карту, возвращенные cssLoaders() для создания загрузчиков, ожидаемых webpack. Возвращенная карта ({key:value}) используется путем предоставления key в качестве расширения файла, используемого в test: для объекта loader. The value используется в качестве объекта loader. Который хотел бы, как это:

{
  test: /\.(key)$/,
    use: [
  {
    loader: '//ld//-loader',
    options: {
      /*Options passed to generateLoaders('//ld//', options)*/
    },
  },
],
}

здесь key является расширением файла. В этом случае это будет либо sass или scss. И //ld//это загрузчик, который вы используете. Который показан в Шаг 3 as 'sass'.

надеюсь, это прояснит некоторые вещи. Это заняло некоторое время, потому что я только начал использовать Vue.