create-react-app
是facebook的官方脚手架,对于我的开发者和中小型公司快速建立项目很是推荐。react的CSS解决方案有不少,这里我技术选型时用css modules
和sass
,而后配合antd使用通用组件库。可是create-react-app原生并不支持css modules
和sass
,因此须要额外配置。css
create-react-app
默认是没有暴露webpack
配置的,因此须要eject一下。注意若是项目在git仓库环境下,先提交代码到git仓库,不然会报错node
npm run eject
复制代码
npm install react-css-modules
npm install sass-loader node-sass
复制代码
这里安装sass可能会遇到墙的问题报错,因此要么使用cnpm或者使用本地代理设置,由于我有ss因此使用本地代理react
// 开启代理
npm config set proxy http://127.0.0.1:1080
// 安装完sass后关闭代理
npm config delete proxy
复制代码
重点来了,咱们须要给webpack
配置上css-modules
和sass-loader
。可是使用css-modules
会使node_modules
库里的css样式找不到,好比后面要使用到的antd,这个时候咱们须要inclube来排除影响node_modules
,使得css-modules
不会影响到node_modules
webpack
修改项目中config
目录下的webpack.config.dev.js
和webpack.config.prod.js
,说明下这两个文件,前一个是开发环境npm start
使用,后一个是npm run build
打包后使用git
webpack.config.dev.js
:大约在160行左右,找到test: /\.css$/
,中文注释的地方就是修改和增长的地方github
{
test: [/\.css$/, /\.scss$/],// 这里增长SCSS的支持
exclude: [/node_modules/],// 这里去排除node_modules,防止css modules影响到node_modules
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
modules: true, // 这里增长对css modules的支持
localIdentName: '[name]__[local]__[hash:base64:5]' //这里增长对css modules的支持
},
},
{
loader: require.resolve('sass-loader'), // 这里增长sass的支持
},
{
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
},
// 由于上面排除了css_modules因此这里必定要再添加个排除src来识别css_modules
// 其实就是复制以前没修改前的全部,再增长一个exclude: [/src/]
{
test: /\.css$/,
exclude: [/src/], // 这里添加排除src,
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
},
},
{
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
}
复制代码
webpack.config.prod.js
:和上面修改webpack.config.dev.js
相似web
{
test: [/\.css$/, /\.scss$/], // 这里增长SCSS的支持
exclude: [/node_modules/], // 这里去排除node_modules
loader: ExtractTextPlugin.extract(
Object.assign(
{
fallback: {
loader: require.resolve('style-loader'),
options: {
hmr: false,
},
},
use: [
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true,
modules: true, // 这里添加css modules支持
},
},
{
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
{
loader: require.resolve('sass-loader'), // 这里添加sass支持
}
],
},
extractTextPluginOptions
)
),
// Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
},
{
test: /\.css$/,
exclude: [/src/], // 排除src
loader: ExtractTextPlugin.extract(
Object.assign(
{
fallback: {
loader: require.resolve('style-loader'),
options: {
hmr: false,
},
},
use: [
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true,
},
},
{
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
}
],
},
extractTextPluginOptions
)
),
// Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
}
复制代码
主要是安装配置antd
和babel-plugin-import
,这样可使得antd
按需加载样式npm
npm install antd
npm install babel-plugin-import
复制代码
在项目根目录下增长.babelrc
文件,而后配置以下sass
{
"presets": [
"react-app"
],
"plugins": [
"transform-runtime",
[
"import",
{
"libraryName": "antd",
"style": "css"
}
]
]
}
复制代码
大功告成babel