[腾讯云 Cloud studio 实战训练营] 使用Cloud Studio快速构建React完成点餐H5页面还原

前言

很荣幸能够参加到 腾讯云 Cloud Studio 实战训练营,在本期的实战训练营中,会有一系列的技术直播、动手实验项目,那么我在本篇博文中将为您对 腾讯云Cloud Studio 进行讲解以及实验,让您对 腾讯云Cloud Studio 有一个大致的了解,同时还会准备视频为您进行更加直观的讲解,期待您能从这篇博文中收获您想要的知识! Cloud Studio活动简介 腾讯云 Cloud Studio 实战训练营 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动,通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等,让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时,实现技术实战能力提升。 本次活动覆盖多个难度等级、支持当前几乎所有主流编程语言,无论是技术小白,还是资深开发者,都能有所收获!活动官方还特别为参与活动的开发者们准备了丰厚的积分礼品,完成各环节任务即可换取积分,大额JD卡、骨传导耳机、无人机、办公升降台等丰厚活动奖品,等你来战!

一、简介:

随着云计算产业的发展,各种基于云端的 IDE 相继出现。相比于传统的 IDE,云端 IDE 可以更大程度的提升用户工作的效率。

云 IDE Cloud Studio 作为腾讯云出品的一款在线云端开发工具,它可以帮助用户减少安装 IDE 的成本,提供在线代码开发、编译、运行、存储的一站式服务。

下面我们以“云端开发”为主题,聚焦使用 Cloud Studio 进行编程学习、技术开发等多维度研发体验与探索,实现为公司和团队进行降本增效。

二、实验介绍:

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

Cloud Studio 是基于“浏览器”的集成式开发环境(IDE),,为开发者提供稳定的云端工作站,在使用 Cloud Studio 时无需安装,打开浏览器即可快速启动和开发项目,底层资源可以自动弹性扩缩,极大地节省成本,低代码开发省时又省力。

  • 基于 Web 端的代码编辑器,包含代码高亮、自动补全、Git 集成、终端等 IDE 的基础功能,同时支持实时调试、插件扩展等,提升开发、编译与部署工作效率 ;
  • 支持远程访问云服务器,为腾讯云 SCF 行业用户提供开发-测试-部署完整闭环的云原生开发体验 ;

云端开发 Cloud Studio 不需要任何本地安装,只需使用支持的浏览器,即可轻松登录并开始编码开发,实现 Coding everywhere。同时加速开发流程配置化,用配置定义云端开发环境,提升开发效率,拥有更弹性的云上开发资源。

多种预制环境可选 内置 Node.js、Java、Python 等常见环境,直接进入开发状态。

metawork 开发协作

通过代码协作,多光标高亮显示和跟随,让协作变的清晰有序。而实时预览和终端协作,则让结果尽在掌握

连接远程主机

多种工作类别,支持托管空间和云主机,用户可选云主机,将工作空间连接到自己的云主机,来管理云主机中的资源。

快速预览,实时调试

Cloud Studio 内置预览插件,可以快速启动预览,实时调试,实时显示网页应用,随时修改,随时显示。

丰富的模板及应用

Cloud Studio 拥有丰富的空间模板,支持一键部署编程环境模板、框架模板、建站模板等,同时还有丰富的应用模板也支持一键部署。

AI加持

内置AI代码助手,直接在 Cloud Studio 里唤起 AI代码助手,让你拥有专业的研发伙伴,与您一起更高质量的完成编码工作,事半功倍。(AI助手内测申请中!)

服务集成

作为腾讯云的产品,Cloud Studio紧密集成了腾讯云的其他服务,用户可以轻松在项目中使用其他腾讯云提供的功能和资源。

适用场景 小型团队和个人开发者:对于小型团队和个人开发者来说,Cloud Studio 是一个理想的选择。无需购买昂贵的开发设备和配置开发环境,他们可以使用云端的资源进行开发,从而降低了成本和门槛。

远程团队协作:对于分布在不同地区的开发团队来说,Cloud Studio 提供了实时协作功能,让团队成员可以同时在一个项目上进行协作开发,提高了协作效率。

快速原型开发:Cloud Studio 提供了快速搭建应用的能力,适用于快速原型开发和试验新想法的阶段。

简化教学和培训:对于教育和培训机构来说,Cloud Studio 提供了一个简单易用的开发环境,帮助学生和参与者更快地上手开发技能。

免费试用,上手无忧 Cloud Studio 团队基于老用户使用体验角度和新用户上手成本考虑,现实行每月赠送 3000 分钟的工作空间免费时长,用户放心试,满意再购买!

三、开始实验前步骤

1. 打开官网:

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

Cloud Studio官网

2. 注册 Cloud Studio:

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

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

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

因为我们公司正好使用的 CODING 做为代码管理平台,所以,这里选择 "CODING DevOps" 进行登录。

输入对应的团队域名前缀,点击登录,即可跳转到 CODING 平台进行相关授权。

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

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

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

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

同时,观看右下角的端口能发现,平台默认开启了4200端口,启动了一个实例。

接下来,就按照教程,开发一个简版的点餐系统

四、简版的点餐系开发步骤

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

1.安装 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

2. 安装 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配置文件,警告:该操作不可逆

npm run eject

输入 'y' 后,项目会自动进行解构操作。

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

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

复制一下sass的代码,改为less

代码语言:javascript
复制
// 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,位置在 504 行左右,能够找到以下代码。

​编辑

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

代码语言:javascript
复制
// less
{
  test: lessRegex,  // 有改动
  exclude: lessModuleRegex,  // 有改动
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
    },
    'less-loader'  // 有改动
  ),
  sideEffects: true,
},
{
  test: lessModuleRegex,  // 有改动
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
      modules: {
        getLocalIdent: getCSSModuleLocalIdent,
      },
    },
    'less-loader'  // 有改动
  ),
},

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

3.安装 normalize:

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

yarn add -D normalize.css@^8.0.1

4上传项目需要的素材:

以前上传服务器代码,需要使用 Scp 命令或者装 Remote SSH 插件支持,Cloud Studio 可以很方便默认支持文件上传与下载等常规的操作,与本地 IDE 体验一致:

  • 可以直接拖动文件到 IDE 编辑区域(本文使用方式)
  • 右击 IDE 编辑区域"上传"

直接将 img 文件夹拖动到src目录下即可。(点击下载img压缩包)

5.替换App.js主文件:

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

代码语言:javascript
复制
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>

  &lt;div className=&#39;head-card&#39;&gt;
    &lt;Swiper
      style={{
        &#39;--border-radius&#39;: &#39;8px&#39;,
      }}
      autoplay
      defaultIndex={1}
    &gt;
      {items}
    &lt;/Swiper&gt;
  &lt;/div&gt;

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

  &lt;TabBar&gt;
    {tabbars.map(item =&gt; (
      &lt;TabBar.Item
        key={item.key}
        icon={item.icon}
        title={item.title}
        badge={item.badge}
      /&gt;
    ))}
  &lt;/TabBar&gt;
&lt;/div&gt;

);
}

export default App;

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

代码语言:javascript
复制
.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;
}

Cloud Studio 内置预览插件,可以实时显示网页应用,当代码发生改变之后,预览窗口会自动刷新,即可在 Cloud Studio 内实时开发调试网页了

  • 因为本项目是移动端H5的项目,所以需要打开“toggle device”按钮查看样式。
  • 提供了二唯码在手机端进行调试。

发布仓库:

填写README.md文件。

# 项目说明 这是一个用 IDE Cloud Studio 快速搭建,并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云 IDE 给我们带来的优势,不需要装各种环境,简单易用,开箱即可上手。 ## 相关技术栈 React + less + webpack ## 项目运行 yarn install yarn start

左边功能菜单区找到“源代码管理”。

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

git init

输入需要提交的message信息,再点击"Commit"进行仓库提交。

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

输入Coding 团队域名前缀,后面发布代码就会发布到这个团队项目下。

选择对应的账号。

选择推送的项目,如果没有会创建一个新项目。

可以登陆到 Coding 平台进行查看仓库代码。

Coding 一站式研发管理平台

开发空间:

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

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

​​

停止该项目。

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

总结:

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

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

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