不废话了,这次直接开干。也是我逐步的搭建过程。当手记了
总结看最后。
本次项目地址:https://github.com/ht-sauce/react-template
这个没什么可以说的,就是一个命令:npm create 你的项目名称
附带官网地址:https://www.html.cn/create-react-app/docs/setting-up-your-editor/
my-app/ README.md node_modules/ package.json public/ index.html favicon.ico src/ App.css App.js App.test.js index.css index.js logo.svg
官方说明:
public/index.html
是页面模板;src/index.js
是 JavaScript 入口点。有vue经验的那么就直接很好理解。并且对文件进行部分修改。我初步干完是这样样子的。剩下这么写文件。
public favicon.ico index.html src App.css //app页面css App.js //首页,全局的 index.css //全局css index.js //入口文件,类似vue的main.js
这里注意,只是初次修改。后面还需要引入路由和redux(类似vux)
注意react的官方脚手架是有eslint的。暂时根据官方的操作来
yarn add prettier
yarn add eslint-plugin-prettier
安装完毕
根目录下面
.eslintrc.json
添加内容
{ "extends": "react-app", }
最终eslint配置文件为
{ "extends": "react-app", "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
参考配置参数说明:https://www.cnblogs.com/linjunfu/p/10880381.html
prettier.config.js
module.exports = { printWidth: 100, singleQuote: true, trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, parser: 'babylon', semi: true, };
先根据官方文档,添加简单的来
命令:yarn add node-sass
然后把css文件后缀改为scss就行了
这里有一个比较争议性的问题,通过create-react-app的官方推荐了react-router-dom,但是通常问的是react-router。
原谅我是新手,所以我百度比较了下。
这里推荐一个csdn的博客,这位大神讲的比较详细。大家可以看看。
我总结下:react-router-dom是基于react-router再次封装的,并且优化提供了更多的解决方案。所以两者而言是一个优化过程。
所以安装:yarn add react-router-dom
这里我不得不吐槽react的路由。
吐槽原因:
学习免不了百度,然后当我比较崩溃的时候我去掘金发发牢骚。然后我发现react路由做的确实差。因为我自己百度所得知,目前有dva.js解决放hi,umiJs方式,还有各位大佬自己去封装路由。想想,这react生态真是丰富啊。然而这对于一个新手呢?这是不是一个灾难。
然后就是react太灵活,灵活到新手无法驾驭。老手各自封装,然后项目参差不齐。原罪啊。
react之所以适合大公司,因为大公司有良好的规范。
vue没有限制,即适合大项目也适合小项目。对于小公司vue本身规范良好。对于大公司,又不欠缺灵活性。只叹,vue出现的比react晚,又没有大厂背景。
正式:
既然我是新手,而且我是vue转过来的。那么我是万万不能接受vue这种组件方式的路由导航。但是自己封装又不够熟悉。好在react-router官方开始向vue学习,推出了react-router-config
安装:npm install --save react-router-config/yarn add react-router-config
在src下面创建router文件,然后新建router.js
如果直接拷贝react-router-config文档那么没什么可以说的。我放出来自己的代码
import asyncComponent from './asyncComponent'; //子路由展示的关键参数,类似router-view //import { renderRoutes } from 'react-router-config'; // 传参示例 /*const Child = ({ route }) => ( <div> <h2>Child</h2> {/!* child routes won't render without this *!/} {renderRoutes(route.routes, { someProp: 'these extra props are optional' })} </div> );*/ const routes = [ { component: asyncComponent(() => import('../App')), routes: [ { path: '/', exact: true, //只有当路由完全匹配的时候才进行匹配 component: asyncComponent(() => import('../view/Home')), }, { path: '/About', component: asyncComponent(() => import('../view/About')), }, { path: '/Inbox', exact: true, //只有当路由完全匹配的时候才进行匹配 component: asyncComponent(() => import('../view/Inbox')), }, // 路由嵌套示例 /*{ path: '/child/:id', component: Child, routes: [ { path: '/child/:id/grand-child', component: GrandChild, }, ], },*/ ], }, ]; export default routes;
可以看到代码和vue很相似了
然后是index.js中的内容
import React from 'react'; import ReactDOM from 'react-dom'; import * as serviceWorker from './serviceWorker'; // 路由配置 import { BrowserRouter as Router } from 'react-router-dom'; // 路由配置抽离 import { renderRoutes } from 'react-router-config'; import routes from './router/router'; ReactDOM.render( <Router>{renderRoutes(routes)}</Router>, document.getElementById('root'), ); serviceWorker.unregister();
基本上是和react-router-config一样的。没什么多余的改变。这里赞扬下官方(我要是早去年写react是不是就没有这玩意,可怕!)。
如果你直接按官方完整的例子来那么是无法按需加载的。
我记得在学习vue的时候,vueRouter说过,如果直接在页面里面引入import是不会按需加载的。但是在组件(component)位置用
component: () => import("../views/blog/Home.vue"),
上述方式,那么就能按需加载。
但是react里面不行啊。这样写就报错。英文提示的大致意思就是,你引入的是primose,但不是组件。
这时候回想到react-create-app官方隐约提过按需加载的方式。
官方地址:https://www.html.cn/create-react-app/docs/code-splitting/
但是vue-router是另外的方式
地址:https://serverless-stack.com/chapters/code-splitting-in-create-react-app.html
大致意思就是,你需要将promise处理为高阶组件。
还好文档有现成的。拷贝就行了。
export default function asyncComponent(importComponent) { class AsyncComponent extends Component { constructor(props) { super(props); this.state = { component: null }; } async componentDidMount() { const { default: component } = await importComponent(); this.setState({ component: component }); } render() { const C = this.state.component; return C ? <C {...this.props} /> : null; } } return AsyncComponent; }
使用方式,看我刚才router.js里面的代码就懂了。这样就完成了按需加载。
文档中还提到:npm install --save react-loadable
这个就大家自己看看了。
到目前为止路由算基本完成了。
上述操作下来,其实react除了redux基本上是没问题了。剩余的就是实际开发了。
然后我前端开发路线是:小程序——vue——学习react
这里我觉得react非常灵活。总的走来下,react官方其实已经给你了良好的道路。只是可以看的出来react从开始到目前位置,项目本身演变过程中,没有一个良好的规范。导致入门太高,百花齐放。入门高,限制了react在底层用户的发展。
vue从一开就好像给用户框定了一套规则。让你去根据他的规则来。但是这对于新手友好。相对于react,基本面上其实vue这块做的更好。
从开发效率上,初始绝对是react更好。后期两者其实相差不多。
从代码上看,react颗粒度更低,但是vue也不能说比react大,只是vue感觉更像一个html页面开发。
开发体验上vue更好。
相比而言,vue绝对是小公司首选。react对于小公司有点像灾难。因为react的高度灵活性,导致出现太多规范。
大项目相比,两者没有差别(抛开性能)。
官方文档比较:react在入门教育上更好,vue就比较欠缺。说实在,我一开始学vue的时候比react还懵逼。因为vue在新手教程上不够友好。(主要在于vueCli方面)
最后:国内选vue没错,但是你也不能不学习react,路想走的更远那么就都需要学习。
本次项目git地址:https://github.com/ht-sauce/react-template
想着要不要推自己个人博客的,不过想想,我只是打算自己当作记事本一样。就不推了。大家看掘金就好。