В Rails 6.0.3.4 можно было использовать Sass-loader для подстановки всех файлов SCSS без включения каждого вручную.
Это не удается в Rails 6.1 со следующей ошибкой веб-упаковщика (с конфигурацией веб-упаковщика, см. Ниже, .options = { importer: globImporter() }; // syntax for sass-loader v7
)
ERROR in ./app/javascript/packs/application.scss (./node_modules/css-loader/dist/cjs.js??ref--6-1!./node_modules/postcss-loader/src??ref--6-2!./node_modules/sass-loader/dist/cjs.js??ref--6-3!./app/javascript/packs/application.scss)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
ValidationError: Invalid options object. Sass Loader has been initialized using an options object that does not match the API schema.
- options has an unknown property 'importer'. These properties are valid:
object { implementation?, sassOptions?, prependData?, sourceMap?, webpackImporter? }
at validate (/workspace/node_modules/sass-loader/node_modules/schema-utils/dist/validate.js:98:11)
at Object.loader (/workspace/node_modules/sass-loader/dist/index.js:36:28)
Если я изменю конфигурацию на синтаксис sass-loader v8 (.sassOptions = { importer: globImporter() };
), я получу другую ошибку:
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
- configuration.module.rules[2].use[3] has an unknown property 'sassOptions'. These properties are valid:
object { ident?, loader?, options?, query? }
Как настроить его с помощью Rails 6.1 и sass-loader v8?
yarn add node-sass-glob-importer
, в Rails 6.1 используется [email protected]
# config/webpack/environment.js
const { environment } = require('@rails/webpacker')
const globImporter = require('node-sass-glob-importer');
environment
.loaders
.get('sass')
.use
.find(item => item.loader === 'sass-loader')
.options = { importer: globImporter() }; // syntax for sass-loader v7
// .sassOptions = { importer: globImporter() }; // for v8
module.exports = environment
// app/javascript/packs/application.scss
import './application.scss';
// app/javascript/packs/application.scss
@import '../stylesheets/**/*.scss';
Все вложенные таблицы стилей SCSS под app/javascript/packs
будут автоматически заменены.
Нашел решение. Для Rails 6.1 вам потребуется следующая конфигурация environment.js
webpacker:
const { environment } = require('@rails/webpacker')
const globImporter = require('node-sass-glob-importer');
environment
.loaders
.get('sass')
.use
.find(item => item.loader === 'sass-loader')
.options = { sassOptions: { importer: globImporter() } }; // <-- this!
module.exports = environment