js提取指定网站内容(本文开发官网(/)的搭建思路,分享云开发结合流行框架与工具的实战经验)

优采云 发布时间: 2021-09-04 21:21

  js提取指定网站内容(本文开发官网(/)的搭建思路,分享云开发结合流行框架与工具的实战经验)

  关于作者:

  董元新是云开发CloudBase团队的研发工程师。他专注于前端工程和节点服务开发。他在业余时间出没。

  本文内容:

  简介

  随着腾讯云开发能力的提升,经验丰富的工程师已经可以独立完成产品的开发和上线。但是,与在线云开发相关的实战文章很少。很多开发者都知道云开发的能力,但不知道如何在现有的开发体系下引入云开发。

  

  本文从云开发团队开发者+能力用户的角度,以搭建云开发官网的思路(/)为例,分享结合流行框架和工具的云开发实践经验。

  涉及的知识点有:

  React 框架:Next.jsCI 自动构建概述

  系统设计图:

  

  背景介绍

  随着云开发团队业务的快速发展,团队需要一个官网来更直观、即时地向开发者展示云开发的相关能力,包括但不限于工具链、SDK、技术文档等。

  同时,为了降低开发者的动手成本,积累行业优秀的实践经验,官网还承载着营造社区氛围、聚合重要信息、提升用户留存的重任。

  我们最初使用 VuePress 作为静态 网站 工具,遇到了一些痛点:

  我们使用“cms扩展”、“基础云开发能力”、“Next.js”、“CI工具”来解决以上问题。在实现网站内容动态的同时,保证SEO,运营同学也可以通过cms可视化管理内容。

  安装cms

  进入云开发拓展能力控制台,按照提示安装cms内容管理系统。

  在配置扩展时,有两种类型的帐户:管理员帐户和操作员帐户。管理员账户具有更高的权限,可以创建新的数据集合;而operator账号只能对已有的数据集进行增删改查。

  

  注意:

  安装时间有点长,请耐心等待

  安装成功后,云数据库会自动创建3个合集,分别是tcb-ext-cms-contents、tcb-ext-cms-users、tcb-ext-cms-webhooks和存储cms系统配置信息和内容数据。会自动创建三个云函数,分别是tcb-ext-cms-api、tcb-ext-cms-init、tcb-ext-cms-auth,它们封装了初始化、鉴权和数据流的相关逻辑。

  输入“static网站hosting”,可以看到cms系统的静态文件已经自动部署到tcb-cms/目录下:

  

  点击上方的“基本配置”查看域名信息。

  

  在浏览器中访问对应链接(/tcb-cms/)查看cms系统:

  

  至此,无需任何开发成本,cms内容管理系统正式上线~

  使用cms创建动态内容

  对于动态数据内容,我们将其划分为不同的模块。每个内容模块对应一个cms系统的数据集合。例如,在“云开发官网”-“社区页面”中,推荐好课程的内容是动态的。

  

  从图中可以看出,每节课都有多个属性。在云数据库中,每门课程对应一个文档,课程属性对应文档的字段。字段类型及含义如下:

  name: 课程名称

time: 课程时间

cover: 课程封面

url: 课程链接

level: 课程难度

  以管理员身份登录cms系统,在“内容设置页面”新建内容。在cms中支持多种高级数据类型,如url、image、markdown、富文本、标签数组、邮箱、URL等,这些类型被智能识别,显示更友好。

  注意:

  cms自带图床功能。当数据类型为“图片”时,图片会自动上传到当前云开发环境下的云存储中。图像信息以cloud://开头的特殊链接存储在数据集合中。

  新建内容时,cms默认会自动填写4个字段:name、order、createTime、updateTime。您可以根据需要删除不需要的字段。

  推荐:

  order 字段是保留的,可以用于数据排序。对于运营商来说,数据的顺序值越大,在cms系统中显示的位置就越高;对于开发者来说,可以按照顺序进行排序和搜索。从而保证体验和逻辑的一致性。

  根据字段创建集合后,cms会在系统左侧看到“推荐课程”。其对应的内容保存在云数据库的recome-course(创建时指定)集合中,其字段信息保存在云的tcb-ext-cms-contents(cms初始化时创建)集合中数据库。

  

  根据设置添加新的课程内容后,再次进入“推荐课程”,如下图:

  

  图片、链接等内容向运营商展示更友好。

  项目建设

  按照 Next.js Docs 的指南创建 Next.js 项目:

  npm i --save next react react-dom

  因为我们要部署网站到“静态托管”,所以需要用到Next.js的静态导出功能。 package.json 中的打包脚本更新为:

  "scripts": {

"dev": "next",

"build": "next build && next export",

"start": "next start"

}

  为了快速部署静态网站并发布云功能。需要全局安装@cloudbase/cli:

  npm install -g @cloudbase/cli

  安装后,添加两个脚本:

  "scripts": {

"deploy:hosting": "npm run build && cloudbase hosting:deploy out -e jhgjj-0ae4a1",

"deploy:function": "echo y | cloudbase functions:deploy --force"

}

  注意:

  准备两个云环境,防止静态部署时文件覆盖。 envId为jhgjj-0ae4a1的云环境仅用于部署Next.js的静态导出文件。 envId为pagecounter-d27cfe的云环境用于部署cms系统。获取cms内容

  通过CloudBase的Node SDK-@cloudbase/node-sdk,我们可以在Next.js的getStaticProps()方法中读取云数据库中的数据。

  为了使逻辑更清晰,我们将获取外部数据的方法封装在一个文件中。以“推荐课程”为例:

  // provider.js

const cloudbase = require("@cloudbase/node-sdk");

const config = {

secretId: "your secretId", // 前往「腾讯云控制台」-「访问密钥」获取

secretKey: "your secretKey", // 前往「腾讯云控制台」-「访问密钥」获取

env: "your envid" // 前往「腾讯云控制台」-「云开发 CloudBase」获取

};

const app = cloudbase.init(config);

/**

* 获取云数据库数据

*/

async function getCourses() {

const db = app.database();

const result = await db.collection("recommend-course").get();

if (result.code) {

throw new Error(

`获取「推荐课程」失败, 错误码是${result.code}: ${result.message}`

);

}

return result.data.map(item => {

if (item.createTime instanceof Date) {

item.createTime = item.createTime.toLocaleString();

}

if (item.updateTime instanceof Date) {

item.updateTime = item.updateTime.toLocaleString();

}

item.cover = getBucketUrl(item.cover); // 处理云存储的特殊链接

return item;

});

}

  如上一篇所述,cms有自己的图床功能。拖拽上传的图片会保存在同一环境的云存储中,获取图片的链接会保存在采集中。云存储链接是以cloud://开头的特殊链接,需要前端识别和特殊处理。

  例如图片存储链接为:cloud://pagecounter-d27cfe.7061-pagecounter-d27cfe-1255463368/uploads/04.png。将其转换为可访问的 http 链接:

  转换思路是:识别出envid背后的信息,与tcb.qcloud.la域名重新拼接:

  // provider.js

/**

* 获取云存储的访问链接

* @param {String} url 云存储的特定url

*/

function getBucketUrl(url) {

if (!url.startsWith("cloud://")) {

return url;

}

const re = /cloud:\/\/.*?\.(.*?)\/(.*)/;

const result = re.exec(url);

return `https://${result[1]}.tcb.qcloud.la/${result[2]}`;

}

  注意:

  云存储的“权限设置”应该是:所有用户都可以读,只有创建者和管理员可以写。否则链接无法访问。

  推荐:

  除了内置的图床功能外,开发者还可以根据自己的需求使用其他稳定的图床服务,例如微博图床。如果使用其他图片床,对应的字段类型不能设置为“图片”,可以是“字符串”或“超链接”。

  到此为止,我们已经使用 SDK 获取了云数据库数据,剩下要做的就是将其注入到 Next.js 页面组件的 props 中:

  // pages/index.js

const HomePage = ({ courses }) => {

return (

// 尽情使用数据吧...

)

}

export async function getStaticProps() {

const { getCourses } = require('./../provider')

return {

props: {

courses: await getCourses()

}

}

}

export default HomePage

  打开浏览器输入:3000/,可以看到效果如下:

  

  输入view-source::3000/,可以看到网页的html源码中收录了课程数据,解决了SEO问题:

  

  注意:

  Next.js 的一些方法会在两端运行,但 getStaticProps() 只会在服务器端运行自动构建和部署

  到此,开发工作基本结束。执行npm run build命令,网站静态文件打包在out/目录下:

  

  执行 npm run deploy:hosting 将 out/ 目录下的文件上传到“static网站hosting”。访问静态网站托管的链接:/,效果如下:

  

  借助成熟的 CI 工具,例如 Travis、Circle 等,可以定期触发构建工作。这样,内容和开发就完全分离了。

  在构建版本时,您需要使用 CloudBase CLI 工具。在CI工具中,不再使用cloudbase login进行交互式输入登录,而是使用一键登录:cloudbase login --apiKeyId $TCB_SECRET_ID --apiKey $TCB_SECRET_KEY。

  注意:

  前往 Cloud API Key 获取 TCB_SECRET_ID 和 TCB_SECRET_KEY 的值

  在 CI 工具的控制台中,配置 TCB_SECRET_ID 和 TCB_SECRET_KEY。并向 package.json 添加一个新脚本:

  "scripts": {

"login": "echo N | cloudbase login --apiKeyId $TCB_SECRET_ID --apiKey $TCB_SECRET_KEY"

}

  总结起来,CI构建的过程是:

  如果数据需要紧急修改在线,您可以在本地或在CI工具控制台手动触发构建。

  终于

  借助云开发cms,可以实现评论系统、预约系统、博客发帖等各种内容模板,快速搭建网站。在现有的开发体系下,合理使用云开发,大大降低了人工成本、开发成本、运维成本。实现前后端穿梭,形成“闭环”。

  本文的实战只是开始。它涉及到部分云开发能力。还有更多好玩的东西等着你去探索,比如使用云函数实现SSR、托管后端服务、图片服务、各种端SDK等。

  探索功能、多样化想法并以较低的成本开发高度可用的网络服务。云开发绝对是您的最佳选择!

  更多信息:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线