web 应用实战第2课:静态网站的全生命周期实践 | 学习笔记

本文涉及的产品
.cn 域名,1个 12个月
简介: 简介:快速学习 web 应用实战第2课:静态网站的全生命周期实践

开发者学堂课程【云开发 Web 应用训练营:web 应用实战第2课:静态网站的全生命周期实践】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/911/detail/14414


web 应用实战第2课:静态网站的全生命周期实践

目录:

一.开发简单的静态应用页面

二.head 内的配置

三.静态网站

四.静态网站自动部署到云存储

五.提醒

六. Active 阶段

七.Passive 阶段

八.Hidden 阶段

九.Terminated 阶段

十.Frozen 阶段

十二.Discarded 阶段

十三.常见场景

十四.事件


一.开发简单的静态应用页面

if(path--'/'){

modulePath . codePath + '/index.html';fileExt . 'html';

if( !fs. existsSync(modulePath)){

modulePath . codePath + . /index. htm' ;if(!fs. existsSync(modulePath) ){

modulePath . codePath + " /default html' ;if( !fs. existsSync (modulePath) )4.

modulePath . codePath + '/defáult. htm';

}

}

}

var fileResponse ={

isBase64Encoded: true,

statusCode: 200,

headers: {

"Content-type": NIME[fileExt)

},

body: Buffer. from(data) . toString("tase64")

}

callback(null, fileResponse);return;

空应用最简单的应用方案

部署日常环境

进入应用列表创建应用

开发最简单的静态网站

所有的请求都是 serverless.js(函数)来处理

点击新建文件 index.htm 文件

插件提供部署功能和测试功能

调制的相关日志可以在控制台输出

当请求的路径是根路径,会默认寻找根目录的 index.html 的文件。

在空应用中创建 index.html

只需要将代码拖拽到到文件模块。即可上传,覆盖之前的文件

测试域名只能在当前浏览器使用

部署日常环境,直接点击部署

二级域名绑定到开发者域名,在应用配置中绑定域名

应用列表点击环境开关。点击关闭验证下线,停止服务,成功下线即可删除应用


二.head 内的配置

1、title 网页标题

2、标签页 icon 图标

图标的文件名要求以 favicon.ico 命名,文件需要与 index.html 文件同级存储

使用方法:

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"

3、CSS 分级引入

css 文件设置需要根据功能进行分层管理:目的是为了提取出多个页面公共的部分,提供多个 HTML 同时引用。

公共的部分也可以划分范围:有的是所有网站能用的,有的是某几个网站公共的部分

CSS 常见的分层组织:清除默认样式的 CSS 、网站的公共样式 CSS 、每个页面独有的 CSS

注意书写顺序,引入多层 css 时,需要按照后面的层叠前面的 css 进行设置,使用页面独有的样式层叠公共的样式

4、清除默认样式

使用范围:所有的网站都能用

命名的习惯:reset.css

引入时作为第一层引入

注意:reset.css 文件写完后不允许再次更改

5、公共样式

使用范围:单独的一个网站所有的页面、几个页面

制作方法:找到公共部分,划分成不同的模块分别进行 .css 文件的书写

命名习惯:common.css 或者模块名 .css

公共文件中的类名一般不要在其他的 css 文件中再用

引入顺序:一般在 reset.css 的后面,单独样式文件的前面

6、页面独有样式

使用范围:单独的一个 HTML 页面

命名习惯:一般与 HTML 的文件名保持一致,如果拆分的更细致可以使用多个单词的拼写,例如 index_banner.css

引入顺序:所有公共样式的后面

注意:使用单独样式文件去层叠前面公共样式时,需要注意选择器权重


三.静态网站

目前,静态网站有 2 种:

无内容的单页应用(SPA):React/VUE 等框架开发的应用;

有内容的 HTML:手写或「程序生成 HTML」;

警告:React/VUE SPA 不带内容,难以被搜索引擎收录,不适合作为公司官网、博客。如果有 SEO 需求,推荐使用 MkDocs、Hexo、VUE Nuxt、React Next。


四.静态网站自动部署到云存储

通过「持续集成」生成 HTML,自动部署到「云存储」,变成静态网站。

1、在「腾讯云 对象存储 COS」中创建一个「公有读私有写」的「存储桶」,并在设置中开启「静态网站」,获得分配的二级域名「访问链接」。

为下线不可删除应用

可以在测试环节先上线,测试稳定后,愈发测试,最后正式上线。

image.png

2、把项目代码推送到「CODING 代码仓库」,在「CODING 持续集成」中创建一个构建计划,选择「构建并上传到腾讯云 COS」模板,填入「腾讯云 COS 访问密钥」等信息,根据自己的代码框架修改编译命令。

创建后会自动触发构建,等待构建成功,访问分配的链接即可看到网站。

下次推送代码即可自动部署。

3、如果你的域名已备案,则可在「腾讯云 对象存储」的设置中绑定「自定义加速域名」,会提示开通「内容分发网络 CDN」,小型网站推荐选择「按使用流量计费」(每月赠送 10GB,一般用不完),将会获得一个 CNAME。

image.png

4、在「DNS 解析」中设置 www 和 根域名,确保两者皆可访问,并且二选一进行跳转避免影响 SEO,推荐 2 种方案:

此域名无邮箱:根域名指向 CDN,www 跳转到根域名,本文采用此方案,把 www.devops.host 跳转到了 devops.host

此域名有邮箱:www 指向 CDN,根域名跳转到 www

image.png

5、在「内容分发网络 CDN」——「域名管理」——某个域名——「高级设置」——「HTTPS 配置」中,申请免费的 HTTPS 证书,并开启「HTTPS 回源」、「强制跳转 HTTPS」和「HTTP 2.0」。

image.png

6、开通「腾讯云 云函数 SCF」,按照文档「使用 SCF 自动刷新被 CDN 缓存的 COS 资源」上传代码。

image.png


五.提醒:

如果网站面向中国境内用户,需要进行域名备案,然后才能绑定到境内的云存储/CDN 。本文以腾讯云为例,其他云计算厂商的流程也类似。

如果网站面向中国境外用户,可直接使用境外云存储/CDN 搭建静态网站。

Jenkinsfile

pipeline {

agent any

stages {

stage('检出') {

steps {

checkout([$class: 'GitSCM',

branches: [[name: env.GIT_BUILD_REF]],

userRemoteConfigs: [[

url: env.GIT_REPO_URL,

credentialsId: env.CREDENTIALS_ID

]]])

}

}

stage('安装依赖') {

steps {

sh 'npm i -g lint-md-cli'

sh 'pip install mkdocs'

}

}

stage('检查书写规范') {

steps {

sh 'lint-md docs/'

}

}

stage('编译') {

steps {

sh 'mkdocs build'

}

}

stage('上传到 COS Bucket') {

steps {

sh "coscmd config -a ${env.COS_SECRET_ID} -s ${env.COS_SECRET_KEY}" +

" -b ${env.COS_BUCKET_NAME} -r ${env.COS_BUCKET_REGION}"

sh 'coscmd upload -r ./site/ /'

echo "预览 https://${env.COS_BUCKET_NAME}.cos-website.${env.COS_BUCKET_REGION}.myqcloud.com/"

}

}

}

}


六. Active 阶段

在 Active 阶段,网页处于可见状态,且拥有输入焦点。


七.Passive 阶段

在 Passive 阶段,网页可见,但没有输入焦点,无法接受输入,UI 更新(比如动画)仍然在执行;该阶段只可能发生在桌面同时有多个窗口的情况。


八.Hidden 阶段

在 Hidden 阶段,用户的桌面被其他窗口占据,网页不可见,但尚未冻结;UI 更新不再执行。


九.Terminated 阶段

在 Terminated 阶段,由于用户主动关闭窗口,或者在同一个窗口前往其他页面,导致当前页面开始被浏览器卸载并从内存中清除;注意,这个阶段总是在 Hidden 阶段之后发生,也就是说,用户主动离开当前页面,总是先进入 Hidden 阶段,再进入 Terminated 阶段。

这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。


十.Frozen 阶段

如果网页处于 Hidden 阶段的时间过久,用户又不关闭网页,浏览器就有可能冻结网页,使其进入 Frozen 阶段;不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。

这个阶段的特征是,网页不会再被分配 CPU 计算资源:

定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。

浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。


十一.Discarded 阶段

如果网页长时间处于 Frozen 阶段,用户又不唤醒页面,那么就会进入 Discarded 阶段,即浏览器自动卸载网页,清除该网页的内存占用;不过,Passive 阶段的网页如果长时间没有互动,也可能直接进入 Discarded 阶段。

这一般是在用户没有介入的情况下,由系统强制执行,任何类型的新任务或 JavaScript 代码,都不能在此阶段执行,因为这时通常处在资源限制的状况下。

网页被浏览器自动 Discarded 以后,它的 Tab 窗口还是在的。如果用户重新访问这个 Tab 页,浏览器将会重新向服务器发出请求,再一次重新加载网页,回到 Active 阶段。


十二.常见场景

以下是几个常见场景的网页生命周期变化:

(1)用户打开网页后,又切换到其他 App,但只过了一会又回到网页。

-> 网页由 Active 变成 Hidden,又变回 Active。

(2)用户打开网页后,又切换到其他 App,并且长时候使用后者,导致系统自动丢弃网页。

-> 网页由 Active 变成 Hidden,再变成 Frozen,最后 Discarded。

(3)用户打开网页后,又切换到其他 App,然后从任务管理器里面将浏览器进程清除。

-> 网页由 Active 变成 Hidden,然后 Terminated。

(4)系统丢弃了某个 Tab 里面的页面后,用户重新打开这个 Tab。

-> 网页由 Discarded 变成 Active。


十三.事件

生命周期的各个阶段都有自己的事件,以供开发者指定监听函数,这些事件里面,只有两个是新定义的(freeze 事件和 resume 事件),其它都是现有的。

注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧;也就是说,内嵌的 <iframe> 网页跟顶层网页一样,都会同时监听到下面的事件:

(1)focus 事件

focus 事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。

(2)blur 事件

blur 事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。

(3)visibilitychange 事件

visibilitychange 事件在网页可见状态发生变化时触发,一般发生在以下几种场景:

用户隐藏页面(切换 Tab、最小化浏览器),页面由 Active 阶段变成 Hidden 阶段

用户重新访问隐藏的页面,页面由 Hidden 阶段变成 Active 阶段

用户关闭页面,页面会先进入 Hidden 阶段,然后进入 Terminated 阶段

可以通过 document.onvisibilitychange 属性指定这个事件的回调函数。

(4)freeze 事件

freeze 事件在网页进入 Frozen 阶段时触发。

可以通过 document.onfreeze 属性指定在进入 Frozen 阶段时调用的回调函数:

function handleFreeze(e) {

// Handle transition to FROZEN } document.addEventListener('freeze', handleFreeze); // 或者

document.onfreeze = function() { … }

这个事件的监听函数,最长只能运行 500 毫秒,并且只能复用已经打开的网络连接,不能发起新的网络请求。

注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。

(5)resume 事件

resume 事件在网页离开 Frozen 阶段

变为 Active / Passive / Hidden 阶段时触发。

document.onresume 属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数:

function handleResume(e) { // handle state transition FROZEN -> ACTIVE } document.addEventListener("resume", handleResume);

// 或者

document.onresume = function() { … }

(6)pageshow 事件

pageshow 事件在用户加载网页时触发,这时,有可能是全新的页面加载,也可能是从缓存中获取的页面;如果是从缓存中获取,则该事件对象的 event.persisted 属性为 true,否则为 false。

这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。

(7)pagehide 事件

pagehide 事件在用户离开当前网页、进入另一个网页时触发,它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。

如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的 event.persisted 属性为 true; 如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。

(8)beforeunload 事件

beforeunload 事件在窗口或文档即将卸载时触发,该事件发生时,文档仍然可见,此时卸载仍可取消;经过这个事件,网页进入 Terminated 状态。

(9)unload 事件

unload 事件在页面正在卸载时触发,经过这个事件,网页进入 Terminated 状态。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1月前
|
移动开发 开发者 HTML5
构建响应式Web界面:Flexbox与Grid的实战应用
【10月更文挑战第22天】随着互联网的普及,用户对Web界面的要求越来越高,不仅需要美观,还要具备良好的响应性和兼容性。为了满足这些需求,Web开发者需要掌握一些高级的布局技术。Flexbox和Grid是现代Web布局的两大法宝,它们分别由CSS3和HTML5引入,能够帮助开发者构建出更加灵活和易于维护的响应式Web界面。本文将深入探讨Flexbox和Grid的实战应用,并通过具体实例来展示它们在构建响应式Web界面中的强大能力。
39 3
|
28天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
139 45
|
23天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
34 1
|
24天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
40 1
|
2月前
|
计算机视觉 Python
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
这篇文章是关于如何使用Flask框架结合OpenCV库,通过电脑摄像头实现视频流在网页上的实时显示,并提供了单摄像头和多摄像头的实现方法。
94 2
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
|
26天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
47 1
|
26天前
|
前端开发 开发者 UED
移动优先:响应式设计在现代Web开发中的实践策略
【10月更文挑战第29天】在现代Web开发中,响应式设计已成为不可或缺的实践策略,使网站能适应各种设备和屏幕尺寸。本文介绍了移动优先的设计理念,对比了移动优先与桌面优先的策略,探讨了流式布局与固定布局的区别,详细讲解了CSS媒体查询的使用方法,并强调了触摸和手势支持及性能优化的重要性。
31 1
|
2月前
|
Web App开发 前端开发 JavaScript
Web开发者必收藏的10个实用网站,你还没收藏吗?
将这些网站收藏起来,定期访问,使它们成为您日常工作的一部分,助您在快速发展的 Web 开发领域保持领先。
109 2
Web开发者必收藏的10个实用网站,你还没收藏吗?
|
29天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
43 2
|
29天前
|
人工智能 搜索推荐 PHP
PHP在Web开发中的璀璨星辰:构建动态网站的幕后英雄###
【10月更文挑战第25天】 本文将带您穿越至PHP的宇宙,揭示其作为Web开发常青树的奥秘。通过生动实例与深入解析,展现PHP如何以简便、高效、灵活的姿态,赋能开发者打造动态交互式网站,同时不忘探讨其在新时代技术浪潮中面临的挑战与机遇,激发对技术创新与应用的无限思考。 ###
33 1