我正在调查React,并开始尝试使用sass-loader处理CSS / SCSS模块。我已经完成了大部分设置,但我遇到了一个问题,我不太确定该如何解决,下面是一个场景:
ComponentA.jsx
import React from 'react';
import ComponentB from './app/components/ComponentB.jsx';
// Importing Core CSS module for component A
require("./ComponentA.scss");
export default class ComponentA extends React.Component{
constructor(){
...
}
render(){
return (
<div>
<ComponentB />
</div>
);
}
}
ComponentB.jsx
import React from 'react';
// Importing CSS module for component B with some overriding content for component A
require("./ComponentB.scss");
export default class ComponentB extends React.Component{
constructor(){
...
}
render(){
return (
...
);
}
}
webpack.config.js
var path = require("path");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
devServer: {
contentBase: path.join(__dirname, "../build")
},
entry: path.join(__dirname,"../app/ComponentA.jsx"),
module:{
loaders: [
{
test: /\.jsx?$/,
loader: 'babel',
query: {
presets: ['react', 'es2015']
}
},
{
test: /\.(scss|css)$/,
loader: ExtractTextPlugin.extract(['css','sass'])
},
...
]
},
output: {
path: path.join(__dirname, "..", "build"),
filename: "bundle.js",
publicPath: "/"
},
plugins: [
new ExtractTextPlugin(
"style.css",
{ allChunks: true }
)
]
};
从这个设置中,Webpack按预期工作并创建了新文件style.css(当然是虚拟的,因为我在开发中),但是... SCSS内容文件的渲染顺序不是我想象中的那样。
结果的style.css内容排列如下:
- ComponentB.scss内容
- ComponentA.scss内容
- ComponentA.scss内容
- ComponentB.scss内容
因此,问题是: 如何配置sass-loader以按树形结构加载模块? 甚至更简单的是... 有更好的方法吗?
require
并在所需本地化的类中添加:local
,以便在编译时进行内联。但是你不必担心这个问题。这样做的好处当然是CSS文件不会在所有页面上加载,而只会在需要它的页面上加载。如果你想了解更多信息,请点击这里。 - Dan Mindru