如何导出全局 scss 变量文件以导入到 Rails 6 webpacker 中的所有 scss 文件
How to export a global scss variables file to be imported to all scss files in Rails 6 webpacker
我们正在从资产管道迁移到 webpacker & 我试图为此寻找一个明确的答案几个小时,但找不到 "official way" 来将全局 scss 变量文件用于所有 scss 文件我的申请
例如:我有一个文件colors.scss
$gray: #000000;
$red: #EF6461;
& 我希望这些 scss 变量可用于我所有的 webpacker scss 文件,目前我已经在我的 application.scss
中导入了该文件,但是我在每个 scss 中都遇到了找不到这些变量的错误,因为据我所知,webpacker 将相互独立地转换 scss 文件,因此看不到我在 application.scss
中导入的变量文件
那么如何处理这个问题,使全局配置文件对 webpack(或 webpacker)配置中的所有 scss 可用,而不是手动在每个 scss 中导入配置文件?
注意:
在每个 scss 中导入配置文件解决了这个问题,但是非常重复和脆弱
更新
我在不同的尝试中遇到了不同的编译错误来解决这个问题:
1- 如果我将样式表保存在 webpacker packs 文件夹中,我会从所有 scss 文件中得到很多错误,它们不知道我正在使用的 scss 变量(这个问题的核心)
这样的错误:
ERROR in ./app/javascript/packs/stylesheets/components/blog-pages/_blog-index.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: Undefined variable: "$green".
on line 16 of xxxxxxx/app/javascript/packs/stylesheets/components/blog-pages/_blog-index.scss
>> color: $green;
---------^
2- 如果我将样式表放在 packs 文件夹旁边,我会得到其他 1 对 1 的 scss 错误,如下所示:
ERROR in ./app/javascript/stylesheets/application.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of /Users/ahmed/projects/project-hotelhero/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
ERROR in ./app/javascript/stylesheets/application.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of XXXXXXXX/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
at XXXXXXXX/node_modules/webpack/lib/NormalModule.js:316:20
at XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:367:11
at XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:233:18
at context.callback (XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
at Object.callback (XXXXXXXX/node_modules/sass-loader/dist/index.js:73:7)
at Object.done [as callback] (XXXXXXXX/node_modules/neo-async/async.js:8067:18)
at options.error (XXXXXXXX/node_modules/node-sass/lib/index.js:294:32)
Child mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--7-1!node_modules/postcss-loader/src/index.js??ref--7-2!node_modules/sass-loader/dist/cjs.js??ref--7-3!app/javascript/stylesheets/application.scss:
ERROR in ./app/javascript/stylesheets/application.scss (./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/postcss-loader/src??ref--7-2!./node_modules/sass-loader/dist/cjs.js??ref--7-3!./app/javascript/stylesheets/application.scss)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of XXXXXXXX/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
所以我遇到的主要问题是将样式表放在错误的目录中,将样式表放在 /app/javascript/packs
中,这导致了 webpack 单独转译每个 scss 文件的根本问题
正确的方法是将 stylesheets 文件夹放在 packs 文件夹旁边,即将其放在 app/javascript/stylesheets
中,然后将您的 scss 组织在一个 application.scss
文件中,该文件将按顺序调用您的 scss 文件正确。
我在 sprockets -> webpacker 迁移期间谷歌搜索时发现了这个问题,我想我会分享我的发现。
我最终使用了 sass-resources-loader,这是我的配置:
// config/webpack/environment.js
// ...
// sass/scss loader config
const sassLoader = environment.loaders.get('sass')
const sassLoaderConfig = sassLoader.use.find(function (element) {
return element.loader === 'sass-loader'
})
const options = sassLoaderConfig.options
options.implementation = require('sass') // Use Dart-implementation of Sass (default is node-sass)
const sassResourceLoader = require('./loaders/sass-resource-loader')
environment.loaders.prepend('sass', sassResourceLoader)
//...
// config/webpack/loaders/sass-resource-loader.js
module.exports = {
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader',
{
loader: 'sass-resources-loader',
options: {
resources: [
'./app/javascript/styles/abstract/*.scss' // I've got all my "global" stuff in this one abstracts folder
]
}
}
]
}
我们正在从资产管道迁移到 webpacker & 我试图为此寻找一个明确的答案几个小时,但找不到 "official way" 来将全局 scss 变量文件用于所有 scss 文件我的申请
例如:我有一个文件colors.scss
$gray: #000000;
$red: #EF6461;
& 我希望这些 scss 变量可用于我所有的 webpacker scss 文件,目前我已经在我的 application.scss
中导入了该文件,但是我在每个 scss 中都遇到了找不到这些变量的错误,因为据我所知,webpacker 将相互独立地转换 scss 文件,因此看不到我在 application.scss
那么如何处理这个问题,使全局配置文件对 webpack(或 webpacker)配置中的所有 scss 可用,而不是手动在每个 scss 中导入配置文件?
注意: 在每个 scss 中导入配置文件解决了这个问题,但是非常重复和脆弱
更新
我在不同的尝试中遇到了不同的编译错误来解决这个问题:
1- 如果我将样式表保存在 webpacker packs 文件夹中,我会从所有 scss 文件中得到很多错误,它们不知道我正在使用的 scss 变量(这个问题的核心)
这样的错误:
ERROR in ./app/javascript/packs/stylesheets/components/blog-pages/_blog-index.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: Undefined variable: "$green".
on line 16 of xxxxxxx/app/javascript/packs/stylesheets/components/blog-pages/_blog-index.scss
>> color: $green;
---------^
2- 如果我将样式表放在 packs 文件夹旁边,我会得到其他 1 对 1 的 scss 错误,如下所示:
ERROR in ./app/javascript/stylesheets/application.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of /Users/ahmed/projects/project-hotelhero/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
ERROR in ./app/javascript/stylesheets/application.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of XXXXXXXX/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
at XXXXXXXX/node_modules/webpack/lib/NormalModule.js:316:20
at XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:367:11
at XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:233:18
at context.callback (XXXXXXXX/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
at Object.callback (XXXXXXXX/node_modules/sass-loader/dist/index.js:73:7)
at Object.done [as callback] (XXXXXXXX/node_modules/neo-async/async.js:8067:18)
at options.error (XXXXXXXX/node_modules/node-sass/lib/index.js:294:32)
Child mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--7-1!node_modules/postcss-loader/src/index.js??ref--7-2!node_modules/sass-loader/dist/cjs.js??ref--7-3!app/javascript/stylesheets/application.scss:
ERROR in ./app/javascript/stylesheets/application.scss (./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/postcss-loader/src??ref--7-2!./node_modules/sass-loader/dist/cjs.js??ref--7-3!./app/javascript/stylesheets/application.scss)
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
SassError: File to import not found or unreadable: font-awesome.
on line 10 of XXXXXXXX/app/javascript/stylesheets/application.scss
>> @import "font-awesome";
^
所以我遇到的主要问题是将样式表放在错误的目录中,将样式表放在 /app/javascript/packs
中,这导致了 webpack 单独转译每个 scss 文件的根本问题
正确的方法是将 stylesheets 文件夹放在 packs 文件夹旁边,即将其放在 app/javascript/stylesheets
中,然后将您的 scss 组织在一个 application.scss
文件中,该文件将按顺序调用您的 scss 文件正确。
我在 sprockets -> webpacker 迁移期间谷歌搜索时发现了这个问题,我想我会分享我的发现。
我最终使用了 sass-resources-loader,这是我的配置:
// config/webpack/environment.js
// ...
// sass/scss loader config
const sassLoader = environment.loaders.get('sass')
const sassLoaderConfig = sassLoader.use.find(function (element) {
return element.loader === 'sass-loader'
})
const options = sassLoaderConfig.options
options.implementation = require('sass') // Use Dart-implementation of Sass (default is node-sass)
const sassResourceLoader = require('./loaders/sass-resource-loader')
environment.loaders.prepend('sass', sassResourceLoader)
//...
// config/webpack/loaders/sass-resource-loader.js
module.exports = {
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader',
{
loader: 'sass-resources-loader',
options: {
resources: [
'./app/javascript/styles/abstract/*.scss' // I've got all my "global" stuff in this one abstracts folder
]
}
}
]
}