react 项目创建准备工作 https://juejin.cn/post/6844904055840440334

1 创建React-APP
为了加速npm下载速度,先把npm设置为淘宝镜像地址。
npm config set registry http://registry.npm.taobao.org/
复制代码也可以使用cnpm,根据喜好自行选择。
通过官方的create-react-app,找个喜欢的目录,执行:
npx create-react-app react-app
复制代码命令最后的react-app是项目的名称,可以自行更改。
稍等片刻即可完成安装。安装完成后,可以使用npm或者yarn启动项目。
进入项目目录,并启动项目:
cd react-app
yarn start (或者使用npm start)
复制代码如果没有安装yarn,可以前往yarn中文网站安装:

yarn.bootcss.com/

启动后,可以通过以下地址访问项目:

http://localhost:3000/

2 精简项目
2.1 删除文件
接下来,删除一般项目中用不到的文件,最简化项目。
├─ /node_modules
├─ package.json
├─ /public
| ├─ favicon.ico
| ├─ index.html

  • | ├─ logo192.png
  • | ├─ logo512.png
  • | ├─ mainfest.json
  • | └─ robots.txt
    ├─ README.md
    ├─ /src
  • | ├─ App.css
    | ├─ App.js
  • | ├─ App.test.js (jTest自动化测试)
  • | ├─ index.css
  • | ├─ index.js
  • | ├─ logo.svg
  • | ├─ serviceWorker.js
  • | └─ setuoTests.js (PWA)
    └─ yarn.lock
    复制代码以上文件删除后,页面会报错。这是因为相应的文件引用已不存在。需要继续修改代码。
    2.2 简化代码
    现在目录结构如下,清爽许多:
    ├─ /node_modules
    ├─ package.json
    ├─ /public
    | ├─ favicon.ico
    | └─ index.html
    ├─ README.md
    ├─ /src
    | ├─ App.js
    | └─ index.js
    └─ yarn.lock
    复制代码逐个修改以下文件:
    src/App.js代码简化如下:
    import React from 'react'

function App() {
return (


This is React App.



)
}

export default App
复制代码src/index.js代码简化如下:
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

ReactDOM.render(, document.getElementById('root'))
复制代码public/index.html

React App
复制代码运行效果如下:

2.3 使用Fragment去掉组件外层标签
react要求每个组件HTML的最外层必须是由一个标签包裹,且不能存在并列的标签。例如,在src/App.js中,如果是这样就会报错:
// 以下代码将会报错,最外层不能存在并列的标签。
function App() {
return (


This is React App.




This is React App-other.



)
}
复制代码如果确实需要这样的HTML,并且不想再添加一个父级标签,可以使用Fragment作为最外层。代码修改如下:
M import React, { Fragment } from 'react'

function App() {
    return (
  •       <Fragment>
              <div className="App">
                  <h1>This is React App.</h1>
              </div>
              <div className="App-other">
                  <h1>This is React App-ohter.</h1>
              </div>
    
  •       </Fragment>
      )
    

    }

    export default App
    复制代码
    以上仅为了说明Fragment的使用效果。在某些组件嵌套的使用场景下,非常适合使用Fragment。例如父组件是

    ,而子组件可以用包裹多个
    3 项目目录结构
    项目目录结构可根据项目实际灵活制定。这里分享下我常用的结构,仅供参考。
    ├─ /node_modules
    ├─ package.json
    ├─ /public
    | ├─ favicon.ico <-- 网页图标
    | └─ index.html <-- HTML页模板
    ├─ README.md
    ├─ /src
    | ├─ /common <-- 全局公用目录
    | | ├─ /fonts <-- 字体文件目录
    | | ├─ /images <-- 图片文件目录
    | | ├─ /js <-- 公用js文件目录
    | | └─ /style <-- 公用样式文件目录
    | | | ├─ frame.css <-- 全部公用样式(import其他css)
    | | | ├─ reset.css <-- 清零样式
    | | | └─ global.css <-- 全局公用样式
    | ├─ /components <-- 公共模块组件目录
    | | ├─ /header <-- 头部导航模块
    | | | ├─ index.js <-- header主文件
    | | | └─ header.css <-- header样式文件
    | | └─ ... <-- 其他模块
    | ├─ /pages <-- 页面组件目录
    | | ├─ /home <-- home页目录
    | | | ├─ index.js <-- home主文件
    | | | └─ home.css <-- home样式文件
    | | ├─ /login <-- login页目录
    | | | ├─ index.js <-- login主文件
    | | | └─ login.css <-- login样式文件
    | | └─ ... <-- 其他页面
    | ├─ App.js <-- 项目主模块
    | └─ index.js <-- 项目入口文件
    └─ yarn.lock
    复制代码3.1 引入全局公用样式
    在frame.css里引入其他公用样式:
    src/common/style/frame.css
    @import './reset.css';
    @import './global.css';
    复制代码然后在src/index.js里引入frame.css
    import React from 'react'
    import ReactDOM from 'react-dom'
    import App from './App'

  • import './common/style/frame.css'

    ReactDOM.render(, document.getElementById('root'))
    复制代码如图,页面全局样式已生效。

  • 3.2 支持Sass/Less/Stylus
    工欲善其事必先利其器,这么高大上的react怎能好意思用最原始的css搭配呢?create-react-app默认情况下未暴露配置文件。要更灵活配置项目,需要将配置文件暴露出来。
    执行以下命令,暴露配置文件:

    ※注意:暴露配置的文件的操作不可逆!

    npm run eject
    复制代码如果之前没有提及git的话,可能会报以下错误:
    Remove untracked files, stash or commit any changes, and try again
    复制代码需要先在项目根目录下执行:
    git add .
    git commit -m "初始化项目(备注)"
    复制代码稍等片刻,eject成功,目录变化如下:

    • ├─ /config

    • | ├─ /jest

    • | ├─ env.js

    • | ├─ module.js

    • | ├─ paths.js

    • | ├─ pnpTs.js

    • | ├─ webpack.config.js <-- webpack配置文件

    • | └─ webpackDevServer.config.js
      ├─ /node_modules
      ├─ package.json
      ├─ /public
      | ├─ favicon.ico
      | └─ index.html
      ├─ README.md

    • ├─ /scripts

    • | ├─ build.js

    • | ├─ start.js

    • | └─ test.js
      ├─ /src
      | ├─ /common <-- 全局公用目录
      | ├─ /components <-- 公共模块组件目录
      | ├─ /pages <-- 页面组件目录
      | ├─ App.js <-- 项目主模块
      | └─ index.js <-- 项目入口文件
      └─ yarn.lock
      复制代码3.2.1 支持Sass/Scss
      eject后,虽然package.json以及webpack.config.js里有了sass相关代码,但是要正确使用Sass/Scss,还要再安装node-sass。
      执行以下命令:
      npm install node-sass --save-dev
      复制代码安装完成后,项目已支持Sass/Scss,可以将原css文件后缀名修改为sacc/scss,别忘了把src/index.js中引入的frame.css后缀名修改为sacc/scss。
      3.2.2 支持Less
      支持Less稍微多一点步骤,首先安装less和less-loader:
      npm install less less-loader --save-dev
      复制代码然后修改config/webpack.config.js:
      // style files regexes
      const cssRegex = /.css/;constcssModuleRegex=/\.module\.css/;
      const sassRegex = /.(scss|sass)/;constsassModuleRegex=/\.module\.(scss|sass)/;

    • const lessRegex = /.less$/;

    • const lessModuleRegex = /.module.less$/;
      ...(略)
      // Opt-in support for SASS (using .scss or .sass extensions).
      // By default we support SASS Modules with the
      // extensions .module.scss or .module.sass
      {
      test: sassRegex,
      exclude: sassModuleRegex,
      use: getStyleLoaders(
      {
      importLoaders: 2,
      sourceMap: isEnvProduction && shouldUseSourceMap,
      },
      'sass-loader'
      ),
      // Don't consider CSS imports dead code even if the
      // containing package claims to have no side effects.
      // Remove this when webpack adds a warning or an error for this.
      // See https://github.com/webpack/webpack/issues/6571
      sideEffects: true,
      },
      // Adds support for CSS Modules, but using SASS
      // using the extension .module.scss or .module.sass
      {
      test: sassModuleRegex,
      use: getStyleLoaders(
      {
      importLoaders: 2,
      sourceMap: isEnvProduction && shouldUseSourceMap,
      modules: {
      getLocalIdent: getCSSModuleLocalIdent,
      },
      },
      'sass-loader'
      ),
      },
      // 以下这里仿照上面sass的代码,配置下less。

    • {

    •   test: lessRegex,
      
    •       exclude: lessModuleRegex,
      
    •       use: getStyleLoaders(
      
    •           {
      
    •               importLoaders: 2,
      
    •               sourceMap: isEnvProduction && shouldUseSourceMap,
      
    •           },
      
    •           'less-loader'
      
    •        ),
      
    •       sideEffects: true,
      
    • },

    • {

    •   test: lessModuleRegex,
      
    •   use: getStyleLoaders(
      
    •       {
      
    •           importLoaders: 2,
      
    •           sourceMap: isEnvProduction && shouldUseSourceMap,
      
    •           modules: {
      
    •               getLocalIdent: getCSSModuleLocalIdent,
      
    •           },
      
    •       },
      
    •       'less-loader'
      
    •   ),
      
    • },
      复制代码修改后需要执行yarn start重启项目。
      然后将原css文件的后缀名修改为less,src/index.js中引入的frame.less,页面已正常解析less。
      3.2.3 支持Stylus
      支持Stylus跟Less完全一样,首先安装stylus和stylus-loader:
      执行以下命令:
      npm install stylus stylus-loader --save-dev
      复制代码安装完成后,按照上一小节介绍的支持less的方法,修改config/webpack.config.js。完成后重启项目,引入stylus文件可以正常解析了。
      我个人习惯使用Stylus,因此后续的讲解中使用Stylus。同时,把src/common/下的style目录也更名为stylus。
      ├─ /config
      ├─ /node_modules
      ├─ package.json
      ├─ /public
      ├─ README.md
      ├─ /scripts
      ├─ /src
      | ├─ /common <-- 全局公用目录
      | | ├─ /fonts
      | | ├─ /images
      | | ├─ /js
      M | | └─ /stylus
      M | | | ├─ frame.styl
      M | | | ├─ reset.styl
      M | | | └─ global.styl
      | ├─ /components <-- 公共模块组件目录
      | ├─ /pages <-- 页面组件目录
      | ├─ App.js <-- 项目主模块
      | └─ index.js <-- 项目入口文件
      └─ yarn.lock
      复制代码frame.styl代码如下:
      @import './reset.styl';
      @import './global.styl';
      复制代码src/index.js代码修改如下:
      import React from 'react'
      import ReactDOM from 'react-dom'
      import App from './App'
      M import './common/style/frame.styl'

      ReactDOM.render(, document.getElementById('root'))
      复制代码最基本的配置搞定了,接下来要开始引入页面(pages)了。页面的切换需要使用路由(Router),请继续阅读下面的章节。
      4 路由
      4.1 页面构建
      首先,构建home和login页面。
      src/pages/home/index.js代码:
      import React, { Component } from 'react'
      import './home.styl'

    class Home extends Component {
    render() {
    return (


    Home page



    )
    }
    }

    export default Home
    复制代码src/pages/home/home.styl代码
    .P-home
    h1
    padding: 20px 0
    font-size: 30px
    color: #fff
    background: #67C23A
    text-align: center
    复制代码src/pages/login/index.js代码:
    import React, { Component } from 'react'
    import './login.styl'

    class Login extends Component {
    render() {
    return (


    Login page



    )
    }
    }

    export default Login
    复制代码src/pages/login/login.styl代码
    .P-login
    h1
    background: #E6A23C
    复制代码我个人的习惯是,仅供参考:

    全局公用级别(不需要模块化)的className,用G-xxx。例如G-autocut(截字)、G-color-red(文字红色)。
    页面级别的className,用P-xxx。
    模块级别的className,用M-xxx。

    接下来,我们使用react-router-dom实现路由。
    4.2 使用react-router-dom
    执行安装命令:
    npm install react-router-dom --save
    复制代码修改src/App.js,代码如下:
    import React, { Fragment } from 'react'
    import Login from './pages/login'
    import Home from './pages/home'
    import { HashRouter, Route, Switch, Redirect } from 'react-router-dom'

    function App() {
    return (






    <Redirect to={"/home"} />



    )
    }

    export default App
    复制代码App.js引入了Home和Login两个页面级组件。然后使用react-router-dom分别设置了路径。
    import的机制是默认寻找index.js,所以每个组件的主文件名设为index.js,在引用的时候就可以省略文件名。
    这里说明一下的属性:

    path表示路径,这个很好理解。

    component表示绑定的组件。

    exact表示是否精确匹配。

    如果没有设置exact,那么:
    localhost:3000/会显示Home页,
    localhost:3000/abc也会显示Home页。
    因为匹配到了前面的"/",路由就会成功。
    最后的表示以上都没有匹配成功的会,默认跳转的路由。
    来看下效果:
    访问http://localhost:3000/#/login效果:

    访问http://localhost:3000/#/home效果:

    4.3 路由跳转
    接下来,简单介绍下如果在页面之间进行路由跳转。
    在Login页面添加一个用于跳转至Home页的按钮,代码修改如下:
    import React, { Component } from 'react'
    import './login.styl'

    class Login extends Component {
        render() {
            return (
               <div className="P-login">
                    <h1>Login page</h1>
    
    •               <button onClick={this.gotoHome.bind(this)}>跳转Home页</button>
                </div>
            )
        }
      
    •   gotoHome() {
      
    •       this.props.history.push('/home')
      
    •   }
      

      }

      export default Login
      复制代码注意button的onClick里要bind(this),否则,在gotoHome里的this是undefined。
      当然,也可以这么写:
      <button onClick={() => {this.gotoHome()}}>跳转Home页
      复制代码最终目的都是要让gotoHome中的this指向正确的作用域。

    5 组件引入
    这章节内容也很容易,接触过vue的同学应该也很清楚,为了教程的完整性,还是简单说一下。下面来简单实现一个公用的头部组件。
    5.1 创建header组件
    目录结构如下:
    | ├─ /components <-- 公共模块组件目录

    • | | ├─ /header <-- 公用header组件
    • | | | ├─ index.js
    • | | | └─ header.styl
      复制代码src/components/header/index.js代码:
      import React, { Component } from 'react'
      import './header.styl'

    class Header extends Component {
    render() {
    return (


    Header

    )
    }
    }

    export default Header
    复制代码src/components/header/header.styl代码:
    .M-header
    height: 40px
    line-height: 40px
    font-size: 36px
    color: #fff
    background: #409EFF
    复制代码5.2 引入Header组件
    然后,在Home和Login页面里引入Header组件。
    以Home页面为例,修改src/pages/home/index.js:
    import React, { Component } from 'react'

    • import Header from '../../components/header'
      import './home.styl'

      class Home extends Component {
      render() {
      return (

    •               <Header />
                    <h1>Home page</h1>
                </div>
            )
        }
      

      }

      export default Home
      复制代码同样的方式在Login页面也引入Header组件,代码就不放出了。效果如下:

    5.3 组件传参
    使用过vue的同学都知道,vue组件有data和props。对应react的是state和props。
    react向子组件传参使用以下方式:

    {console.log('func1')}} /> 复制代码在Header组件内部,直接使用this.props就可以接收。例如:this.props.param1。 本次分享主要是介绍流程性的内容,篇幅有限,关于react的state和props请查阅官方文档。 6 React Developer Tools浏览器插件 为了更方便调试react项目,建议安装chrome插件。 ,在chrome网上应用店里搜索“React Developer Tools”并安装。

    安装完成后,打开chrome调试工具,可以清晰的看到react项目代码结构。

posted @   木头小屋  阅读(276)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示