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