create-react-app 里使用

create-react-app 是业界最优秀的 React 应用开发工具之一,本文会在 create-react-app 创建的工程中使用 Ant Design Landing 的模板。

使用 demo 地址请查看 landing-create-react-app-example;

安装与初始化

create-react-app 的安装和初始化请查看 create-react-app 或者查看 antd 的 use-with-create-react-app;

安装完成后,目录结构:

  1. ├── README.md
  2. ├── node_modules
  3. ├── package.json
  4. ├── .gitignore
  5. ├── public
  6. ├── favicon.ico
  7. ├── index.html
  8. └── manifest.json
  9. │── src
  10. ├── App.css
  11. ├── App.js
  12. ├── App.test.js
  13. ├── index.css
  14. ├── index.js
  15. ├── logo.svg
  16. └── serviceWorker.js

文件路径

我们直接将从 Landing 上下载的 Home 文件夹直接拷贝到 src 文件包里;

  1. ├── README.md
  2. ├── ...
  3. ├── public
  4. ├── ...
  5. │── src
  6. + ├── Home
  7. + ├── less
  8. + ├── index.js
  9. + ├── ...
  10. ├── App.css
  11. ├── App.js
  12. ├── App.test.js
  13. ├── index.css
  14. ├── index.js
  15. ├── logo.svg
  16. └── serviceWorker.js

安装依赖

详细参考开始使用里的安装依赖;

less 加载

  1. npm install react-app-rewired customize-cra less less-loader

配置加载 less

安装完 less 加载 后, 我们还需要修改 package.json 里的启动配置。

  1. /* package.json */
  2. "scripts": {
  3. - "start": "react-scripts start",
  4. + "start": "react-app-rewired start",
  5. - "build": "react-scripts build",
  6. + "build": "react-app-rewired build",
  7. - "test": "react-scripts test",
  8. + "test": "react-app-rewired test",
  9. }

创建 config-overrides.js

然后在项目根目录创建一个 config-overrides.js 用于修改默认配置。

  1. ├── README.md
  2. ├── node_modules
  3. ├── package.json
  4. ├── .gitignore
  5. +── config-overrides.js
  6. ├── public
  7. ├── ...
  8. │── src
  9. ├── Home
  10. └── ...

config-overrides.js

  1. const { override, fixBabelImports, addLessLoader } = require('customize-cra');
  2. module.exports = override(
  3. // 按需加载 antd
  4. fixBabelImports('import', {
  5. libraryName: 'antd',
  6. libraryDirectory: 'es',
  7. style: true,
  8. }),
  9. // 添加加载 less 的 javascriptEnabled 和 antd 的主题配置。
  10. addLessLoader({
  11. javascriptEnabled: true,
  12. modifyVars: { '@primary-color': '#1DA57A' },
  13. }),
  14. );

本文只引用 antd 的高级配置,同样 eject 不在本文的讨论范围,eject 可以参考 yarn run eject

修改入口文件

更改的 src 里的 index.js 页面,打开 index.js,引入 Home 文件包并渲染。

src/index.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. - import App from './App';
  5. + import App from './Home';
  6. import * as serviceWorker from './serviceWorker';
  7. ReactDOM.render(<App />, document.getElementById('root'));
  8. // If you want your app to work offline and load faster, you can change
  9. // unregister() to register() below. Note this comes with some pitfalls.
  10. // Learn more about service workers: http://bit.ly/CRA-PWA
  11. serviceWorker.unregister();

完成

完成以上步骤之后,我们再启动 npm start 即可查看在 landing 上下载的模板。

额外内容

如果是单个页面的不必要往下看。

多页面路由

带 router 的 demo 地址landing-create-react-app-example#router

create react app 并没有路由配置,所以我们需要安装 react-router-dom

安装

  1. npm install react-router-dom --save

配置路由

react-router 基本使用方法可参考 Basic Example;

将上述的 修改入口文件 更改回原始状态,然后对 APP.js 进行修改, 详细参考:

App.js

添加 Router 入口和提取 HeaderFooter。

  1. import React, { Component } from 'react';
  2. import { BrowserRouter as Router, Route, Link } from "react-router-dom";
  3. import { enquireScreen } from 'enquire-js';
  4. import Header from './Home/Nav0';
  5. import Footer from './Home/Footer0';
  6. import Home from './Home';
  7. import {
  8. Nav00DataSource,
  9. Footer00DataSource,
  10. } from './Home/data.source.js';
  11. let isMobile;
  12. enquireScreen((b) => {
  13. isMobile = b;
  14. });
  15. class App extends Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. isMobile,
  20. };
  21. }
  22. componentDidMount() {
  23. // 适配手机屏幕;
  24. enquireScreen((b) => {
  25. this.setState({ isMobile: !!b });
  26. });
  27. }
  28. render() {
  29. return (
  30. <Router>
  31. <div>
  32. <Header dataSource={Nav00DataSource} isMobile={this.isMobile} />
  33. <Route exact path="/" component={Home} />
  34. <Footer dataSource={Footer00DataSource} isMobile={this.isMobile} />
  35. </div>
  36. </Router>
  37. );
  38. }
  39. }
  40. export default App;

注: 如果觉得 enquireScreen 多次出现比较不舒服,可以选择用 React Context 或其它来传递,React Context 详细参考

添加面页

Landing 上下载的另一个页面换个名称,如 Page2, 拷贝到 src 文件包里, 注: 不需要 NavFooter, 然后再在 App.js 增加入口。

App.js
  1. import React, { Component } from 'react';
  2. ...
  3. import Home from './Home';
  4. + import Page2 from './Page2';
  5. ....
  6. class App extends Component {
  7. ...
  8. render() {
  9. return (
  10. <Router>
  11. <div>
  12. <Header dataSource={Nav00DataSource} isMobile={this.isMobile} />
  13. <Route exact path="/" component={Home} />
  14. + <Route exact path="/page2" component={Page2} />
  15. <Footer dataSource={Footer00DataSource} isMobile={this.isMobile} />
  16. </div>
  17. </Router>
  18. );
  19. }
  20. }
  21. export default App;

修改 Nav0 相关参数

先修改 Home 里的 Nav0 文件的标签

也可以将 Nav0Footer0 提出放至一个文件包里,,如 Layout;

./src/Home/Nav0
  1. import React from 'react';
  2. ...
  3. import { Menu } from 'antd';
  4. +import { Link } from "react-router-dom";
  5. const Item = Menu.Item;
  6. class Header extends React.Component {
  7. ....
  8. const navChildren = Object.keys(navData).map((key, i) => (
  9. <Item key={i.toString()} {...navData[key]}>
  10. - <a
  11. + <Link
  12. {...navData[key].a}
  13. + href={navData[key].a.href}
  14. + to={navData[key].a.href}
  15. target={navData[key].a.target}
  16. >
  17. {navData[key].a.children}
  18. - </a>
  19. + </Link>
  20. </Item>
  21. ...
  22. }
  23. export default Header;

再修改 data.source.js 里的 href 值;

  1. export const Nav00DataSource = {
  2. ...
  3. Menu: {
  4. className: 'header0-menu',
  5. children: [
  6. - { name: 'item0', a: { children: '导航一', href: '' } },
  7. + { name: 'item0', a: { children: '导航一', href: '/' } },
  8. - { name: 'item1', a: { children: '导航二', href: '' } },
  9. + { name: 'item1', a: { children: '导航二', href: '/page2' } },
  10. { name: 'item2', a: { children: '导航三', href: '' } },
  11. { name: 'item3', a: { children: '导航四', href: '' } },
  12. ],
  13. },
  14. ...
  15. };

Router 完成

完成以上步骤之后,我们再启动 npm start 即可查看在 landing 上下载的模板, 通过导航切换的可查看多个页面了。