基于Cloud?Studio構建React完成點餐H5頁面(騰訊云?Cloud?Studio?實戰(zhàn)訓練營)

前言
- 最近也是有機會參與到了騰訊云舉辦的
騰訊云 Cloud Studio 實戰(zhàn)訓練營,借此了解了騰訊云 Cloud Studio產品。 - 騰訊云 Cloud Studio 的出現(xiàn)是有一定創(chuàng)新性的,使用它進行開發(fā)免去了使用一些傳統(tǒng)開發(fā)工具的成本。
- 如下載一個開發(fā)工具就要進行基本的開發(fā)環(huán)境配置,以及下載、安裝和占用本地存儲等等成本。
- 下面就來使用
騰訊云 Cloud Studio做一個實戰(zhàn)案例來深入了解該產品的優(yōu)越性吧!
【騰訊云 Cloud Studio 實戰(zhàn)訓練營】基于Cloud Studio 構建React完成點餐H5頁面
一、Cloud Studio介紹
1.1 Cloud Studio 是什么
Cloud Studio 是 基于瀏覽器的集成式開發(fā)環(huán)境(IDE),為開發(fā)者提供了一個永不間斷的云端工作站。用戶在使用 Cloud Studio 時無需安裝,隨時隨地打開瀏覽器就能在線編程。
Cloud Studio 作為 在線 IDE,包含 代碼高亮、自動補全、Git 集成、終端等 IDE 的基礎功能,同時支持實時調試、插件擴展等,可以幫助開發(fā)者快速完成各種應用的開發(fā)、編譯與部署工作。
此外,Cloud Studio還支持與其他開發(fā)者的協(xié)作,可以輕松地共享代碼和項目,并進行實時的協(xié)同編輯。
目前Cloud Studio 團隊基于老用戶使用體驗角度和新用戶上手成本考慮,現(xiàn)實行每月贈送 3000 分鐘的工作空間免費時長,所以我們可以來使用送的時長來認真體驗下吧!
1.2 相關鏈接
- Cloud Studio官網地址:https://www.cloudstudio.net/
- Cloud Studio文檔地址:https://cloudstudio.net/docs/
1.3 登錄注冊
(1)打開Cloud Studio官網,點擊注冊:https://www.cloudstudio.net/

然后大家按自己的情況選擇一種賬號進行注冊登錄就好。

注冊登錄后來到這個頁面就算正常啦,可以看到Cloud Studio提供了眾多開發(fā)環(huán)境及模板,下面就來看看到底怎樣使用吧!

二、實戰(zhàn)練習
本文打算用云 IDE Cloud Studio 快速搭建,并開發(fā)還原一個移動端 React H5 的簡版點餐系統(tǒng)頁面,從 0 到 1 體驗云 IDE 給我們帶來的優(yōu)勢,不需要裝各種環(huán)境,簡單易用,開箱即可上手。
2.1 初始化工作空間
來到 Cloud Studio 首頁之后,可以看到 Cloud Studio 提供了很多模板(框架模板、云原生模板、建站模板),都是預裝環(huán)境了,開箱即用的模板,可以快速搭建環(huán)境進行代碼開發(fā),同時 Cloud Studio 也對所有新老用戶每月贈送 3000 分鐘的工作空間免費時長。
此時選擇創(chuàng)建一個React模板并等待云 IDE 初始化完畢。

即使從來沒有學習過 React,只需要打開對應的 React 框架模板,即可開始初始化一個 React 的工作空間,在等待不到 10s 左右(與帶寬網速差異有區(qū)別),云 IDE 就已經初始化完畢。

等待初始化完畢之后,在我們的右側,可以看到一個實時預覽的預覽界面,然后在下面的控制臺輸入以下指令。
// 進入當前目錄 cd ./ && // 設置port的環(huán)境變量 set port=3000 && // 導出port的環(huán)境變量 export PORT=3000 && // 相當于 yarn install,安裝相關依賴 yarn && // 啟動開發(fā)環(huán)境 yarn start --port=3000
這樣我們就完成一個對 React 項目初始化的過程了,用一臺新主機,只要有瀏覽器,就不需要準備任何環(huán)境,不需要安裝任何軟件,只需要能夠聯(lián)網,就能在幾分種內初始化完成,這對新技術的學習是非常高效的。
2.2 開發(fā)一個簡版的點餐系統(tǒng)頁面
主旨是為了開發(fā)一個 React H5 的頁面,為了快速開發(fā),通常會使用到UI組件庫,這里我們使用的是 antd-mobile UI庫,antd-mobile 是 Ant Design 的移動規(guī)范的 React 實現(xiàn)。
1. 安裝 antd-mobile
antd-mobile 支持基于 Tree Shaking 的按需加載,大部分的構建工具(例如 webpack 4+ 和 rollup)都支持 Tree Shaking,所以絕大多數(shù)情況下你無需做額外的配置即可擁有較小的包體積。
yarn add antd-mobile@^5.32.0 # 或者 npm install --save antd-mobile@^5.32.0
在終端輸入代碼進行安裝即可。

安裝完成后在package.json中會有顯示。

2. 安裝 less 和 less-loader
平時我們在進行React項目開發(fā)的時,可能會使用到Less、Sass進行樣式開發(fā),默認 React 是集成Sass的,因此對于習慣書寫Less的小伙伴十分不友好,所以我們需要在React項目中配置Less。
yarn add -D less@^3.12.2 less-loader@^7.0.1
這里注意不帶版本安裝為高版本,項目會啟動失敗,所以需要標注好版本后進行安裝。

這樣就安裝好了,繼續(xù)下一步。
3. 暴露 webpack 配置文件
在webpack.config.js中進行配置,這樣進行配置需要暴露出React的config配置文件,警告:該操作不可逆
npm run eject

輸入 ‘y’ 后,項目會自動進行解構操作。
完成命令之后,項目根目錄會出現(xiàn)一個config文件夾,找到 config/webpack.config.js 文件,按Ctrl + F 查找關鍵字 “style files” 。
這塊是設置 css 相關的代碼。

將上圖的70行到73行代碼改成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)$/;
繼續(xù)在查找框中輸入 “sassRegex” 能夠找到以下代碼。

這里和前面配置一樣,仿照sass的配置,進行l(wèi)ess的配置。
// 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樣式了。
4. 安裝 normalize
Normalize.css 是CSS重置的現(xiàn)代替代方案,可以為默認的HTML元素樣式上提供了跨瀏覽器的高度一致性。相比于傳統(tǒng)的CSS reset,Normalize.css是一種現(xiàn)代的、為HTML5準備的優(yōu)質替代方案。

5. 上傳項目需要的素材
以前上傳服務器代碼,需要使用 Scp 命令或者裝 Remote SSH 插件支持,Cloud Studio 可以很方便默認支持文件上傳與下載等常規(guī)的操作,與本地 IDE 體驗一致:
- 可以直接拖動文件到 IDE 編輯區(qū)域
- 右擊 IDE 編輯區(qū)域"上傳"
直接將 img 文件夾拖動到src目錄下即可。

img下載方式:img
6. 替換App.js主文件
以下是點餐系統(tǒng)的主要業(yè)務代碼,復制到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: '歡迎進入點餐系統(tǒng)',
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 目錄下,創(chuàng)建一個 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;
}7.啟動項目
完成上述操作后,在控制臺中輸入 yarn start 即可啟動該項目。

Cloud Studio 內置預覽插件,可以實時顯示網頁應用,當代碼發(fā)生改變之后,預覽窗口會自動刷新,即可在 Cloud Studio 內實時開發(fā)調試網頁了
復制內置 Chrome 瀏覽器窗口的地址欄,分享給團隊的其它成員,免去了部署 nginx 的繁瑣配置。

這樣我們的項目就算完成了,只需要安裝幾個庫就可以快速的構建一個項目。
三、發(fā)布到倉庫
項目完成后可以快速發(fā)布到git倉庫中,首先需要填寫README.md文件。
# 項目說明 這是一個用 IDE [Cloud Studio](https://www.cloudstudio.net/?utm=csdn) 快速搭建,并開發(fā)還原一個移動端 React H5 的簡版點餐系統(tǒng)頁面,從 0 到 1 體驗云 IDE 給我們帶來的優(yōu)勢,不需要裝各種環(huán)境,簡單易用,開箱即可上手。 ## 相關技術棧 React + less + webpack ## 項目運行 yarn install yarn start
在左邊功能菜單區(qū)找到“源代碼管理”,使用 git init 進行倉庫初始化。


然后輸入需要提交的message信息,再點擊"Commit"進行倉庫提交。

如果提示沒有關聯(lián)賬號的話就去設置里面關聯(lián)一下即可。

如果登錄時使用的是coding,所以就直接推送到coding倉庫了,當然也可以推送到github,需要綁定對應的賬號進行提交即可。
這里可以登陸到 Coding 平臺進行查看倉庫代碼。

四、開發(fā)空間管理
在我們的控制臺這里可以管理所有使用的工作空間,其中右側的按鈕可以進行升級配置、設置、刪除、開始\停止操作。

總結
在使用過Cloud Studio做一次實戰(zhàn)練習之后,讓我對Cloud Studio有了更深刻的認識,下面來簡單談一下Cloud Studio的優(yōu)勢以及優(yōu)化建議。
Cloud Studio的優(yōu)勢很明顯,大致可以分為一下幾點。
- 節(jié)約開發(fā)成本??梢詭椭脩魷p少安裝 IDE 的成本,提供在線代碼開發(fā)、編譯、運行、存儲的一站式服務。
- 便捷性。Cloud Studio 是基于瀏覽器的集成式開發(fā)環(huán)境(IDE),為開發(fā)者提供了一個永不間斷的云端工作站。用戶在使用 Cloud Studio 時無需安裝,隨時隨地打開瀏覽器就能在線編程。
- 云端開發(fā)。Cloud Studio 不需要任何本地安裝,只需使用支持的瀏覽器,即可輕松登錄并開始編碼開發(fā),實現(xiàn) Coding everywhere。同時加速開發(fā)流程配置化,用配置定義云端開發(fā)環(huán)境,提升開發(fā)效率,擁有更彈性的云上開發(fā)資源。
- 多種預制環(huán)境可選。內置 Node.js、Java、Python 等常見環(huán)境,直接進入開發(fā)狀態(tài)。
- metawork 開發(fā)協(xié)作。通過代碼協(xié)作,多光標高亮顯示和跟隨,讓協(xié)作變的清晰有序。包括但不限于代碼協(xié)同、多光標協(xié)作、實時預覽、終端協(xié)作。
- 眾多模板可用。在使用時一個很明顯的感受就是Cloud Studio提供了眾多的模板,有些功能我們可以從模板庫中直接拿出來改一下就可以滿足自己的需求快速使用,甚至于不會寫代碼的人都可以上去操作兩手。
Cloud Studio優(yōu)化建議
- 文檔全面詳細化。希望增加更多編程語言的文檔介紹,目前文檔里面只有幾個主流的編程語言操作文檔,對于一些剛開始使用Cloud Studio的用戶來說,能夠看到自己平時使用的編程語言的詳細文檔可以更快的上手Cloud Studio。
- 提供更多的編程語言和框架。當前網站支持的編程語言和框架不能夠滿足所有用戶的需求??梢钥紤]支持更多的編程語言和框架,提高平臺的適用性和可擴展性。
- 提供更高的穩(wěn)定性。目前網站的性能和穩(wěn)定性還有進一步提升的空間,有時候可能會出現(xiàn)一些卡頓和崩潰等問題。為了提高用戶的使用體驗,建議考慮優(yōu)化平臺的性能和穩(wěn)定性。
到此這篇關于基于Cloud Studio構建React完成點餐H5頁面(騰訊云 Cloud Studio 實戰(zhàn)訓練營)的文章就介紹到這了,更多相關React點餐H5頁面內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
React中useEffect 與 useLayoutEffect的區(qū)別
本文主要介紹了React中useEffect與useLayoutEffect的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
解決React報錯Property does not exist on 
這篇文章主要為大家介紹了React報錯Property does not exist on type 'JSX.IntrinsicElements'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
react中的watch監(jiān)視屬性-useEffect介紹
這篇文章主要介紹了react中的watch監(jiān)視屬性-useEffect使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09

