【腾讯云Cloud Studio 实战训练营】使用天才产品Cloud Studio构建点餐项目
在CSDN摸鱼的时候,偶然发现了一个黑科技产品,对我来说真的非常棒!这个产品就是:Cloud Studio
,这到底是个什么东西呢,我看完简介后感觉只是一个云端的 IDE
,不过也让我兴趣十足,访问其官网 https://cloudstudio.net/
了解后,才发现,这个东西是开发者和项目之间链接的桥梁,到底是什么情况呢?让我细细道来!。
学习目标
在学习之前,我先给大家说明一下学习的一些目标:
- 学习
Cloud Studio
的一些功能使用 - 理解
Cloud Studio
的一些能力 - 通过
Cloud Studio
构建一个点餐项目
Cloud Studio是什么
Cloud Studio
是基于浏览器的集成式开发环境(IDE),为开发者提供稳定的云端工作站。在使用 Cloud Studio
时无需安装,打开浏览器即可快速启动项目。底层资源自动弹性扩缩,极大地节省成本,低代码开发省时又省力:
Cloud Studio
作为在线 IDE
,包含代码高亮、自动补全、Git 集成、终端等 IDE
的基础功能,同时支持实时调试
、插件扩展
等,可以帮助开发者快速完成各种应用的开发、编译与部署工作。
功能体验
登录注册
这个使用了 Coding devops、微信、github作为客户端登录的三种方式,都是比较贴近开发的,coding 也是一个很不错的项目管理平台,大家感兴趣的可以注册玩玩,这里不多进行赘述。
这里我通过微信扫码就登录注册了
空间模板
映入眼帘的是一堆我们常用的模板,基本上包括了我们常用的所有语言模板和脚手架了,这样可以极大的减轻我们的开发成本,让我们忽略环境的因素,让我们开发的时候更加聚焦于业务
启动一个空间
这里我直接选择 react 进行测试
基本在 7s 内可以完成创建、启动、连接工作空间,在不到 2 分钟完成拉取依赖并准备就绪
不过也不是固定的时间,也是根据项目大小进行时间统计的,个人体验的是比较快速的。
构建点餐项目
然后根据这个react环境,我们再来构建一下我们的点餐项目。
安装依赖
- 安装 antd-mobile
$ yarn add antd-mobile@^5.32.0
# or
$ npm install --save antd-mobile@^5.32.0
- 安装 Less
yarn add -D less@^3.12.2 less-loader@^7.0.1
这里注意不带版本安装为高版本,项目会启动失败。
- 暴露 webpack 配置文件
npm run eject
输入 ‘y’ 后,项目会自动进行解构操作。
完成命令之后,项目根目录会出现一个config
文件夹,里面是一些配置相关的脚本,也可以看到 package.json
中多了很多属性值,如 “dependencies
”.
找到 config/webpack.config.js
文件,找到第60行左右,这块是设置 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)$/;
// 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样式了。
- 安装 normalize
yarn add -D normalize.css@^8.0.1
编写核心业务
- 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;
然后我们还需一点样式,创建一个 index.less,内容如下
- index.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;
}
最终效果
总结
Cloud Studio的特点总结
- 基于 Web 端的代码编辑器,包含代码高亮、自动补全、Git 集成、终端等 IDE 的基础功能,同时支持实时调试、插件扩展等,提升开发、编译与部署工作效率;
- 支持远程访问云服务器,为腾讯云 SCF 行业用户提供开发-测试-部署完整闭环的云原生开发体验;
- 自研多款插件以满足开发需求,例如协作插件、自定义模板插件、预览插件、部署插件等,助力施展编程潜能。
本次实验的感受
经过这一次的项目实战体验,感受到云端的IDE Cloud Studio
独特魅力,可以在线编写代码,提交远程服务器,其操作纵享丝滑。然后项目配置好后自动生成了临时域名,随时提供给我们在线浏览查看,这是传统IDE
所做不到的地方。
我非常喜欢Cloud Studio
的远程连接功能,之前都是用 xshell
工具,但是修改文件很不方便,当出现一些临时文件需要修改的时候,可以直接连接上,然后库库一顿修改,还可以及时同步。
然后这个ide还具备弹性计算能力,可以按需进行升级配置,实现弹性扩缩容,提高开发和部署的效率。推荐大家体验下,真的很不错。