React脚手架搭建

现代的前端项目已经越来越复杂了:

  1. 我们可能会使用一些比较方便的方式去编写代码,但是这些代码浏览器并不能直接识别

    需要使用对应的工具,将其编译为原生的HTML,CSS,JS后才可以交给浏览器来进行解析

    例如: 使用less,scss来写css样式,使用TS来编写JS代码

  2. JS的文件采用模块化的方式进行开发,这就意味着JavaScript代码不再只是编写在几个文件中

    而是通过模块化的方式,被组成在成百上千个文件中,所以我们需要通过模块化的技术来管理它们之间的相互依赖

    并且在打包的时候,将他们模块化文件打包在一起,形成一个或几个大的JS文件

  3. 项目所依赖的第三方库越来越多,且第三方库可能还依赖了别的第三方库,我们需要一种更好的方式去管理

    这些库的版本,以及库和库之间的依赖

为了,解决上述的问题,前端出现了类似于vite,webpack,babel在内的一系列工具,但是这些工具都需要进行相应的配置

而每个项目作出完成的效果不同,但是它们的基本工程化结构是相似的,每次都从零开始编写项目目录和对应配置是完全没有意义的

所以就出现了一个CLI(command line interface )工具,通过这个工具我们可以生成我们所需要的项目模板

我们只需要在这个模板的基础之上进行项目开发或者进行一些配置的简单修改即可

这样也可以间接保证项目的基本机构一致性,方便后期的维护

而这个工具就被称之为脚手架(scaffold)工具

简而言之,脚手架是一个CLI工具。可以帮我们创建已经配置好打包工具和项目目录结构的工程化项目模板

脚手架让项目从搭建到开发,再到部署,整个流程变得快速和便捷

# 安装react脚手架
$ npm i create-react-app -g
# react脚手架使用
# 项目名称遵循node的包名
# 即 全部使用小写英文字母,多个单词之间使用中划线或下划线进行连接
$ create-react-app <项目名称>

# 创建完成后,需要进入对应的目录
$ cd <项目名称>

# 启动项目
# 默认情况下,项目会运行在3000端口
# 如果3000端口被占用,就会使用3001端口,依次类推
$ npm start

脚手架对应的目录结构

1111222.png

package.json中配置的script脚本

脚本 功能
npm start react-scripts start
npm run build react-scripts build
npm run reject react-scripts reject

React scaffold中的配置使用react提供的工具react-scripts来进行管理

该工具会帮助我们调用react scaffold内部配置的webpack

我们可以私有reject脚本,将封装起来的webpack配置暴露出来

从而查看对应的webpack配置

注意: reject脚本是不可逆操作

Hello React

App,js

// reactv16, 在react中使用jsx,需要手动引入react
// 但是自reactv17开始,react单文件组件在编译的时候,会自动在编译的时候,引入JSX, 无需手动引入
import { Component } from 'react'

// 一般组件的导出使用的都是默认导出
export default class App extends Component {
  render() {
    return (
      // <></> -> <React.Fragment></React.Fragment>
      // 但是使用Fragment简写的时候,是不需要引入react的
      // 因为其在编译的时候会自动引入react
      <>
        <h2>Hello World</h2>
      </>
    )
  }
}

index.js

// src/index.js --- react scaffold 的默认入口文件
import React from 'react'
// 从React18开始,导入的是react-dom/client
// reactv17 之前 导入的是react-dom
import ReactDOM from 'react-dom/client'

// 1. react scaffold是基于webpack进行打包的
//    所以默认情况下, 可以省略js后缀 默认文件夹的入口也是index.js

// 2. react的单文件组件的后缀一般为js,也可以为jsx(老版本),两者之间没有任何区别
import App from './App'

// 不同于vue的挂载点是div#app
// react scaffold的默认挂载点为div#root

// Reactv17 之前的写法
// ReactDOM.render(<App />, document.getElementById('root'))

// React18开始的写法
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<App />)

补充

// 引入react的方式
import React from 'react'

但是在react源码中,react模块的导出方式

// 可见react默认是使用export进行导出的,没有使用export default 单独对内容进行导出
export {
    // ...
  Component,
  Fragment,
  PureComponent,
  StrictMode,
  // ...
} from './src/React';

但是为什么我们在react scaffold中使用react的时候,可以直接使用默认导入呢

这是因为react scaffold脚手架是基于webpack搭建的,因此其实基于node环境运行的

所以对应的包在打包到生产环境的时候,其是会编译成使用CJS模块的代码

node_module/react/index.js

'use strict';

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./cjs/react.production.min.js');
} else {
  module.exports = require('./cjs/react.development.js');
}

而cjs导出的内容,本质上是一个对象,其可以直接导出,也可以直接接收整个对象后再进行使用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容