博客 > 前端&移动端&桌面端 > React
# CRA+TailwindCSS+Sass+ElasticUI+Redux 初始化配置 ## 第一步:启动CRA,创建React App(with TS) ```sh yarn create react-app my-app --template typescript cd my-app ``` ## 第二步:安装TailwindCSS([文档](https://tailwindcss.com/docs/guides/create-react-app)) ```sh yarn add -D tailwindcss postcss autoprefixer npx tailwindcss init -p ``` 编辑`tailwind.config.js`文件: ```js /** @type {import('tailwindcss').Config} */ module.exports = { content: [ "./src/**/*.{js,jsx,ts,tsx}", ], theme: { extend: {}, }, plugins: [], } ``` 编辑最根部的css文件,如`src/index.css`或者`App.css`,在最上方添加三行: ```css @tailwind base; @tailwind components; @tailwind utilities; ``` 参考Tailwind文档的[生产优化章节](https://tailwindcss.com/docs/optimizing-for-production),给`postcss.config.js`添加相应的生产压缩配置: ```js module.exports = { plugins: { tailwindcss: {}, autoprefixer: {}, ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) } } ``` 安装cssnano: ```sh yarn add -D cssnano ``` ## 第三步:安装ElasticUI([文档](https://elastic.github.io/eui/#/guidelines/getting-started)) ```sh yarn add @elastic/eui @elastic/datemath @emotion/react moment prop-types ``` ## 第四步:安装router ```sh # 这里一定要指定版本,不同版本兼容不同,一般EUI更新比较慢, # 如果用了最新版的router,可能会和EUI不兼容, # 具体可以看下面EUI和react-router的结合文档, # 里面最新支持到哪个版本,最好就选哪个版本安装 yarn add [email protected] ``` ### react-router与Eui的结合 主体上,我们尽可能多地使用react-router的“软导航”作为路由,而不是Eui的HTML原生“硬导航”。而EuiLink、breadcrumb等组件的优势也是不能忽视的。因此我们要将EUILink组件与react-router-dom的Link组件进行混合封装,以此来避免两种Link组件的难以抉择问题。 Eui官方有一份文档:<https://github.com/elastic/eui/blob/main/wiki/react-router.md> 专门提供了开箱即用的解决方案,按需选择即可。 其他情况,可以参考 <https://github.com/elastic/eui/issues/4043>,用onClick直接进行history的操作。 ## 第五步:添加SASS支持([文档](https://create-react-app.dev/docs/adding-a-sass-stylesheet)) ```sh yarn add -D sass ``` EUI自定义Theme的方式:<https://elastic.github.io/eui/#/theming/customizing-themes> 有需要的话把现有的css文件都改成scss或sass。 ## 第六步:添加Redux(Redux Toolkit)支持([文档](https://redux-toolkit.js.org/tutorials/quick-start)) ```sh yarn add @reduxjs/toolkit react-redux redux ``` ## 总结初始项目结构的变动 > **EUI和react-router的组合方式采用的是[email protected]方式** ```text src/ + eui/ + EuiCustomLink.tsx // 见EUI和react-router组合的文档 - App.css - App.test.tsx M App.tsx M index.scss <= index.css index.tsx - logo.svg react-app-env.d.ts reportWebVitals.ts setupTests.ts ``` `index.scss`: ```scss @tailwind base; @tailwind components; @tailwind utilities; @import '@elastic/eui/src/themes/amsterdam/colors_dark'; @import '@elastic/eui/src/themes/amsterdam/globals'; body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } ``` `index.tsx`: ```tsx import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.scss'; import App from './App'; import reportWebVitals from './reportWebVitals'; import {HashRouter} from 'react-router-dom'; import {EuiErrorBoundary, EuiProvider} from '@elastic/eui'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement, ); root.render( <React.StrictMode> <HashRouter> <EuiErrorBoundary> <EuiProvider colorMode="dark"> <App/> </EuiProvider> </EuiErrorBoundary> </HashRouter> </React.StrictMode>, ); // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); // reportWebVitals(console.log); ``` `APP.tsx`: ```tsx import React from 'react'; import { EuiProvider, EuiErrorBoundary } from '@elastic/eui'; const App = () => ( <EuiErrorBoundary> <EuiProvider colorMode="dark"> ... </EuiProvider> </EuiErrorBoundary> ); ```