I am having a problem, that the common sass styles in my reactjs project end up redundantly in the client bundle…
1) I have a set of base styles:
/src/frontend/sass/
base.scss the master file, which imports the following…
├ common.sass
├ colors.sass
├ breakpoints.sass
├ forms.sass
└ ...
2) and a webpack project with '.sass' Files per component…
Input/style.sass
Modal/style.sass
TeaserPage/style.sass
…
3) every component style files get's an '@import base.scss' injected in webpack.config, such that I can access variables, mixins or extend a class...
{
test: /\.(sass|scss)$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader',
{
loader: 'sass-loader',
options: {
data: `@import '${resolve(__dirname, 'src', 'frontend', 'sass').replace(/\\/g, '/')}/base';`,
sourceMap: false
}
}
]
})
},
这对于开发来说都很好(使用 react-hot-loader
),但在发布模式下,当我想构建一个紧凑的客户端捆绑包时,这会导致40倍的冗余(......来自40个组件) .
问题是→certainly →not →new,仍然是webpack 3的正确解决方案?
-
Concatenation first, processing then?
-
A (working, non-outdated) import-once module?
-
(terrible workaround): keeping variables/mixins vs. base styles separate (这会将表格或断点撕成碎片)
-
or could I somehow do a webpack config like...?
(如果我正确理解webpack语法,请阅读↑自下而上↑...)
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader', options: { importLoaders: 1 } }, 'postcss-loader',
3) do your sass→css conversion and post thing
{
loader: 'sass-loader',
2) ...load (concatenate to 1) component styles
},
{
loader: 'sass-loader',
1) ...load that base.sass
},
]
})
- ...或者是否有一个非过时的(或者这些天甚至包括在webpack本身?)某个地方的sass-import-once功能?
我找到了optimize-css-assets-webpack-plugin(对于webpack 3,你需要 @3.2.0
),它可以作为某种修复方式 . 清理最后阶段的混乱,但不是,我宁愿想要的(即:通过首先导入一次/连接来避免创建混乱......) .