【腾讯云 Cloud Studio 实战训练营】当我还在恐龙扛狼,隔壁IDE竟然已经卷成这样了

news2024/11/18 8:32:40

文章目录

    • 前言
    • 关于cloud studio
    • 功能介绍
    • 账号注册
    • 小试牛刀
    • 深度体验
    • 使用场景和产品优势
    • 总结

手动bgm:沃没K~ 恐龙扛浪扛浪扛~ 恐龙扛浪扛浪扛~ 沃没K~ 布鲁biu布鲁biu~

前言

上周很荣幸被邀请体验一款腾讯的新产品cloud studio,是一款在线ide,这个对于大家应该都不陌生,所谓在线ide无非就是把编译器从本地搬到了云端,跟近几年火起来的在线文档其实差不多一个逻辑,所以刚开始我对这个东西其实没抱期望,因为在git上经常会看到,或多或少都用过,但是在我深度使用过后,对它的认知发生了转变,本片文章我将会带领大家慢慢了解cloud studio。

关于cloud studio

在这里插入图片描述

Cloud Studio是一个敲代码的工具,如我们常用的IntelliJ全家桶,但Cloud Studio是基于浏览器的,我们在使用时无需安装,随时随地打开浏览器就能在线编程,通俗点讲就是如上文提到的 “把编译器从本地搬到了云端”,这样的好处就是为我们开发者提供了一个永不间断的云端工作站,再也不用担心换电脑导致的各种环境问题。

功能介绍

Cloud Studio支持代码高亮、自动补全、Git 集成、终端命令等常规IDE的基础功能,在此基础上增加了多人协作、一键部署、实时调试、插件扩展等黑科技,不需要装各种环境,简单易用,开箱即用

功能再多终归还是要用起来才算数,要想体验Cloud Studio也很简单,花一分钟快注册帐号即可👇

账号注册

先来到官网,右上角注册,亲测只需要一分钟就能注册好 👉官网传送门

在这里插入图片描述
提供了三种登录方式,我是用的微信,扫一扫授权就能自动注册并且登陆
在这里插入图片描述
登录进来以后我们能看到这里有很多模板,这些模板有的是初始框架,也有的是一些项目demo,这些模板会不断更新,甚至我们自己也可以往里面提交自己的模板

相信到这里大家就已经看出来了,光这点就不是传统ide能做到的

小试牛刀

我们随便挑一个vue模板来演示吧

单击vue模板即可初始化模板
在这里插入图片描述

大概一分钟过后,项目初始化好了,并且已经启动了
在这里插入图片描述
好了,演示完毕

是的你没有看错,演示完毕!!!


真不是我偷懒,虽然只是动了下手指单击鼠标,但一个活生生的vue项目确确实实已经初始化完成并且跑起来了,就问你爽不爽吧

虽然博主是个臭写Java的,但以前也有过使用vue的经历,依稀记得首先是下载安装IDE,安装好了以后开始配置各种环境,然后才新建vue项目,最后才开始调试运行,整个过程中遇到的问题数不胜数,尤其是对我这种门外汉,不掉10根头发根本搞不定

我现在依然是门外汉,但我靠Cloud Studio,用一分钟完成了以前一天甚至几天才能完成的工作

话又说回来,Cloud Studio虽然快,但启动一个vue项目该有的步骤可一个都没漏掉,它只是把这些繁琐、重复的步骤统一化,让我们开发者有更多时间注重业务

深度体验

下面我将用Cloud Studio 快速搭建并开发还原一个移动端 React H5 的简版点餐系统页面,从 0 到 1 体验云IDE给我们带来的优势,注意,我对react一无所知,但这丝毫不影响我搭建
在这里插入图片描述

选择如下react模板,开始初始化…
在这里插入图片描述
等待初始化,预计十秒,跟个人网络带宽有关
在这里插入图片描述
初始化完成后,会自动进行环境和依赖安装
在这里插入图片描述
直到出现如下界面,一个react项目就初始化完成并且跑起来了
在这里插入图片描述
到此可以发现,即使从来没有学习过 React(比如博主),只需要打开对应的 React 框架模板,即可开始初始化一个 React 的工作空间,只要有浏览器,不需要准备任何环境,不需要安装任何软件,只需要能够联网,就能在几分种内初始化一个 React 项目,这对新技术的学习是非常高效的。

为了快速开发,我们使用antd-mobile UI库,antd-mobile 是 Ant Design 的移动规范的 React 实现,我们需要先引入依赖

这里我们新开一个终端窗口
在这里插入图片描述
在这里我们就能像在本地一样敲一些命令
在这里插入图片描述
ok言归正传,复制以下命令到终端,安装antd-mobile

npm install --save antd-mobile@^5.32.0

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

复制以下命令到终端,安装less 和 less-loader

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 文件,找到如下代码,这块是设置 css 相关的代码。
在这里插入图片描述
我们需要在这里新增两行代码
在这里插入图片描述
代码在这儿👇

const lessRegex = /\.(less)$/;
const lessModuleRegex = /\.module\.(less)$/;

接下来修改less代码

在webpack.config.js文件中搜索saas关键字
在这里插入图片描述
下面是修改后的代码,注意别修改错了
在这里插入图片描述
这样就完成了webpack.config.js配置less,可以在项目中使用less样式了。

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

输入以下命令安装normalize

yarn add -D normalize.css@^8.0.1

在这里插入图片描述
我们的项目需要用到一些素材,需要手动下载,下载地址

下载完解压,然后直接将img目录拖到项目的src目录下即可
在这里插入图片描述
以下是我们项目的主要业务代码,复制到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即可启动该项目
在这里插入图片描述
至此,我们的react项目演示完成

使用场景和产品优势

Cloud Studio适用于以下几个场景:

快速启动项目
使用 Cloud Studio 的预置环境,您可以直接创建对应类型的工作空间,快速启动项目进入开发状态,无需进行繁琐的环境配置;其实仅靠这一点,Cloud Studio已经足以将传统IDE按在地上摩擦

多人协作
Cloud Studio支持邀请他人一起开发,这弥补了传统IDE只能一人一机的短板,有了多人协作,可以随时随地远程探讨代码

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

远程访问云服务器
Cloud Studio 支持您连接自己的云服务器,这样就可以在编辑器中查看云服务器上的文件,进行在线编程和部署工作

总结

经过几天的深度体验,大体功能已经体验完毕,更多细节还需要大家一起去探索,当初第一次使用IntelliJ IDEA被它代码补全震惊的场景再次复现,熟悉的感觉回来了;

以后妈妈再也不用担心我代码没保存突然断电,也不用担心每次换电脑要重新安装各种IDE和各种环境,Cloud Studio帮我节省的不止是时间,还有头发~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多元函数的极值和最值

目录 无约束极值 极值的必要条件 驻点和极值点的关系 多元函数极值点可能取的点&#xff1a; 极值的充分条件 条件极值与拉格朗日乘数法 最大最小值 例题 例题1&#xff1a; 例题2&#xff1a; ​编辑 例题3&#xff1a; 例题4&#xff1a; ​编辑 例题5&#xff1a; 例…

DuDuTalk:AI语音工牌如何帮助教培公司高效管理课程顾问团队

近年来&#xff0c;随着人工智能的快速发展&#xff0c;越来越多的公司开始利用AI技术来提高工作效率和管理效果。在教育培训行业中&#xff0c;课程顾问团队的管理对于公司的运营和发展至关重要。 而在实际管理中&#xff0c;受教培人员素质参差不齐&#xff0c;能力差异大&a…

Java课题笔记~Maven基础知识

一、什么是Maven&#xff1f; Maven是专门用于管理和构建Java项目的工具。 它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理机制 …

python小游戏课程设计报告,python游戏课程设计报告

大家好&#xff0c;给大家分享一下python2048游戏课程设计报告&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01;

安装java11( 安装jdk11)记录

下载JDK11 国内华为镜像下载&#xff1a;https://repo.huaweicloud.com/java/jdk/11.0.29/injdk 镜像下载&#xff1a;https://www.injdk.cn/官网下载&#xff1a;https://www.oracle.com/java/technologies/downloads/#java11 个人使用华为镜像下载 安装 下载后上传至Lin…

用DBeaver进行数据备份与恢复

一、数据备份 1、选择需要备份的数据库或数据表&#xff0c;鼠标右击。 2、选择“工具-转存数据库” 3、勾选需要导出备份的数据库和数据表 可自行设置&#xff0c;这里直接点击开始&#xff1b; 导出完成 二、数据恢复 1、选择需要恢复的数据库或数据表&#xff0c;鼠标右…

数学建模学习(8):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

【C语言】通讯录2.0 (动态增长版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录1.0&#xff08;静态版&#xff09;的基础上进行改进&#xff0c;请先看系列文字第…

IPv4网络用户访问IPv6网络服务器

NAT64静态映射为一对一的对应关系&#xff0c;通常应用在IPv4网络主动访问IPv6网络的场景中。 要求位于IPv4网络中的PC通过IPv4地址1.1.1.10能够直接访问位于IPv6网络中Server。 操作步骤 配置FW。 # 配置接口GigabitEthernet 0/0/1的IPv4地址。 <FW> system-view [F…

MyBatis-Plus 分页插件实现分页查询

目录 1. 配置分页查询的拦截器 2. 使用 Page 对象实现分页功能 1. 配置分页查询的拦截器 因为 MyBatis-Plus 里面使用了分页插件来实现分页查询, 所以我们需要将 MyBatis-Plus 的插件添加到当前的项目里, 这样我们执行的查询操作才会生效. 创建 PageConfig 类: Configurat…

华为云hcip核心知识笔记(存储服务规划)

云上存储 &#xff1a; 云硬盘:基于分布式架构&#xff0c;可弹性扩展的虚拟块存储服务 注意事项 挂载云硬盘实例和云硬盘必须在同一区域&#xff0c;否则挂载失败文件存储服务&#xff1a;完全托管的共享文件存储 可以为多个实例实现共享访问&#xff0c;不同vpc中可以进行对…

用python需要下载软件吗,python需要安装哪些软件

大家好&#xff0c;本文将围绕安装python需要什么样的电脑配置展开说明&#xff0c;python需要安装哪些软件是一个很多人都想弄明白的事情&#xff0c;想搞清楚用python需要下载软件吗需要先了解以下几个事情。 编程这东西很神奇。对于那些知道如何有用和有趣的这个工具,对于Xi…

数字IC验证高频面试问题整理附答案(二)

近日后台有同学私信还想要验证的面试题目&#xff0c;这不就来了~ Q16.权重约束中”:”和”: /”的区别 : 操作符表示值范围内的每一个值的权重是相同的,比如[1:3]:40,表示1&#xff0c;2&#xff0c;3取到的概率为40/120&#xff1b; :&#xff0f;操作符表示权重要平均分到…

手把手教你在云环境炼丹(部署Stable Diffusion WebUI)

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有些同学反映对硬件的要求太高&#xff0c;显卡太TM贵了。今天我再分享一个云服务器炼丹的方法&#xff0c;方便大家快速入门上手&#xff0c;这个云服务不需要特殊网络设置&#xff0c;能…

【rtmp】2: rtmp 推送 annexb

参考RTMP协议封装H264和H265协议详解 大神分析rtmp推送的大部分是annexb的h264 因此,我们就以此为格式 转为rtmp avcc 推送到服务器端。 一般sps、pps 前面有4个 字节的起始码,所以要跳过,不要计算在sps pps 长度里。 对于视频,先发avc头 第一个 5个字节 第一个字节 0x17 ,…

source insight常用操作

1、窗口布局 SI窗口十分丰富&#xff0c;通过菜单栏View->Toolbars/panels选择显示那些工具栏/窗口 Source Insight 窗口介绍_sourceinsight窗口_STCNXPARM的博客-CSDN博客 2、RGB护眼色 Source Insight4.0字体大小及护眼背景配置_sourceinsight4背景色配置_ProYuan28的…

Let’s Encrypt 免费证书提示:(STAGING) Pretend Pear X1证书不受信任

通过Let’s Encrypt 免费申请证书&#xff0c;发现浏览器并不信任 原因 我使用了ACME V2 测试环境&#xff1a; https://acme-staging-v02.api.letsencrypt.org/directory 需要改为生产环境 https://acme-v02.api.letsencrypt.org/directory 测试环境有两个活跃的根证书…

vue中的require

vue中的require 一、基本概念二、具体演示1.引入json2.引入图片 三、require.context引入图片&#xff1a;引入json引入模块js&#xff1a;引入vue文件&#xff1a; 一、基本概念 require 是 node 中的一个方法&#xff0c;他的作用是 用于引入模块、 JSON、或本地静态文件。r…

快速开发框架若依的基础使用详解

Hi I’m Shendi 快速开发框架若依的基础使用详解 最近在为公司制作新的项目&#xff0c;经过了一段时间的技术沉淀&#xff0c;我开始尝试接触市面上用的比较多的快速开发框架&#xff0c;听的最多的当属若依吧 于是就选用了若依 介绍 为什么选&#xff1f;目的是为了提高开发…

【前端设计】尝试一文搞懂verilog parameter的全部细节

这里是尼德兰的喵芯片设计相关文章&#xff0c;欢迎您的访问&#xff01; 如果文章对您有所帮助&#xff0c;期待您的点赞收藏&#xff01; 让我们一起为成为芯片前端全栈工程师而努力&#xff01; 一个参数的标准定义呢应该是这样的&#xff1a; parameter type range name …