首页 > 其他分享 >使用Cloud Studio快速构建React完成点餐H5页面还原

使用Cloud Studio快速构建React完成点餐H5页面还原

时间:2023-08-04 10:05:33浏览次数:44  
标签:代码 H5 React Studio key 点餐 IDE Cloud

一、前言

IDE(集成开发环境)是一种软件工具,旨在为开发者提供一个集成的开发平台,其中包含了各种用于编写、调试和部署应用程序的工具和功能。IDE通常提供代码编辑器、编译器、调试器、版本控制、构建工具等,可以帮助我们更高效地进行软件开发。

传统的IDE通常是安装在本地计算机上的软件,开发者需要在自己的设备上安装和配置对应的IDE,并手动管理项目文件和依赖项。传统IDE的好处包括让开发者能够直接在本地开发环境中进行代码编写、调试和运行,具有更高的自定义性和灵活性。

但是近期腾讯云推出了Cloud Studio工具,可以是我们不用下载需要的IDE,开箱即用,因此本篇文章主要通过介绍和构建一个项目来带大家了解它,并尝试去使用这么一款优秀的工具。

在这里插入图片描述

二、Cloud Studio 功能介绍

在这里插入图片描述

腾讯云的Cloud Studio 是一款基于Web的集成开发环境(IDE),它给我们提供了一系列的功能和特点,方便开发者进行云端开发、协作和部署。首先我们先罗列一下Cloud Studio 的主要功能和特点:

  • 丰富的语言支持:Cloud Studio 支持多种编程语言,包括Java、Python、Node.js、Golang等,可以满足我们不同项目的需求。

  • 强大的代码编辑器:Cloud Studio 内置了强大的代码编辑器,支持代码高亮、智能提示、代码重构、快捷键等功能,提供给我们流畅的编码体验。

  • 集成调试工具:Cloud Studio 提供了集成的调试工具,使得我们可以通过断点调试、变量查看、堆栈追踪等功能,帮助快速定位和解决代码中的问题。

  • 云端开发环境:最重要的一点是Cloud Studio 是基于云端的开发环境,使得我们无需在本地安装开发工具和配置开发环境,只需通过浏览器即可进行代码编写、运行和调试。

  • 灵活的协作能力:Cloud Studio 支持多人协同开发,多个开发者可以同时编辑同一个项目,并实时查看对方的修改内容,方便团队合作和代码审查。

  • 一键部署到腾讯云:Cloud Studio 提供了一键部署到腾讯云的功能,我们可以直接将代码部署到云上的服务器、容器或函数计算等服务中,简化了部署流程。

  • 集成腾讯云服务:Cloud Studio 集成了丰富的腾讯云服务,包括对象存储 COS、云数据库 CDB、云函数 SCF 等,可以方便地调用和管理这些服务,提高开发效率。

  • 安全可靠:Cloud Studio 提供了安全的开发环境,数据传输过程中进行了加密处理,同时对每个用户进行权限控制,保障代码和数据的安全。

三、实验介绍

我们经常会遇到远程办公的场景,下面我们打算用云 IDE Cloud Studio 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。

在这里插入图片描述 点击进入原型图后,点击最下面的 点餐 页面

在这里插入图片描述

四、实操指导

打开官网

点击以下链接跳转到官网,并点击“注册/登录”。

Cloud Studio官网

注册 Cloud Studio

这里注册和登录 Cloud Studio 非常方便,提供了三种注册方式:

使用 CODING 账号授权注册/登录(本文使用方式) 使用微信授权注册/登录 使用 GitHub 授权注册/登录

备注:

CODING 是提供一站式研发管理平台及云原生开发工具,让软件研发如同工业生产般简单高效,助力企业提升研发管理效能。

因为我们公司正好使用的 CODING 做为代码管理平台,所以,这里选择 "CODING DevOps" 进行登录。 在这里插入图片描述 输入对应的团队域名前缀,点击登录,即可跳转到 CODING 平台进行相关授权。

在这里插入图片描述

找到对应登录的方式,进行登录。

授权成功后,可以跳转到 Cloud Studio 首页,可以看到 Cloud Studio 提供了很多模板(框架模板、云原生模板、建站模板),都是预装环境了,开箱即用的模板,可以快速搭建环境进行代码开发,同时 Cloud Studio 也对所有新老用户每月赠送 3000 分钟的工作空间免费时长。

在这里插入图片描述

即使从来没有学习过 React,只需要打开对应的 React 框架模板,即可开始初始化一个 React 的工作空间,在等待不到 10s 左右(与带宽网速差异有区别),云 IDE 就已经初始化完毕。

在这里插入图片描述

可以看到初始化左侧代码后,控制台会安装依赖及启动一个 React 简单的模板项目。

在这里插入图片描述

// 进入当前目录
cd ./ && 
// 设置port的环境变量
set port=3000 &&
// 导出port的环境变量
export PORT=3000 &&
// 相当于 yarn install,安装相关依赖
yarn &&
// 启动开发环境
yarn start --port=3000

到此,可以发现我们如果用一台新主机,只要有浏览器,就不需要准备任何环境,不需要安装任何软件,只需要能够联网,就能在几分种内初始化一个 React 项目,这对新技术的学习是非常高效的

在这里插入图片描述

五、开发一个简版的点餐系统

主旨是为了开发一个 React H5 的页面,为了快速开发,通常会使用到UI组件库,这里我们使用的是 antd-mobile UI库,antd-mobile 是 Ant Design 的移动规范的 React 实现。

安装 antd-mobile

antd-mobile 支持基于 Tree Shaking 的按需加载,大部分的构建工具(例如 webpack 4+ 和 rollup)都支持 Tree Shaking,所以绝大多数情况下你无需做额外的配置即可拥有较小的包体积。

$ yarn add antd-mobile@^5.32.0
# or
$ npm install --save antd-mobile@^5.32.0

在这里插入图片描述

安装 Less

平时我们在进行React项目开发的时,可能会使用到Less、Sass进行样式开发,默认 React 是集成Sass的,因此对于习惯书写Less的小伙伴十分不友好,所以我们需要在React项目中配置Less。

(1).安装 less 和 less-loader :

yarn add -D less@^3.12.2 less-loader@^7.0.1

这里注意不带版本安装为高版本,项目会启动失败。

在这里插入图片描述 (2).暴露 webpack 配置文件: 在webpack.config.js中进行配置,这样进行配置需要暴露出React的config配置文件,警告:该操作不可逆

在这里插入图片描述 输入 'y' 后,项目会自动进行解构操作。

在这里插入图片描述 完成命令之后,项目根目录会出现一个config文件夹,里面是一些配置相关的脚本,也可以看到 package.json 中多了很多属性值,如 "dependencies".

找到 config/webpack.config.js 文件,找到第70行左右,这块是设置 css 相关的代码。

在这里插入图片描述 复制一下sass的代码,改为less

// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
// 新增加 Less 代码
const lessRegex = /\.(less)$/;
const lessModuleRegex = /\.module\.(less)$/;

在这里插入图片描述

继续向下搜索sass,位置在 475 行左右,能够找到以下代码。

在这里插入图片描述

和之前配置一样,仿照sass的配置,进行less的配置。

在这里插入图片描述

这样就完成了webpack.config.js配置less,可以在项目中使用less样式了。

(3).安装 normalize

Normalize.css 是CSS重置的现代替代方案,可以为默认的HTML元素样式上提供了跨浏览器的高度一致性。相比于传统的CSS reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案。

yarn add -D normalize.css@^8.0.1

在这里插入图片描述 (3).上传项目需要的素材: 以前上传服务器代码,需要使用 Scp 命令或者装 Remote SSH 插件支持,Cloud Studio 可以很方便默认支持文件上传与下载等常规的操作,与本地 IDE 体验一致:

可以直接拖动文件到 IDE 编辑区域(本文使用方式) 右击 IDE 编辑区域"上传" 直接将 img 文件夹拖动到src目录下即可。(点击下载img压缩包)

在这里插入图片描述

(4).替换App.js主文件

下面是点餐系统的主要业务代码,复制到src/App.js直接替换即可。

import './App.css';
import React, { useState } from 'react'
import { NavBar, Toast, Swiper, SideBar, TabBar, Badge } from 'antd-mobile'
import {
  AppOutline,
  ExclamationShieldOutline,
  UnorderedListOutline,
  UserOutline,
} from 'antd-mobile-icons'
import BannerImg from './img/banner.png'
import HotImg from './img/hot.png'
import Food1Img from './img/food1.png'
import Food2Img from './img/food2.png'
import CartImg from './img/cart.png'
import './index.less'
import "normalize.css"

function App() {
  const [activeKey, setActiveKey] = useState('1')

  const tabbars = [
    {
      key: 'home',
      title: '点餐',
      icon: <AppOutline />,
    },
    {
      key: 'todo',
      title: '购物车',
      icon: <UnorderedListOutline />,
      badge: '5',
    },
    {
      key: 'sale',
      title: '餐牌预告',
      icon: <ExclamationShieldOutline />,
    },
    {
      key: '我的',
      title: '我的',
      icon: <UserOutline />,
      badge: Badge.dot,
    },
  ]

  const back = () =>
    Toast.show({
      content: '欢迎进入点餐系统',
      duration: 1000,
    })


  const items = ['', '', '', ''].map((color, index) => (
    <Swiper.Item key={index}>
      <img style={{
        width: '100%'
      }} src={ BannerImg }></img>
    </Swiper.Item>
  ))

  const tabs =  [
    { key: '1', title: '热销' },
    { key: '2', title: '套餐' },
    { key: '3', title: '米饭' },
    { key: '4', title: '烧菜' },
    { key: '5', title: '汤' },
    { key: '6', title: '主食' },
    { key: '7', title: '饮料' },
  ]

  const productName = [
    '小炒黄牛肉',
    '芹菜肉丝炒香干',
    '番茄炒鸡蛋',
    '鸡汤',
    '酸菜鱼',
    '水煮肉片',
    '土豆炒肉片',
    '孜然肉片',
    '宫保鸡丁',
    '麻辣豆腐',
    '香椿炒鸡蛋',
    '豆角炒肉'
  ]
  const productList = productName.map((item, key) => {
    return {
      name: item,
      img: key % 2 === 1 ? Food1Img : Food2Img
    }
  })

  return (
    <div className="App">
      <NavBar onBack={back} style={{
        background: '#F0F0F0',
        fontWeight: 'bold'
      }}>点餐</NavBar>

      <div className='head-card'>
        <Swiper
          style={{
            '--border-radius': '8px',
          }}
          autoplay
          defaultIndex={1}
        >
          {items}
        </Swiper>
      </div>

      <div className='product-box'>
        <SideBar activeKey={activeKey} onChange={setActiveKey}>
          {tabs.map(item => (
            <SideBar.Item key={item.key} title={
              item.key === '1' ? <div>
              <div className='flex-center'>
                <img style={{
                  display: 'block',
                  width: '16px',
                  marginRight: '5px'
                }} src={ HotImg }></img>
                <div>{ item.title }</div>
              </div>
            </div> : item.title
            } />
          ))}
        </SideBar>
        <div className='product-right'>
          <div className='product-title'>热销</div>
          <div className='product-list'>
            {
              productList.map((item, key) => {
                return (
                  <div className='product-item'>
                    <div className='product-item-left'>
                      <img style={{
                        display: 'block',
                        width: '76px',
                        marginRight: '5px'
                      }} src={ item.img }></img>
                      <div className='product-item-left-info'>
                        <div>
                          <div className='product-item-left-info-name'>{ item.name }</div>
                          <div className='product-item-left-info-number'>月售{key + 1}0 赞{key * 5}</div>
                        </div>
                        <div className='product-item-left-info-price'>¥10</div>
                      </div>
                    </div>
                    <div className="cart">
                      <img style={{
                        display: 'block',
                        width: '30px',
                        marginRight: '5px'
                      }} src={ CartImg } onClick = { () =>
                        Toast.show({
                          content: '添加购物车成功'
                        }) }></img>
                    </div>
                  </div>
                )
              })
            }
          </div>
        </div>
      </div>

      <TabBar>
        {tabbars.map(item => (
          <TabBar.Item
            key={item.key}
            icon={item.icon}
            title={item.title}
            badge={item.badge}
          />
        ))}
      </TabBar>
    </div>
  );
}

export default App;

在 src 目录下,创建一个 index.less 文件,将以下 less 相关的代码复制到该文件中即可。

.head-card {
  padding: 10px 20px;
  box-sizing: border-box;
}

.flex-center {
  display: flex;
  align-items: center;
}

.product-box {
  display: flex;
  align-items: center;
  width: 100%;
  height: calc(100vh - 45px - 130px - 50px);
}

.product-right {
  flex: 1;
  height: 100%;
}

.product-title {
  font-family: PingFangSC-Regular;
  font-size: 14px;
  color: #000000;
  text-align: left;
  padding-bottom: 10px;
}

.product-list {
  height: calc(100% - 24px);
  overflow-y: auto;
}

.product-item {
  position: relative;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-left: 10px;
  box-sizing: border-box;
  margin-bottom: 10px;
  &-left {
    display: flex;
    &-info {
      padding-left: 3px;
      box-sizing: border-box;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      &-name {
        font-family: PingFangSC-Regular;
        font-size: 14px;
        color: #000000;
        text-align: left;
      }
      &-number {
        padding-top: 3px;
        font-family: PingFangSC-Regular;
        font-size: 11px;
        color: #787878;
        text-align: left;
      }
      &-price {
        font-family: PingFangSC-Regular;
        font-size: 18px;
        color: #FF1800;
        text-align: left;
      }
    }
  }
}

.cart {
  position: absolute;
  right: 10px;
  bottom: 0;
}

复制完成后,在控制台中输入 yarn dev即可启动该项目。

  • Cloud Studio 内置预览插件,可以实时显示网页应用,当代码发生改变之后,预览窗口会自动刷新,即可在 Cloud Studio 内实时开发调试网页了
  • 因为本项目是移动端H5的项目,所以需要打开“toggle device”按钮查看样式。
  • 提供了二唯码在手机端进行调试。

复制内置 Chrome 浏览器窗口的地址栏,分享给团队的其它成员,免去了部署 nginx 的繁琐配置。

六、发布仓库

# 项目说明

这是一个用 IDE [Cloud Studio](https://www.cloudstudio.net/?utm=csdn) 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。

## 相关技术栈

React + less + webpack

## 项目运行

yarn install
yarn start

在这里插入图片描述 左边功能菜单区找到“源代码管理” 在这里插入图片描述

使用 git init 进行仓库初始化。

在这里插入图片描述 输入需要提交的message信息,再点击"Commit"进行仓库提交。

在这里插入图片描述 因为代码现在托管到 Coding 上,演示如何发布到 Coding 仓库中,点击"Publish Branch" -> 选择"Publish to CODING"

在这里插入图片描述 选择第二个,接着选择我们自己创建的项目

在这里插入图片描述 可以登陆到 Coding 平台进行查看仓库代码。

在这里插入图片描述

七、开发空间

查看正在使用的开发空间,可以看到我们使用的模板是基于 create-react-app脚手架创建的模板,还可以在“近期删除”的空间,进行回滚。

在这里插入图片描述

如果觉得“标准版本”不符合要求,还可以进行配置升级,不过,修改需要下次重启后才能生效。

在这里插入图片描述

在这里插入图片描述

停止该项目。

在这里插入图片描述

删除该项目,即可销毁这个工作空间。

在这里插入图片描述

八、总结

本次实验主要是引导大家如何使用 Cloud Studio 进行云编程,并且动手使用云 IDE Cloud Studio 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面。

在一台新的机器设备上,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。

同时,也欢迎大家一起探索 Cloud Studio 更多的功能,为工作中进行赋能!

在这里插入图片描述

标签:代码,H5,React,Studio,key,点餐,IDE,Cloud
From: https://blog.51cto.com/u_15672976/6957190

相关文章

  • React Hooks 中的属性详解
    ReactHooks是React16.8版本中新增的特性,允许我们在不编写class的情况下使用state和其他的React特性。Hooks是一种可以让你在函数组件中“钩入”React特性的函数。以下是一些常用的ReactHooks,并附有详细的用法和代码示例。1.useStateuseState是一个Hook函数,让......
  • 移动端H5不建议直接使用ul li标签而是直接使用a标签的原因有以下几点
    性能优化:在移动端,ulli标签会增加DOM节点的数量,导致渲染性能下降。相比之下,直接使用a标签可以减少DOM节点的数量,提升页面加载速度和渲染性能响应式布局:在移动端,页面通常需要适配不同尺寸的设备和屏幕方向。使用ulli标签时,可能需要通过CSS来设置列表项的宽度和排列方式,增加布......
  • 【完结15章】React18+TS 通用后台管理系统解决方案落地实战
    课程下载——【完结15章】React18+TS通用后台管理系统解决方案落地实战 提取码:qwu4 给大家分享一套课程——React18+TS通用后台管理系统解决方案落地实战,已完结15章,附源码+笔记。TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型定义构建而成......
  • H5未来的发展趋势怎么样?
    A.HTML5技术的移动端方向HTML5技术在未来主要发展的市场还是在移动端互联网领域,现阶段移动浏览器有应用体验不佳、网页标准不统一的劣势,这两个方面是移动端网页发展的障碍,而HTML5技术能够解决这两个问题,并且将劣势转化为优势,整体推动整个移动端网页方面的发展;B.Web内核标准提升*迄......
  • 如何在 React 18 中使用 useSyncExternalStore
    原文useSyncExternalStore是React18中提供的自定义挂钩,可让您订阅外部存储并在外部存储更新时更新您的React组件。它对于订阅不是建立在React状态管理之上的外部存储特别有用。useSyncExternalStoreAPI您应该在组件的顶层调用useSyncExternalStore方法import{useSyncExte......
  • uniapp 之h5修改全局滚动条(浏览器下滑有小矩形滚动条)
    在index.html文件里<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,user-scalable=no,initial-......
  • h5游戏开发的前景如何?未来发展趋势分析
    随着移动互联网的快速发展和智能手机的普及,h5游戏作为一种基于Web技术的轻量级游戏形式,逐渐崭露头角。近年来,h5游戏在全球范围内取得了巨大成功,并呈现出明显的增长趋势。那么,h5游戏开发的前景如何?未来有哪些发展趋势值得关注呢?接下来,广州名锐讯动将从市场需求、技术创新以及产业生......
  • React—01—基本学习
     React组件是返回标签的JavaScript函数: 哪个组件是通过改变state实现可响应的,或者哪个组件拥有这个state。然后我们需要确定吧这个state是放在这个组件,还是放在父组件(如何多个子组件都会受到相同state影响,那么需要放到父组件里统一管理)。  如何安装一个react项......
  • react源码解析手写ReactDom.js和React
    前言大家好我是歌谣今天给大家带来react源码部分的实现创建项目首先npxcreate-react-appxxx降为17"dependencies":{"@testing-library/jest-dom":"^5.11.4","@testing-library/react":"^11.1.0","@testing-library/user-event&......
  • vite 项目webstorm跳转失效 VSCode、vue 无法对 @ 路径 跳转 ,几乎适用于所有webpack、
    在根目录加一个jsconfig.json文件{"compilerOptions":{"baseUrl":".","paths":{"@/*":["src/*"]},"target":"ES6","allowSyntheticDefaultImports&q......