From 4aa2f4da920f486a029e35364a90e4d59190681a Mon Sep 17 00:00:00 2001 From: Edan's Win11 <961150665@qq.com> Date: Mon, 30 Dec 2024 14:17:41 +0800 Subject: [PATCH 1/5] First commit --- placeholder | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 placeholder diff --git a/placeholder b/placeholder new file mode 100644 index 000000000..e69de29bb From cd89c4e1206fee567b683e6061ab1c03edc3f7b0 Mon Sep 17 00:00:00 2001 From: Edan's Win11 <961150665@qq.com> Date: Mon, 30 Dec 2024 14:17:47 +0800 Subject: [PATCH 2/5] Site updated: 2024-12-30 14:17:41 --- .../index.html" | 234 + 2020/06/10/js-md5/index.html | 174 + .../index.html" | 237 + .../index.html" | 217 + .../index.html" | 210 + .../index.html" | 201 + .../index.html" | 228 + .../index.html" | 411 ++ .../index.html" | 2304 ++++++ .../index.html" | 309 + .../index.html" | 183 + 2020/11/10/jsdelivr/index.html | 193 + .../index.html" | 201 + .../index.html" | 179 + .../index.html" | 170 + .../index.html" | 260 + 2020/12/15/GitHub-Corners/index.html | 175 + .../index.html" | 205 + .../index.html" | 170 + .../index.html" | 214 + .../index.html" | 169 + .../index.html" | 170 + .../index.html" | 170 + .../index.html" | 172 + .../index.html" | 173 + .../index.html" | 169 + .../index.html" | 177 + .../index.html" | 173 + .../index.html" | 178 + .../index.html" | 255 + .../index.html" | 173 + .../index.html" | 180 + .../index.html" | 476 ++ .../index.html" | 396 ++ .../index.html" | 346 + .../index.html" | 584 ++ 2024/12/30/hello-world/index.html | 174 + CNAME | 1 + archives/2020/06/index.html | 237 + archives/2020/07/index.html | 237 + archives/2020/08/index.html | 237 + archives/2020/10/index.html | 237 + archives/2020/11/index.html | 237 + archives/2020/12/index.html | 237 + archives/2020/index.html | 237 + archives/2020/page/2/index.html | 237 + archives/2021/01/index.html | 237 + archives/2021/02/index.html | 237 + archives/2021/03/index.html | 237 + archives/2021/04/index.html | 237 + archives/2021/05/index.html | 237 + archives/2021/07/index.html | 237 + archives/2021/index.html | 237 + archives/2021/page/2/index.html | 237 + archives/2024/12/index.html | 237 + archives/2024/index.html | 237 + archives/index.html | 237 + archives/page/2/index.html | 237 + archives/page/3/index.html | 237 + archives/page/4/index.html | 237 + assets/images/avator.jpg | Bin 0 -> 86046 bytes categories/CSS/index.html | 237 + categories/Git/index.html | 237 + categories/JavaScript/index.html | 237 + categories/LeetCode/index.html | 237 + categories/Socket/index.html | 237 + categories/VSCode/index.html | 237 + categories/Vue/index.html | 237 + categories/Webpack/index.html | 237 + categories/index.html | 239 + categories/npm/index.html | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../\351\235\242\350\257\225/index.html" | 237 + css/calendar.css | 165 + css/index.css | 6239 +++++++++++++++++ placeholder => css/var.css | 0 img/404.jpg | Bin 0 -> 16393 bytes img/butterfly-icon.png | Bin 0 -> 275383 bytes img/error-page.png | Bin 0 -> 35850 bytes img/favicon.ico | Bin 0 -> 15406 bytes img/friend_404.gif | Bin 0 -> 65097 bytes index.html | 237 + js/calendar.js | 6 + js/gitcalendar.js | 102 + js/main.js | 930 +++ js/search/algolia.js | 174 + js/search/local-search.js | 360 + js/tw_cn.js | 117 + js/utils.js | 313 + page/2/index.html | 237 + page/3/index.html | 237 + page/4/index.html | 237 + resume/index.html | 392 ++ tags/CSS/index.html | 237 + tags/Git/index.html | 237 + tags/JavaScript/index.html | 237 + tags/LeetCode/index.html | 237 + tags/Socket/index.html | 237 + tags/VSCode/index.html | 237 + tags/Vue/index.html | 237 + tags/Webpack/index.html | 237 + tags/index.html | 239 + tags/npm/index.html | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + .../index.html" | 237 + "tags/\351\235\242\350\257\225/index.html" | 237 + 114 files changed, 33396 insertions(+) create mode 100644 "2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" create mode 100644 2020/06/10/js-md5/index.html create mode 100644 "2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" create mode 100644 "2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" create mode 100644 "2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" create mode 100644 "2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" create mode 100644 "2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" create mode 100644 "2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" create mode 100644 "2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" create mode 100644 "2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" create mode 100644 "2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" create mode 100644 2020/11/10/jsdelivr/index.html create mode 100644 "2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" create mode 100644 "2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" create mode 100644 "2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" create mode 100644 "2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" create mode 100644 2020/12/15/GitHub-Corners/index.html create mode 100644 "2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" create mode 100644 "2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" create mode 100644 "2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" create mode 100644 "2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" create mode 100644 "2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" create mode 100644 "2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" create mode 100644 "2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" create mode 100644 "2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" create mode 100644 "2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" create mode 100644 "2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" create mode 100644 "2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" create mode 100644 "2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" create mode 100644 "2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" create mode 100644 "2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" create mode 100644 "2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" create mode 100644 "2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" create mode 100644 "2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" create mode 100644 "2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" create mode 100644 "2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" create mode 100644 2024/12/30/hello-world/index.html create mode 100644 CNAME create mode 100644 archives/2020/06/index.html create mode 100644 archives/2020/07/index.html create mode 100644 archives/2020/08/index.html create mode 100644 archives/2020/10/index.html create mode 100644 archives/2020/11/index.html create mode 100644 archives/2020/12/index.html create mode 100644 archives/2020/index.html create mode 100644 archives/2020/page/2/index.html create mode 100644 archives/2021/01/index.html create mode 100644 archives/2021/02/index.html create mode 100644 archives/2021/03/index.html create mode 100644 archives/2021/04/index.html create mode 100644 archives/2021/05/index.html create mode 100644 archives/2021/07/index.html create mode 100644 archives/2021/index.html create mode 100644 archives/2021/page/2/index.html create mode 100644 archives/2024/12/index.html create mode 100644 archives/2024/index.html create mode 100644 archives/index.html create mode 100644 archives/page/2/index.html create mode 100644 archives/page/3/index.html create mode 100644 archives/page/4/index.html create mode 100644 assets/images/avator.jpg create mode 100644 categories/CSS/index.html create mode 100644 categories/Git/index.html create mode 100644 categories/JavaScript/index.html create mode 100644 categories/LeetCode/index.html create mode 100644 categories/Socket/index.html create mode 100644 categories/VSCode/index.html create mode 100644 categories/Vue/index.html create mode 100644 categories/Webpack/index.html create mode 100644 categories/index.html create mode 100644 categories/npm/index.html create mode 100644 "categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" create mode 100644 "categories/\345\276\256\345\211\215\347\253\257/index.html" create mode 100644 "categories/\346\234\215\345\212\241\345\231\250/index.html" create mode 100644 "categories/\347\247\273\345\212\250\347\253\257/index.html" create mode 100644 "categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" create mode 100644 "categories/\351\235\242\350\257\225/index.html" create mode 100644 css/calendar.css create mode 100644 css/index.css rename placeholder => css/var.css (100%) create mode 100644 img/404.jpg create mode 100644 img/butterfly-icon.png create mode 100644 img/error-page.png create mode 100644 img/favicon.ico create mode 100644 img/friend_404.gif create mode 100644 index.html create mode 100644 js/calendar.js create mode 100644 js/gitcalendar.js create mode 100644 js/main.js create mode 100644 js/search/algolia.js create mode 100644 js/search/local-search.js create mode 100644 js/tw_cn.js create mode 100644 js/utils.js create mode 100644 page/2/index.html create mode 100644 page/3/index.html create mode 100644 page/4/index.html create mode 100644 resume/index.html create mode 100644 tags/CSS/index.html create mode 100644 tags/Git/index.html create mode 100644 tags/JavaScript/index.html create mode 100644 tags/LeetCode/index.html create mode 100644 tags/Socket/index.html create mode 100644 tags/VSCode/index.html create mode 100644 tags/Vue/index.html create mode 100644 tags/Webpack/index.html create mode 100644 tags/index.html create mode 100644 tags/npm/index.html create mode 100644 "tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" create mode 100644 "tags/\345\276\256\345\211\215\347\253\257/index.html" create mode 100644 "tags/\346\234\215\345\212\241\345\231\250/index.html" create mode 100644 "tags/\347\247\273\345\212\250\347\253\257/index.html" create mode 100644 "tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" create mode 100644 "tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" create mode 100644 "tags/\351\235\242\350\257\225/index.html" diff --git "a/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" new file mode 100644 index 000000000..9d700e9e5 --- /dev/null +++ "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" @@ -0,0 +1,234 @@ +从0开始搭建Hexo个人博客 | 淳淳同学的个人博客 + + + + + + + + + + + + +

从0开始搭建Hexo个人博客

+

搭建个人博客是每个程序员成长的必经之路,不但可以记录与分享自己在学习过程中Get到的新技能、新知识,还能顺便提高一下自己的文采。

+
+

Hexo简介

Hexo是一款基于Node.js的静态博客框架,可方便快捷的托管于GitHub上,是搭建博客的首选框架。

+

根据Hexo官网介绍,主要有以下四大优点:

+
    +
  • 超快速度: Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染。
  • +
  • 支持 Markdown:Hexo 支持 GitHub Flavored Markdown 的所有功能,甚至可以整合 Octopress 的大多数插件。
  • +
  • 一键部署:只需一条指令即可部署到 GitHub Pages, Heroku 或其他平台。
  • +
  • 插件和可扩展性:强大的 API 带来无限的可能,与数种模板引擎(EJS,Pug,Nunjucks)和工具(Babel,PostCSS,Less/Sass)轻易集成
  • +
+

Hexo搭建步骤

安装Git

Git是目前世界上最先进的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。无论是个人代码管理还是团队合作开发中,学会git那都是百利而无一害的。如果对git还不是很了解,推荐去廖雪峰老师的博客或者先看一下Git Book的前三章。

+
1
2
3
4
5
# 安装命令
$ sudo apt-get install git

# 查看版本
$ git --version
+ +

安装Node.js

Hexo是基于Node.js环境运行的,所以需要安装Node环境及npm包管理工具。

+
1
2
3
4
5
6
7
8
9
10
11
# node安装命令
$ sudo apt-get install nodejs

# 查看node版本
$ node -v

# npm安装命令
$ sudo apt-get install npm

# 查看npm版本
$ npm -v
+ +

安装Hexo

1
2
3
4
5
6
7
8
9
10
11
# 利用npm全局安装hexo脚手架
$ npm install -g hexo-cli

# 查看hexo版本
$ hexo -v

# 删除hexo
$ npm uninstall -g hexo-cli

# 查看npm全局版本
$ npm ls -g --depth=0
+ +

创建博客项目

到此为止,装好了node环境以及hexo框架,基本上前期的环境配置就完成了,接下来就可以创建自己的博客项目了。

+
1
2
3
4
5
6
7
8
# 新建一个文件夹,如名为blog
$ mkdir blog

# 进入blog文件夹
$ cd blog

# 初始化hexo
$ hexo init
+ +

初始化成功后,blog文件夹下会出现如下文件:

+
    +
  • _config.yml: 博客的核心配置文件(设置主体、标题等属性)
  • +
  • package.json:项目所需的依赖包
  • +
  • source:用来存放你的文章
  • +
  • themes:放下下载的主题
  • +
  • public:存放生成的页面
  • +
  • scaffolds:生成文章的一些模板
  • +
+
1
2
# 安装所需依赖
$ npm install
+ +

安装成功后,会出现node_modules文件夹,文件夹内即安装的package.json内所有依赖包。接下来就可以配置并启动hexo了

+
1
2
3
4
5
6
7
8
9
10
11
# 清除缓存文件 (db.json) 和已生成的静态文件 (public)
$ hexo clean

# 生成静态文件,generate
$ hexo g

# 部署博客网站,deploy
$ hexo d

# 启动服务器,server
$ hexo s -g
+ +

运行成功后,浏览器打开http://localhost:4000便可看到你的hexo博客项目了,除了主题有点儿吃藕,还是挺不错的~

+

将Hexo部署到GitHub

这一步,我们就可以将hexo和GitHub关联起来,也就是将hexo生成的文章部署到GitHub上,打开站点配置文件_config.yml,翻到最后,修改为下面这样,其中LeeDebug改为你的GitHub账户名

+
1
2
3
4
deploy:
type: git
repo: https://github.com/LeeDebug/LeeDebug.github.io.git
branch: master
+ +

这个时候需要先安装deploy-git,也就是部署的命令,这样你才能用命令部署到GitHub。

+
1
$ npm install hexo-deployer-git --save
+ +

部署项目

+
1
2
3
$ hexo clean
$ hexo g
$ hexo d
+ +

部署成功后,浏览器打开http://LeeDebug.github.io,就能看到你的博客了

+

安装主题

首先下载主题包,如butterfly

+
1
npm i hexo-theme-butterfly
+ +

配置_config.yml文件

+
1
theme: butterfly
+ +

新建文章

首先修改/scaffolds/post.md文件模板,改为想要的形式,比如

+
1
2
3
4
5
6
7
8
9
10
11
---
title: {{ title }}
tags:
- Hexo
categorier:
- Hexo
keywords: "Hexo,笔记"
date: {{ date }}
description: "描述"
cover: https://cdn.jsdelivr.net/gh/jerryc127/CDN@latest/cover/default_bg.png
---
+ +

利用post模板新建文章

+
1
hexo new post 文章标题
+ +

随后在source/_posts/文件夹下会出现文章标题的文件夹和文章标题.md的MarkDown文件,文章内容在*.md文件内编辑即可

+

新增分类页

1
hexo new page categories
+ +

/source/categories/index.md/这个文件改为以下内容

+
1
2
3
4
5
---
title: 分类
date: 2018-01-05 00:00:00
type: "categories"
---
+ + +

新增标签页

1
hexo new page tags
+ +

/source/tags/index.md/这个文件改为以下内容

+
1
2
3
4
5
---
title: 标签
date: 2018-01-05 00:00:00
type: "tags"
---
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/06/07/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAHexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git a/2020/06/10/js-md5/index.html b/2020/06/10/js-md5/index.html new file mode 100644 index 000000000..4cd7f8aa1 --- /dev/null +++ b/2020/06/10/js-md5/index.html @@ -0,0 +1,174 @@ +js-md5 | 淳淳同学的个人博客 + + + + + + + + + + + + +

js-md5

+

前端在用户登录时尝使用md5对用户的登录信息进行加密操作

+
+

MD5简介

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

+

js-md5简介

A simple MD5 hash function for JavaScript supports UTF-8 encoding.
详情请查看npm的js-md5部分

+

使用教程

安装

1
$ npm i js-md5
+ +

引入

1
2
3
4
$ import md5 from 'js-md5'

// 如果在main.js中引入,需要注册
$ Vue.prototype.$md5 = md5
+ +

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
md5(''); // d41d8cd98f00b204e9800998ecf8427e
md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0

// It also supports UTF-8 encoding
md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07

// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
md5([]); // d41d8cd98f00b204e9800998ecf8427e
md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e

// Different output
md5(''); // d41d8cd98f00b204e9800998ecf8427e
md5.hex(''); // d41d8cd98f00b204e9800998ecf8427e
md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
md5.arrayBuffer(''); // ArrayBuffer
md5.buffer(''); // ArrayBuffer, deprecated, This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/06/10/js-md5/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" "b/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" new file mode 100644 index 000000000..615c50d31 --- /dev/null +++ "b/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" @@ -0,0 +1,237 @@ +程序员进修文档 | 淳淳同学的个人博客 + + + + + + + + + + + + +

程序员进修文档

+

以下文档为学习期间整理的好文,有的只是大体的看了一下觉得不错就收藏了,一定要找机会读完。以后要强烈拒绝这种码了不看的行为!!!

+
+

程序员修炼手册

+

前端面试题

前端100问:能搞懂80%的请把简历给我

JavaScript专题系列二十篇正式完结

web前端面试100题带答案(知乎)

+

学习资料

+

JavaScript

+

Vue

+

算法

+

浏览器

+

代码规范

+

Java

+

工具篇

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/06/15/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%BF%9B%E4%BF%AE%E6%96%87%E6%A1%A3/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" "b/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" new file mode 100644 index 000000000..d56157756 --- /dev/null +++ "b/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" @@ -0,0 +1,217 @@ +前端个人学习笔记与项目规范 | 淳淳同学的个人博客 + + + + + + + + + + + + +

前端个人学习笔记与项目规范

1
2
3
4
5
6
7
8
9
10
11
12
# Lee 更新于 2019-05-30

以下是学习Vue的渐进路线,并非适合所有人但适合大多数人
如果是计算机专业的话,而且有其他语言基础的,1~2天就可以过一遍
如果是非计算机专业的话,可能要半个月左右,不会的一定要勤问(发扬不要脸的精神)
看完之后别逗留太久,尽早跟着项目走,真正开始动手写点儿东西的时候,才是你刚开始入门的时候



人生、工作的结果 = 思维方式 × 热情 × 能力

--- 稻盛和夫《活法》
+ + +

Basic Document:

+

Basis SoftWare:

baiduCloud链接(Mac版):链接:https://pan.baidu.com/s/1dQJAJ8nSV2FyOcZt19KP5Q 密码:x605

+

baiduCloud链接(Windows版):链接:https://pan.baidu.com/s/1Imq9YggdknZOegJc8LNr8A 密码:qo6z

+
    +
  • IDE:Websotrm
  • +
  • GIt仓库管理:Sourcetree(用baiduCloud里的sourcetree276a.zip)
  • +
  • 接口测试:Postman
  • +
  • 浏览器(推荐):chrome
  • +
  • 常用fq:Shadow–socks (敏感词,下载的时候把–去掉)
  • +
+

开会内容:新项目的统一规范(2019-02-22)

1. Form封装问题

1
能在一个页面中写完的内容就不要随便抽象出一个组件,意义不大。
+ +

2. 组件引用的路径:

1
2
3
为了方便代码复用,统一使用绝对路径(如:'@/components/LqPagination'),按住Commond键 + 左键单击 即可跳转到该组件
PS:如果你的webStorm绝对路径无法跳转,请根据以下操作引入webpack文件:
webStorm --> preferences --> Languages & Frameworks --> JavaScript --> Webpack:../qf_admin/admin/build/webpack.base.conf.js
+ +

3. 分页组件:

1
2
3
4
5
为了解决分页时的loading问题,给分页组件传参数
LqPagination组件:【:init-func="initData"】
Pagination组件:【@pagination="initData"】
每个函数只做一件事情,initData()就只是一个初始化列表函数,不要写别的内容。
![image](http://note.youdao.com/yws/res/7075/13C1D152E20F48649D28553B9D5B309A)
+ +

4. 混入

1
2
每个模块的混入文件有且仅有一个,放在该模块主目录下的mixin里即可。
混入文件内仅存放Vuex的相关代码,不要放其他的
+ +

5. Vuex的使用

1
2
3
4
数据缓存的问题,以动态控制keep-alive来解决
【能不用Vuex的地方就不要用】
码表必须要用Vuex维护,并且必传:config = { usingCache: true }
![image](http://note.youdao.com/yws/res/7086/3C16AC303C164E6A8B4D22C81C0332FC)
+ +

6. 命名规范 & 页面规范

项目目录为:

 - views // 项目文件目录 */
+    - target-action // 日程模块 */
+        - components // 此模块公用的组件 */
+            - scheduleTable.vue
+        - mixin // 此模块公用的混入文件 */
+            - Data.js
+        - index.vue // 模块主页 */
+        - personal // 子模块 */
+            - month.vue
+        - create.vue // 新增 || 修改 页面 */
+    - announcement // 公告栏模块 */
+    - ... // 其他模块 */
+    
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 文件夹 & 文件 命名规范
全部为小写,多个单词的话中间以 _ 【下划线】连接,如:
target_action,day_schedule,customer_info

# vue文件内部name命名规范
***.vue页面的name(同其在路由中的name),按照此文件的目录结构【小驼峰】命名,如:
1. 日程模块主页的name命名为:targetActionIndex
2. 日程模块新增页面的name命名为:createTargetAction
3. target-action的子模块personal的month页面的name命名为:targetActionPersonalMonth

# 函数命名规范
按照函数的具体功能【小驼峰】命名,如:
1. 初始化数据函数:initData()
2. 刷新table函数:handleFilter()
3. 选中当前行函数:handleCurrentChange()
4. 提交 || 确认 函数:handleConfirm()

# 页面格式规范
整体section内:class="app-container"(即padding="20px";)
如xxc_admin项目所有页面都封装在el-card中,已自带padding:20px,所以就不需要class="app-container"了
常规左右分栏布局:元素多的一侧 :span=14,少的一侧 :span=10
页面最下方距离底部尽量留出50px~60px的距离,以免页面宽度缩小之后有的元素被换行而挡住
高度实在放不开的页面,设置滚动:height: 800px;overflow:auto;overflow-x:hidden;

# 按钮样式规范
【table内】的按钮:放到el-tooltip中,提示框在上面,按钮size="mini",区分type,非圆角,带icon
【查询参数后】的按钮:round,正常sizi,区分type,带icon
【增加/修改页面】的按钮:非圆角,正常大小
「左边是“提交”,type="success" icon="el-icon-check"」
「右边是“作废”,type="danger" <svg-icon icon-class="ic-ban" style="margin-right: 5px;"/>」
【详情页面】的按钮:“返回”放到最右边,type="warning" icon="el-icon-back" @click="gotoAndClose()"
1. 增加:type=success,icon=plus
2. 删除:type=danger,icon=delete
3. 修改:type=primary,icon=edit(如果有两种修改按钮时:icon=edit-outline)
4. 查询:type=default,icon=search
5. 刷新:type=default,icon=refresh
6. 确定:type=success,icon=success
7. 取消:type=warning,icon=error
8. 提交:type=success,icon=check
9. 关闭:type=warning,icon=close
10. 详情:type=info,icon=info
11. 打印:type=info,icon=printer
12. Excel:type=success,icon=document

# 全局table样式规范
1. 按照客户的需求,全局修改css
2. 如果右侧有操作列,需fixed="right"固定在最右侧,且设置固定宽度
3. 能设置固定宽度的尽量设定,如:时间、日期、姓名(不会超过5个字)
4. 序号列,可有可无,如果表格字段过少,可充数用

# 函数执行成功后的提示
1. 创建、修改、更新、删除【成功】后统一用this.$notify,即notification
2. 【操作错误、参数错误】等提醒用this.$message
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/06/20/%E5%89%8D%E7%AB%AF%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%8E%E9%A1%B9%E7%9B%AE%E8%A7%84%E8%8C%83/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" "b/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" new file mode 100644 index 000000000..12f0a8557 --- /dev/null +++ "b/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" @@ -0,0 +1,210 @@ +《前端内参》读书笔记 | 淳淳同学的个人博客 + + + + + + + + + + + + +

《前端内参》读书笔记

+

做web前端开发也有两年的时间了,但技术层面一直很浅,特别是近期感觉遇到了知识瓶颈,还是因为看书少、不爱总结。本次笔记在参考Bob Ma大佬整理分享的《前端内参》的基础上,记录并整理下来一些自己平时不注意的知识点。

+
+

壹.1.1.3 ES 8 新特性

字符串追加

在 ES 8 中String新增了两个实例函数String.prototype.padStartString.prototype.padEnd,允许将空字符串或其他字符串添加到原始字符串的开头或结尾。

+
    +
  • String.padStart(targetLength,[padString])
    targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
    padString:(可选)填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断,此参数的缺省值为空格。
  • +
  • String.padEnd(targetLength,padString]) 参数释义同上。
  • +
+
1
2
3
4
5
6
7
8
9
10
11
'es8'.padStart(2);          // 'es8'
'es8'.padStart(5); // ' es8'
'es8'.padStart(6, '1891'); // '189es8'
'es8'.padStart(14, 'coffe'); // 'coffecoffeces8'
'es8'.padStart(7, '0'); // '0000es8'

'es8'.padEnd(2); // 'es8'
'es8'.padEnd(5); // 'es8 '
'es8'.padEnd(6, '1891'); // 'es81891'
'es8'.padEnd(14, 'coffe'); // 'es8coffecoffec'
'es8'.padEnd(7, '9'); // 'es89999'
+ + +

异步函数

Async Functions也就是我们常说的Async/Await,相信大家对于这个概念都已经不陌生了。Async/Await是一种用于处理JS异步操作的语法糖,可以帮助我们摆脱回调地狱(callback hell),编写更加优雅的代码。

+

通俗的理解,async关键字的作用是告诉编译器对于标定的函数要区别对待。当编译器遇到标定的函数中的await关键字时,要暂时停止运行,等到await标定的函数处理完毕后,再进行相应操作。如果该函数fulfiled了,则返回值是fulfillment value,否则得到的就是reject value。

+

下面通过拿普通的promise写法来对比,就很好理解了:

+
1
2
3
4
5
6
7
8
9
10
11
12
async function asyncFunc() {
const result = await otherAsyncFunc();// otherAsyncFunc()返回一个Promise对象
console.log(result);
}

// 等同于:
function asyncFunc() {
return otherAsyncFunc()// otherAsyncFunc()返回一个Promise对象
.then(result => {
console.log(result);
});
}
+ +

按顺序处理多个异步函数的时候优势更为明显:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
async function asyncFunc() {
const result1 = await otherAsyncFunc1();// otherAsyncFunc1()返回一个Promise对象
console.log(result1);
const result2 = await otherAsyncFunc2();// otherAsyncFunc2()返回一个Promise对象
console.log(result2);
}

// 等同于:
function asyncFunc() {
return otherAsyncFunc1()// otherAsyncFunc1()返回一个Promise对象
.then(result1 => {
console.log(result1);
return otherAsyncFunc2();// otherAsyncFunc2()返回一个Promise对象
})
.then(result2 => {
console.log(result2);
});
}
+ +

并行处理多个异步函数:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
async function asyncFunc() {
const [result1, result2] = await Promise.all([
otherAsyncFunc1(),// otherAsyncFunc1()返回一个Promise对象
otherAsyncFunc2() // otherAsyncFunc2()返回一个Promise对象
]);
console.log(result1, result2);
}

// 等同于:
function asyncFunc() {
return Promise.all([
otherAsyncFunc1(),// otherAsyncFunc1()返回一个Promise对象
otherAsyncFunc2() // otherAsyncFunc2()返回一个Promise对象
])
.then([result1, result2] => {
console.log(result1, result2);
});
}
+ +

处理错误:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
async function asyncFunc() {
try {
await otherAsyncFunc();// otherAsyncFunc()返回一个Promise对象
} catch (err) {
console.error(err);
}
}

// 等同于:
function asyncFunc() {
return otherAsyncFunc()// otherAsyncFunc()返回一个Promise对象
.catch(err => {
console.error(err);
});
}
+ +

壹.1.1.4 ES 9 新特性

异步迭代器 Asynchronous Iteration

async/await的某些时刻,你可能尝试在同步循环中调用异步函数。例如:

+
1
2
3
4
5
async function func(array) {
for (let i of array) {
await someFunc(i);
}
}
+ +

这段代码不会达到预期目的,下面这段同样也不会:

+
1
2
3
4
5
async function func(array) {
array.forEach(async i => {
await someFunc(i);
});
}
+ +

上面这段代码中,循环本身依旧保持同步,并在内部异步函数之前全部调用完成。
引入异步迭代器后,就像常规迭代器,除了next()方法返回一个Promise。因此await可以和for…of循环一起使用,以串行的方式运行异步操作。

+
1
2
3
4
5
async function func(array) {
for await (let i of array) {//异步迭代
someFunc(i);
}
}
+ +

更多详细论述见“壹.2.12”。

+

重新修订了字面量的转义

ES9 之前,\u表示unicode转义,\x表示十六进制转义,\后跟一个数字表示八进制转义,这使得创建特定的字符串变得不可能,例如Windows文件路径C:\uuu\xxx\111

+

要取消转义序列的语法限制,可在模板字符串之前使用标记函数String.raw。

+
1
2
3
4
5
let s = `\u{54}` //会转义成unicode "T"
console.log(s);//>> T

let str = String.raw`\u{54}`; //不会被转义
console.log(str);//>> \u{54}
+ +

Rest / Spread 属性

这个就是我们通常所说的三个点...,在=左边的是rest参数,放在=右边或者作为参数的是扩展运算符,这项特性在ES6中已经引入,但是ES6中的作用对象仅限于数组。在ES9中,为对象提供了像数组一样的rest参数和扩展运算符:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
const obj = {
a: 1,
b: 2,
c: 3
};
const { a, ...param } = obj; //这里...是rest参数
console.log(a); //>> 1
console.log(param); //>> {b: 2, c: 3}

function foo({ a, ...param }) {//这里...是扩展运算符
console.log(a); //>> 1
console.log(param); //>> {b: 2, c: 3}
}
+ +

正则表达式dotAll模式

正则表达式中点.匹配除回车外的任何单字符,标记s改变这种行为,允许匹配回车换行。

+
1
2
3
4
/hello.world/.test('hello\nworld');  // false
/hello.world/s.test('hello\nworld'); // true
console.log(/hello.world/s.test(`hello
world`)) //>> true
+ +

正则表达式命名捕获组

未看

+

正则表达式后行断言

未看

+

正则表达式 Unicode 转义

未看

+

壹.1.1.5 ES 10 新特性

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/06/23/%E3%80%8A%E5%89%8D%E7%AB%AF%E5%86%85%E5%8F%82%E3%80%8B/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" "b/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" new file mode 100644 index 000000000..05add4979 --- /dev/null +++ "b/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" @@ -0,0 +1,201 @@ +LeetCode常见题 | 淳淳同学的个人博客 + + + + + + + + + + + + +

LeetCode常见题

+

算法对前端的重要性可以说至关重要,不可小觑。

+
+

算法思想

    +
  • 基础技巧: 分治、二分、贪心
  • +
  • 排序算法: 快速排序、归并排序、计数排序
  • +
  • 搜索算法: 回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
  • +
  • 图论: 最短路径、最小生成树
  • +
  • 动态规划: 背包问题、最长子序列
  • +
+

- 双指针

+
    +
  1. 合并两个有序数组
  2. +
+
+

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

+

说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

+

示例:

+
    +
  • 输入:
      +
    • nums1 = [1,2,3,0,0,0], m = 3
    • +
    • nums2 = [2,5,6], n = 3
    • +
    +
  • +
  • 输出:
      +
    • [1,2,2,3,5,6]
    • +
    +
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
var i = m - 1, j = n - 1, len = m + n -1
while (i >= 0 || j >= 0) {
if (i < 0) {
nums1[len--] = nums2[j--]
} else if (j < 0) {
nums1[len--] = nums1[i--]
} else if (nums1[i] > nums2[j]) {
nums1[len--] = nums1[i--]
} else {
nums1[len--] = nums2[j--]
}
}
};
+ +

- 排序

- 贪心思想

- 二分查找

- 分治

- 搜索

- 动态规划

- 数学

数据结构相关

    +
  • 数组与链表:单/双向链表
  • +
  • 栈与队列
  • +
  • 哈希表
  • +
  • 堆:最大堆/最小堆
  • +
  • 树与图:最近公共祖先、并查集
  • +
  • 字符串:前缀树(字典树) /后缀树
  • +
+

- 链表

- 树

- 栈和队列

- 哈希表

- 字符串

- 数组与矩阵

- 图

- 位运算

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/07/01/LeetCode%E5%B8%B8%E8%A7%81%E9%A2%98/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" "b/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" new file mode 100644 index 000000000..537396e61 --- /dev/null +++ "b/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" @@ -0,0 +1,228 @@ +Ubuntu 16.04 部署命令 | 淳淳同学的个人博客 + + + + + + + + + + + + +

Ubuntu 16.04 部署命令

+

现时代身为一名前端工程师,配置服务器、部署线上项目等技能是必不可少的。

+
+

参考文档

+

配置步骤

基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 连接
ssh -p 22 root@47.104.223.131

# 修改主机名
sudo vi /etc/hostname
改为:
LeeJs

# 修改配置文件
sudo vi /etc/hosts
添加:
127.0.1.1 LeeJs

# 重启
reboot

# apt 检测更新
sudo apt update
apt list --upgradable

# 查看版本信息
lsb_release -a
uname -a
cat /proc/version
+ +
+

** ⚠️ 注:以下命令已打包至 install.sh **

+

安装yum(不需要)

1
apt install yum
+ + +

安装 ruby(不需要)

1
apt install ruby
+ + +

安装 LinuxBrew(不需要)

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
+ + +

安装 screen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apt install screen

# 查看路径
which screen

# 查看版本
screen -v

# 查看所有
screen -ls

# 新建
screen -S qf_backend

# 恢复之前在线的screen,并置位离线
screen -x -d qf_backend/PID

# 重连
screen -r qf_backend/PID
ctrl + r ==> 输入PID

# 先重连,若找不到离线作业,则新建
screen -R qf_backend/PID

# 删除screen
screen -X -S PID quit
+ + +

安装 git

1
apt install git
+ + +

安装 pyenv

1
2
3
4
5
6
7
8
9
10
11
12
sudo curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

# 添加源
sudo vi ~/.bashrc

# 添加下面三行
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# 更新源
source ~/.bashrc
+ + +

安装「 python 所需依赖包 」

1
apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline6 libreadline6-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev zlib*
+ + +
    +
  • ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
    1
    apt install libbz2-dev libssl-dev libsqlite3-dev libreadline6 libreadline6-dev
    + + +
  • +
+

通过 pyenv 安装 python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 下载 python
wget http://mirrors.sohu.com/python/3.6.5/Python-3.6.5.tar.xz -P ~/.pyenv/cache/

# 查看目录
cd ~/.pyenv/cache/

# 所有支持版本
pyenv install --list

# 安装指定版本python,-v:显示全过程
pyenv install 3.6.5 -v

# 刷新pyenv
pyenv rehash

# 查看所有的版本
pyenv versions

# 安装pyenv-virtualenv插件
git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

# 以python 3.6.5 新建名为 qf_admin_3.6.5 的虚拟环境
pyenv virtualenv 3.6.5 qf_admin_3.6.5

# 激活虚拟环境
pyenv activate qf_admin_3.6.5

# 离开已经激活的环境
pyenv deactivate

# 设置当前路径的python版本,优先级:shell > local > global
pyenv local 3.6.5

# 删除虚拟环境(删除所在目录即可)
rm -rf ~/.pyenv/versions/test3.7.3/

+ + +

安装 mysql

    +
  • 如何在Ubuntu 16.04下安装MySQL
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 安装 mysql 基础服务
    apt install mysql-server
    apt install mysql-client
    apt install libmysqlclient-dev

    # 测试是否安装成功
    netstat -tap | grep mysql

    # 打开数据库
    mysql -uroot -p

    # 配置文件
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

    # 重启 mysql 服务
    service mysql restart
    + + +
  • +
+

安装 nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装 nginx
apt install nginx

# 查看nginx安装路径
whereis nginx

# 查看 nginx 加载的哪个配置文件
sudo nginx -t

# 配置文件位置
cat /etc/nginx/nginx.conf

# 启动
nginx

# 重启
nginx -s reload
+ + +

配置 HTTPS 443

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 服务器报错 400
You're accessing the development server over HTTPS, but it only supports HTTP.

# 安装 pyOpenSSL(测试时用)
pip install pyOpenSSL

# 以 https 方式启动 django(测试专用)
python manage.py runserver_plus --cert cert.crt 0.0.0.0:23480

--------------------------------

# SSL 证书
阿里云:https://yundunnext.console.aliyun.com/?spm=5176.2020520163.aliyun_sidebar.daliyun_sidebar_cas.5f3956a7FAnrMY&p=cas#/overview/cn-hangzhou
下载并解压后放在:/etc/nginx/certificate/

# nginx https 配置
server
{
listen 443;
server_name www.lee521.top;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/certificate/2501940_lee521.top.pem;
ssl_certificate_key /etc/nginx/certificate/2501940_lee521.top.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location ~ /api {
proxy_pass http://127.0.0.1:23480;
}
location ~ /doc {
proxy_pass http://127.0.0.1:23480;
}
location ~ /static {
proxy_pass http://127.0.0.1:23480;
}
}

# 配置成功 !
https://www.lee521.top/doc/
https://www.lee521.top/api/system/system_user/
+ + +

配置前端

1
2
3
4
5
server {
listen 10086;
server_name localhost;
root /root/www/vue-element-admin/dist/;
}
+ + +

打包 install.sh 脚本文件

==执行 source ~/.bashrc 会出错,提示 source not found,可以分两批执行==

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
sudo apt update
apt list --upgradable
# need keyboard input: y
sudo apt install yum
# need keyboard input: y
sudo apt install ruby
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
# need keyboard input: y
sudo apt install screen
sudo apt install git
# install pyenv
rm -rf ~/.pyenv/
sudo curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

# update source
sed -i '1i export PATH="/root/.pyenv/bin:$PATH"' ~/.bashrc
sed -i '2i eval "$(pyenv init -)"' ~/.bashrc
sed -i '3i eval "$(pyenv virtualenv-init -)"' ~/.bashrc
# 执行这一句会出错,提示 source not found
source ~/.bashrc

# install depend package
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
# download python 3.6.5
wget http://mirrors.sohu.com/python/3.6.5/Python-3.6.5.tar.xz -P ~/.pyenv/cache/
# install 2.6.5 with pyenv
pyenv install 3.6.5 -v
# refresh pyenv
pyenv rehash
# clone pyenv-virtualenv
git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
# new a virtualenv named custom_3.6.5 with python3.6.5
pyenv virtualenv 3.6.5 custom_3.6.5
# show all virtualenv
pyenv versions
+ +

新版项目启动代码

1
gunicorn -c ./gunicorn-config.py backend.wsgi
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/07/06/Ubuntu-16-04-%E9%83%A8%E7%BD%B2%E5%91%BD%E4%BB%A4/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" "b/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" new file mode 100644 index 000000000..4f221ec0e --- /dev/null +++ "b/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" @@ -0,0 +1,411 @@ +你不知道的JavaScript(上卷) | 淳淳同学的个人博客 + + + + + + + + + + + + +

你不知道的JavaScript(上卷)

+

去年就想读这一套书,由于个人原因一直拖到现在,今天终于周末在家没事,看了5个小时才看了上卷的1/3(其实也就60页)。主要讲述了作用域和闭包的相关知识,可能是由于自己基础知识的匮乏,所以进度有些慢。总之,要提高阅读速度了。

+
+

作用域和闭包

作用域是什么

    +
  • JavaScript是一门编译语言,其引擎进行编译的步骤和传统的编译语言非常相似,包括下列三个编译步骤:
      +
    • 分析/词法分析(Tokenizing/Lexing)(词法化、单词化)
    • +
    • 解析/语法分析(Parsing)
    • +
    • 代码生成
    • +
    +
  • +
+
    +
  • 作用域是一种规则,用于确定在何处以及如何查找该变量(标识符),即用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找
      +
    • 引擎
    • +
    • 编译器
    • +
    • 作用域
    • +
    +
  • +
+
    +
  • var a = 2;
      +
    • var a:编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则它会要求作用域在当前作用域的集合中声明一个新的变量,并命名为a。(定义声明在编译阶段进行)
    • +
    • a = 2:编译器会为引擎生成运行时所需要的代码,这些代码被用来处理a=2这个赋值操作。首先会询问作用域,在当前作用域集合中是否存在一个叫作a的变量。如果是,引擎就会使用这个变量;否则会向外层嵌套的作用域继续查找该变量。(赋值声明会被留在原地等待执行阶段被调用)
    • +
    +
  • +
+
    +
  • 编译器在编译过程中,对变量有两种查询方式
      +
    • LHS查询:变量在左侧,目的为赋值操作
    • +
    • RHS查询:变量在非左侧,目的为获取变量的值
    • +
    +
  • +
+
    +
  • LHS和RHS都会再当前执行作用域中开始
      +
    • 不成功的RHS会导致抛出ReferenceError异常
    • +
    • 不成功的LSH会导致自动隐式的创建一个全局变量(非严格模式下),该变量使用LHS查询的目标作为标识符,或者抛出ReferenceError异常(严格模式下)
    • +
    +
  • +
+
    +
  • LHS和RHS的异常错误
      +
    • ReferenceError异常:同作用域判别失败相关
    • +
    • TypeError异常:作用域判别成功,但对结果的操作是非法或不合理的
    • +
    +
  • +
+
    +
  • 编译器可以再代码生成的同时处理声明和值的定义
  • +
+
    +
  • 在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量或抵达最外层作用域(即全局作用域)为止
  • +
+

词法作用域

    +
  • 作用域的两种工作模型
      +
    • 词法作用域:在写代码或定义时确定的,作用域链基于作用域的嵌套,即更关注在何处声明。大多数编程语言都采用
    • +
    • 动态作用域:在运行时确定的,作用域链是基于调用栈的,即更关注函数是从何处调用的。this的机制也是如此
    • +
    +
  • +
+
    +
  • 词法作用域:是一套关于引擎如何寻找以及会在何处找到变量的规则
  • +
+
    +
  • JavaScript中有两个机制可以“欺骗”词法作用域。但在编译时引擎均无法对作用域查找进行优化,所以不要使用它们
      +
    • eval(…):生成代码并运行
    • +
    • with:会产生内存泄漏
    • +
    +
  • +
+
    +
  • 箭头函数:ES6添加了一个特殊的语法形式用于函数声明,将this同词法作用域联系起来
  • +
+
    +
  • 箭头函数在涉及this绑定时的行为和普通函数的行为完全不一致。它放弃了所有普通this绑定的规则,取而代之的是用当前的词法作用域覆盖了this本来的值
  • +
+

函数作用域和块作用域

    +
  • 函数作用域:属于这个函数的全部变量都可以再整个函数的范围内使用及复用(事实上在嵌套的作用域内也可以使用)
  • +
+
    +
  • 基于作用域的隐藏方法:大豆是从最小特权原则(最小授权原则、最小暴露原则)中引申出来的,即应该最小限度的暴露必要内容
  • +
+
    +
  • 如果function是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式
  • +
+
    +
  • 函数声明和函数表达式之间最重要的区别:他们的名称标识符将会绑定在何处
  • +
+
    +
  • 函数表达式的应用场景:
      +
    • 匿名函数表达式:setTimeout(() => {}, 0)
    • +
    • 立即执行函数表达式-IIFE(Immediately Invoked Function Expression):(function foo(){...})()(function(){...}())
    • +
    +
  • +
+
    +
  • 匿名函数表达式的缺点:(==养成始终给函数表达式命名的好习惯==)
      +
    • 在栈追踪中不会显示出有意义的函数名,使调试很困难
    • +
    • 没有函数名,自身引用自身,只能使用过期的arguments.callee来引用
    • +
    • 可读性差,可理解性差
    • +
    +
  • +
+
    +
  • 除了JavaScript歪的很多编程语言都支持块作用域(表面上看没有,除非更加深入的研究)P30页
  • +
+
    +
  • 块作用域的应用场景:
      +
    • with:从对象中创建出的作用域仅在with声明中而非外部作用域中有效
    • +
    • try/catch:ES3规范中规定catch分句会创建一个块作用域
    • +
    • let:为其声明的变量隐式的创建了一个块作用域
    • +
    • const:创建块作用域变量,但值是固定的常亮
    • +
    • ???
    • +
    +
  • +
+
    +
  • ==for循环的let i==:
      +
    • 将i重新绑定到循环的每一个迭代中,并确保使用上一个循环迭代结束时的值重新进行赋值
    • +
    • i在循环过程中不止被声明一次,每次迭代都会被声明,随后的每次迭代都会使用上一个迭代结束时的值来初始化下一个i
    • +
    +
  • +
+
    +
  • 为变量显式声明块作用域,并对变量进行本地绑定是非常有用的==工具==,P34页
  • +
+

提升

    +
  • 任何声明在某个作用域的变量,都将属于这个作用域
  • +
+
    +
  • 包括变量和函数在内的所有声明都会再任何代码被执行前首先被处理,可以将这个过程形象的想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端
  • +
+
    +
  • 先有声明,后有赋值
  • +
+
    +
  • 在提升中,函数声明会首先被提升,然后才是变量声明;但出现在后面的函数声明还是可以覆盖前面的
  • +
+

作用域闭包

    +
  • 闭包是基于词法作用域书写代码时所产生的自然结果
  • +
+
    +
  • 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行
  • +
+
    +
  • 无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包
  • +
+
    +
  • 闭包的应用场景:
      +
    • function调用setTimeout(...)
    • +
    • 定时器、事件监听器、Ajax请求、跨窗口通信、WebWorkers、任何异步或同步任务,只要使用了==回调函数==,实际上就是在使用闭包
    • +
    • for循环
    • +
    • 立即执行函数表达式IIFE:(function(){...})())(本身创建了闭包,但严格来说并不是闭包)
    • +
    • 模块模式:比如jQuery和$符就是jQuery模块的公共api
    • +
    +
  • +
+
    +
  • 延迟函数的回调会在循环结束时才执行,即使定时器是setTimeout(..., 0)
  • +
+
    +
  • 在迭代内使用IIFE会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代中都会含有一个具有正确值的变量供我们访问
  • +
+
    +
  • let声明,可以用来劫持块作用域,并且在这个块作用域中声明一个变量;本质上这是将一个块转换成一个可以被关闭的作用域
  • +
+
    +
  • 最常见的实现模块模式的方法被称为模块暴露
  • +
+
    +
  • 模块模式需要具备的两个必要条件:
      +
    • 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)
    • +
    • 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有属性
    • +
    +
  • +
+
    +
  • 模块的两个主要特征:
      +
    • 为创建内部作用域而调用了一个包装函数
    • +
    • 包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包
    • +
    +
  • +
+
    +
  • 模块也是普通函数,也可以接受参数
  • +
+
    +
  • 模块模式另一个简单而强大的变化用法是,命名将要作为公共api返回的对象(大多数模块依赖加载器/管理器的本质都是将这种模块定义封装进一个友好的api)
  • +
+
    +
  • import:将一个模块中的一个或多个api导入到当前作用域,并可以分别绑定在不同的变量上
  • +
  • module:将整个模块的api导入并绑定 到一个变量上
  • +
  • export:将当前模块的一个标识符(变量或函数)导出为公共api
  • +
+

this和对象原型

+

任何足够先进的技术都和魔法无异。

+
+
+

在遇到问题时,许多开发者并不会深入思考为什么this的行为和预期的不一致,也不会试图回答那些很难解决但确实非常重要的问题,他们只会回避这个问题并使用其他方法来达到目的,这显然不是一种很好的解决办法。

+
+

关于this

    +
  • this关键字是JavaScript中最复杂的机制之一

    +
  • +
  • this指向的两大误区:

    +
      +
    • 指向函数自身
    • +
    • 指向函数的作用域(在任何情况下this都不会指向函数的词法作用域,因为作用域“对象”是存在于JavaScript的引擎内部的)
    • +
    +
  • +
  • 当你想把this和词法作用域的查找混合使用时,这是无法实现的!

    +
  • +
  • 不能使用this来引用一个词法作用域内部的属性

    +
  • +
  • this实际上是在函数被调用时发生的绑定,this指向什么只取决于函数在哪被调用,和函数的生命位置毫无关系。

    +
  • +
+

this全面解析

    +
  • 要判断一个运行中函数的this绑定,就需要找到这个函数的直接调用位置,最重要的就是分析调用栈(为了到达当前执行位置所调用的所有函数,即函数调用链)。

    +
  • +
  • 调用位置如何决定this的绑定对象?可顺序应用下面四条规则来判断

    +
      +
    • 是否在new中调用(new绑定)?绑定到新创建的对象。var bar = new foo()
    • +
    • 是否通过call、apply(显示绑定)或者bind(硬绑定)调用?绑定到指定的对象。var bar = foo.(obj2)
    • +
    • 是否在某个上下文对象(隐式绑定)中调用?绑定到那个上下文对象。var bar = obj1.foo()
    • +
    • 如果都不是即独立函数调用(默认绑定),严格模式下绑定到undefined,非严格模式下绑定到全局对象。var bar = foo()
    • +
    +
  • +
  • 默认绑定:直接使用不带任何修饰的函数引用进行调用

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function foo() {
    console.log(this.a)
    }
    var obj = {
    a: 2,
    foo: foo
    }
    var bar = obj.foo // 函数别名
    var a = 'oops, global' // a是全局对象的属性
    bar() // >> 'oops, global'

    // 虽然bar是obj.foo的一个引用,看似是隐式绑定,但实际上,它引用的是foo的函数本身,因此此时的bar()其实是一个不带任何修饰的函数调用,因此应用了默认绑定。
    +
  • +
  • 隐式绑定:调用位置是否有上下文对象,或者说是否被某个对象拥有或包含。即我们必须在一个对象内部包含一个指向函数的属性,并通过这个属性间接引用函数,从而把this间接(隐式)绑定到这个对象上。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // 参数传递就是一种隐式赋值
    function foo() {
    console.log(this.a)
    }
    function doFoo(fn) {
    fn() // fn其实引用的是foo函数本身
    }
    var obj = {
    a: 2,
    foo: foo
    }
    var a = 'oops, global' // a是全局对象的属性
    doFoo(obj.foo) // >> 'oops, global'

    // 如果把函数传入语言内置的函数而不是自定义的函数,结果是一样的
    function foo() {
    console.log(this.a)
    }
    var obj = {
    a: 2,
    foo: foo
    }
    var a = 'oops, global' // a是全局对象的属性
    setTimeout(obj.foo, 100) // >> 'oops, global'

    // JavaScript环境中内置的setTimeout()函数实现和下面伪代码类似
    function setTimeout(fn, delay) {
    // 等待delay秒
    fn() // 调用函数内容本身
    }
    +
  • +
  • 显示绑定:在对象内部不包含函数引用的情况下,在某个对象上强制调用函数,可以使用call(...)apply(...)方法,它们的第一个参数是一个对象,它们会吧这个对象绑定到this上,接着在调用函数时指定这this。

    +
    1
    2
    3
    4
    5
    6
    7
    function foo() {
    console.log(this.a)
    }
    var obj = {
    a: 2
    }
    foo.call(obj) // >> 2
    +
  • +
  • new绑定:JavaScript中的new机制实际上和面向类的语言完全不同,JavaScript中的new构造函数,其实只是一些使用new操作符调用的普通函数。它们不会属于某个类,也不会实例化一个类。

    +
  • +
  • 有些调用可能在无意中使用默认绑定规则。为了保护全局对象,可以使用一个DMZ对象(DemilitarizedZone,非军事区),即一个空的非委托的对象,比如const ∅ = Object.create(null),使用变量名不仅让函数变得更加安全,而且可以提高代码的可读性,因为标识“我希望this是空”这比null的含义更清楚。Object.create(null){}很像,但并不会创建Object.prototype这个委托,所以它比{}“更空”。

    +
  • +
  • ES6中箭头函数()=>{}并不会使用这四条标准的绑定规则,而是根据当前的词法作用域来决定this,具体来说,箭头函数会继承外层函数调用的this绑定(无论this绑定到什么)。这其实和ES6之前的self = this机制一样。

    +
  • +
  • 代码风格:

    +
      +
    • 词法作用域风格:只使用词法作用域,并完全抛弃错误的this风格。
    • +
    • this风格:完全采用this风格,必要时使用bind(...),尽量避免使用self = this箭头函数()=>{}
    • +
    +
  • +
+

对象

混合对象“类”

原型

行为委托

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/07/18/%E4%BD%A0%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84JavaScript%EF%BC%88%E4%B8%8A%E5%8D%B7%EF%BC%89/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" new file mode 100644 index 000000000..1f83746a7 --- /dev/null +++ "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" @@ -0,0 +1,2304 @@ +2020前端面试 | 淳淳同学的个人博客 + + + + + + + + + + + + +

2020前端面试

+

今日裸辞,在投简历的过程中抽出一周集中复习前端知识,并做了此文以记录知识点。

+
+

目 录

[TOC]

+ +

自我介绍

    +
  • 学历
  • +
  • 项目经验
  • +
  • 技术栈 + + +
  • +
+ +

项目难点

    +
  • vue-print-nb:在windows系统上,低版本的浏览器调用#print打印会出现空白页,换成windows.print()即可;或者让用户更新浏览器
  • +
  • vue-print-nb进行单据打印:不同的系统、不同的浏览器,打印效果是不一样的,比如windows系统下element的table-column的props传入的字符串中英文单词超过长度会变成…而不会换行,换成scope就没事了
  • +
  • vue-fallcalender:日历组件,api介绍模糊,无法实现指定日期的初始化、无法对传入数据进行排序
  • +
  • 自定义el-form-item组件:利用slots与props实现自定义样式
  • +
  • 封装SimpleClass:每次页面都要loading、axios、赋值、closeLoading,及处理查询参数
  • +
  • 封装多文件上传Modal:限制文件大小、类型、个数,默认覆盖上传
  • +
  • 封装基于xlsx的Excel导入导出Modal:支持复杂表头的Excel导出 + + +
  • +
+ +

CSS

    +
  • CSS选择器
    查看答案
      +
    • *:通用元素选择器,匹配任何元素
    • +
    • E:标签选择器,匹配所有使用E标签的元素
    • +
    • info:class选择器,匹配所有class属性中包含info的元素
    • +
    • #footer:id选择器,匹配所有id属性等于footer的元素
    • +
    • E,F:多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔
    • +
    • E F:后代元素选择器,匹配所有属于E元素后代的F元素,E和F之间用空格分隔
    • +
    • E > F:子元素选择器,匹配所有E元素的子元素F
    • +
    • E + F:毗邻元素选择器,匹配所有紧随E元素之后的同级元素F
    • +
    • E[att=val]:匹配所有att属性等于”val”的E元素
    • +
    • E:first-child:匹配父元素的第一个子元素
    • +
    • E:last-child:匹配父元素的最后一个子元素,等同于:nth-last-child(1)
    • +
    • E:nth-child(n):匹配其父元素的第n个子元素,第一个编号为1
    • +
    +
  • +
  • CSS 布局 position 详解
    查看答案
      +
    • fixed:固定定位,参照整个窗口
    • +
    • absolute:绝对定位,参照最近定位父元素
    • +
    • relative:相对定位,参照父级元素的原始点
    • +
    • static:默认值,没有定位,出现在正常的文档流中
    • +
    • sticky:吸附定位、磁铁定位、粘性定位。常和fixed结合制造吸附效果
    • +
    • inherit:集成父元素的定位
    • +
    +
  • +
  • css盒模型两种以及切换方式
  • +
  • 实现三列布局
    查看答案
      +
    • float触发BFC块级布局:float: left;、float: right;、overflow:hidden;
    • +
    • flex布局:display:flex;、flex:none;、flex:1;、flex:none;
    • +
    • table布局:display:table;、display:table-cell;
    • +
    • css计算宽度布局:float:left;、width:calc(100% - 100px);、float:right;
    • +
    +
  • +
  • Flex 布局教程:语法篇
  • +
  • Flex 布局示例
    查看答案
      +
    • 容器的属性
    • +
    • flex-direction属性:决定主轴的方向(即项目的排列方向)。.box { flex-direction: row | row-reverse | column | column-reverse; }
    • +
    • flex-wrap属性:默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行。.box{ flex-wrap: nowrap | wrap | wrap-reverse; }
    • +
    • flex-flow属性:是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。.box { flex-flow: <flex-direction> || <flex-wrap>; }
    • +
    • justify-content属性:定义了项目在主轴上的对齐方式。.box { justify-content: flex-start | flex-end | center | space-between | space-around; }
    • +
    • align-items属性:定义项目在交叉轴上如何对齐。.box { align-items: flex-start | flex-end | center | baseline | stretch; }
    • +
    • align-content属性:定义了多根轴线(多行)的对齐方式。如果项目只有一根轴线,该属性不起作用。.box { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
    • +
    • 项目的属性
    • +
    • order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0
    • +
    • flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
    • +
    • flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小
    • +
    • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小
    • +
    • flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
    • +
    • align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
    • +
    +
  • +
  • 实现两栏布局的几种方式
  • +
  • 页面两栏布局(变式)
  • +
  • 浮动元素引起的问题和清除浮动的办法
    查看答案
      +
    • 额外标签法:div style="clear:both;"></div
    • +
    • 使用after伪元素:#parent:after{content:".";height:0;visibility:hidden;display:block;clear:both;}
    • +
    • 设置 overflow 为 hidden 或者 auto
    • +
    • 父元素也设置浮动:(缺点)使得与父元素相邻的元素的布局会受到影响,不可能一直浮动到body,不推荐使用
    • +
    +
  • +
  • 清除浮动overflow:hidden的原理,为什么可以清除
    查看答案
      +
    • 通过触发BFC方式,实现清除浮动
    • +
    • 缺点:内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示要溢出的元素
    • +
    +
  • +
  • CSS伪类-MDN
    查看答案
      +
    • active、focus、hover、link、visited
    • +
    • first-child、last-、nth-child()
    • +
    • first-of-type、last-of-、nth-of-type()
    • +
    • before、after
    • +
    • checked、not()、read-only
    • +
    +
  • +
  • div水平垂直居中的六种方法
  • +
  • 实现一个宽度自适应100%,宽高比16:9的div水平垂直居中
    查看答案
    1
    2
    3
    4
    5
    <div class="box">
    <div class="scale">
    <img src="http://img17.3lian.com/201612/16/88dc7fcc74be4e24f1e0bacbd8bef48d.jpg" class="item"/>
    </div>
    </div>
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    .box {
    width: 80%;
    }

    .scale {
    width: 100%;
    padding-bottom: 56.25%;
    height: 0;
    position: relative;
    }

    .item {
    width: 100%;
    height: 100%;
    background-color: aquamarine;
    position: absolute;
    }
  • +
  • transform有哪些用法
    查看答案
      +
    • 旋转:rotate(transform: rotate(45deg);
    • +
    • 缩放:scale(transform: scale(0.5, 2);
    • +
    • 移动:translate(transform: skew(45px, 150px);
    • +
    • 倾斜:skew(transform: skew(30deg, 30deg);
    • +
    • 基准点:transform-origin(transform-origin: 10px 10px;
    • +
    • 用法:transform: rotate(45deg) scale(0.5) skew(30deg, 30deg) translate(100px, 100px);这四种变形方法顺序可以随意,但不同的顺序导致变形结果不同,原因是变形的顺序是从左到右依次进行
    • +
    +
  • +
  • CSS哪些属性脱离文档流
    查看答案
      +
    • 第一种:定位
        +
      • position:absolute
      • +
      • position:fixed
      • +
      +
    • +
    • 第二种:浮动
        +
      • float:left
      • +
      • float:right
      • +
      +
    • +
    • 注:position:sticky,就是粘性定位并不会脱离文档流
    • +
    +
  • +
  • css表达式:expression
    查看答案
      +
    • IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript脚本关联起来
    • +
    • 每两小时刷新一次背景色:background-color:expression((new Date().getHours()%2?”#B8D4FF”:”#F08A00”));
    • +
    • 依照浏览器的大小来安置一个元素的位置:left: expression(document.body.offsetWidth - 180 “px”);
    • +
    +
  • +
  • html5/css3响应式页面开发总结
    查看答案
      +
    • 自适应是一套模板适应所有终端,但每种设备上看到的版式是一样的,俗称宽度自适应。
    • +
    • 响应式一套模板适应所有终端,但每种设备看到的版式可以是不一样的。如:http://segmentfault.com/
    • +
    • 设置meta标签
        +
      • +
      • §width=device-width:宽度等于当前设备的宽度
      • +
      • §initial-scale:初始的缩放比例(默认设置为1.0)
      • +
      • §minimum-scale:允许用户缩放到的最小比例(默认设置为1.0)
      • +
      • §maximum-scale:允许用户缩放到的最大比例(默认设置为1.0)
      • +
      • §user-scalable:用户是否可以手动缩放(默认设置为no,因为我们不希望用户放大缩小页面)
      • +
      +
    • +
    • css3的媒体查询
        +
      • @media (orientation:portrait) and (max-width:460px) {}
      • +
      • orientation:portrait(指定输出设备中的页面可见区域高度大于或等于宽度) | landscape
      • +
      • +
      +
    • +
    • 百分比布局
    • +
    +
  • +
  • 对BFC的规范的理解
    查看答案
      +
    • W3CCSS2.1规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用)
    • +
    • BFC,块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素
    • +
    • 在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠
    • +
    +
  • +
  • 触发BFC的条件
    查看答案
      +
    • 浮动元素:float除none以外的值,float、right
    • +
    • 绝对定位元素:position(fixed、absolute)
    • +
    • display:inline-blocks、table-cells、table-captions
    • +
    • overflow除了visible以外的值:hidden、auto、scroll
    • +
    +
  • +
  • BFC的用处
    查看答案
      +
    • 可以阻止边距折叠(margin collapsing)
    • +
    • 可以包含内部元素的浮动
    • +
    • 可以阻止元素被浮动覆盖
    • +
    +
  • +
  • display有哪些值?说明他们的作用。
    查看答案
      +
    • none:隐藏,此元素不会被显示
    • +
    • block:块显示;此元素将显示为块级元素,此元素前后会带有换行符
    • +
    • inline:内嵌,默认。此元素会被显示为内联元素,元素前后没有换行符
    • +
    • table:表格显示,此元素会作为块级表格来显示(类似table标签),表格前后带有换行符
    • +
    • inline-block:元素既具有block元素可以设置宽高的特性,同时又具有inline元素默认不换行的特性
    • +
    • list-item:象块类型元素一样显示,并添加样式列表标记
    • +
    • inherit:规定应该从父元素继承display属性的值
    • +
    +
  • +
  • display中block、inline和inline-block的区别
    查看答案
      +
    • block
    • +
    • 前后都有换行,和前后元素都不在一行
    • +
    • 宽度、行高、边距都可以自行设置
    • +
    • 宽度缺省是它的容器的100%,除非设置一个宽度
    • +
    • div,p,h1,form,ul和li是块元素的例子
    • +
    • inline
    • +
    • 和其他元素都在一行上
    • +
    • 高,行高及顶和底边距不可改变
    • +
    • 宽度就是它的文字或图片的宽度,不可改变
    • +
    • span,a,label,input,img,strong和em是inline元素的例子
    • +
    • inline-block
    • +
    • 将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。(应用此特性的元素呈现为内联对象,周围元素保持在同一行,但可以设置宽度和高度地块元素的属性)
    • +
    +
  • +
  • display:none和visibility:hidden的区别
    查看答案
    + + + + + + + + + + + + + + + + + + + + + + +
    特性\标签display:nonevisibility:hidden
    空间占据不占据任何空间,它各边的元素会合拢元素空间依旧存在
    回流与渲染会产生reflow和repaint(回流与重绘)没有这个影响前端性能的问题
    株连性其子孙节点元素全部不可见子元素默认不显示,但如果子孙元素应用了visibility:visible就可以展现出来
    +
  • +
  • css隐藏页面元素的多种方法
    查看答案
      +
    • 常见的CSS预处理器:
        +
      • Sass
      • +
      • Less
      • +
      • Stylus
      • +
      • PostCSS:模块化工具,速度快3-30倍,功能强大(既不是预处理器也不是后处理器
      • +
      +
    • +
    +
  • +
  • sass常用属性
  • +
  • less简介
  • +
  • 谈谈PostCSS
  • +
  • 纯CSS画的基本图形(圆形、三角形、多边形、爱心、八卦等)
  • +
  • 纯CSS绘制三角形(各种角度) + + +
  • +
+ +

JavaScript

    +
  1. 作用域

    +
    查看答案
      +
    • 作用域是一种规则,用于确定引擎在何处以及如何根据标识符名称进行变量查找(引擎、编译器、作用域)
    • +
    • 在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量或抵达最外层作用域(即全局作用域)为止。查找也分为两种:LHS和RHS
    • +
    +
  2. +
  3. 作用域的两种工作模型

    +
    查看答案
      +
    • ==词法作用域==:在写代码或定义时确定的,作用域链基于作用域的嵌套,即更关注在何处声明。大多数编程语言都采用
    • +
    • 动态作用域:在运行时确定的,作用域链是基于调用栈的,即更关注函数是从何处调用的。this的机制也是如此(像但不是)
    • +
    +
  4. +
  5. 要判断一个运行中函数的this绑定,就需要找到这个函数的直接调用位置,最重要的就是分析调用栈(为了到达当前执行位置所调用的所有函数,即函数调用链)。

    +
  6. +
  7. 调用位置如何决定this的绑定对象?可顺序应用下面四条规则来判断

    +
    查看答案
      +
    • 是否在new中调用(new绑定)?绑定到新创建的对象。var bar = new foo()
    • +
    • 是否通过call、apply(显示绑定)或者bind(硬绑定)调用?绑定到指定的对象。var bar = foo.call(obj2)
    • +
    • 是否在某个上下文对象(隐式绑定)中调用?绑定到那个上下文对象。var bar = obj1.foo()
    • +
    • 如果都不是即独立函数调用(默认绑定),严格模式下绑定到undefined,非严格模式下绑定到全局对象。var bar = foo()
    • +
    +
  8. +
  9. ES6中箭头函数()=>{}并不会使用这四条标准的绑定规则,而是根据当前的词法作用域来决定this,具体来说,箭头函数会继承外层函数调用的this绑定(无论this绑定到什么)。这其实和ES6之前的self = this机制一样。

    +
  10. +
  11. 代码风格:

    +
    查看答案
      +
    • 词法作用域风格:只使用词法作用域,并完全抛弃错误的this风格。
    • +
    • this风格:完全采用this风格,必要时使用bind(...),尽量避免使用self = this箭头函数()=>{}
    • +
    +
  12. +
  13. ==原型==

    +
    查看答案
      +
    • 所有的函数都有一个特殊的属性:prototype(原型),prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓的函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。(所有函数的默认原型都是Object的实例)
    • +
    +
  14. +
  15. ==作用域链和原型链==

    +
    查看答案
      +
    • 作用域链:在词法作用域中寻找标识符&变量。作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。
    • +
    • 原型链:在原型对象中寻找引用类型的属性
    • +
    +
  16. +
  17. ==闭包==

    +
  18. +
  19. 闭包是基于词法作用域书写代码时所产生的自然结果

    +
  20. +
  21. 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使==函数是在当前词法作用域之外执行==

    +
  22. +
  23. 无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包

    +
  24. +
  25. 闭包的应用场景:

    +
    查看答案
      +
    • function调用setTimeout(...)(延迟函数的回调会在循环结束时才执行,即使定时器是setTimeout(..., 0)
    • +
    • 定时器、事件监听器、Ajax请求、跨窗口通信、WebWorkers、任何异步或同步任务,只要使用了==回调函数==,实际上就是在使用闭包
    • +
    • for循环
    • +
    • 立即执行函数表达式IIFE:(function(){...})())(本身创建了闭包,但严格来说并不是闭包)
    • +
    • ==模块模式==:比如jQuery和$符就是jQuery模块的公共api
    • +
    +
  26. +
  27. 以上均来自《你不知道的JavaScript(上卷)》

    +
  28. +
  29. js的原型和原型链

    +
    查看答案
      +
    • __proto__指向其构造函数的prototype原型,即
    • +
    • person1.__proto__,指向Person.prototype(相等)
    • +
    • Person.prototype,指向Object.prototype
    • +
    • Object.prototype,指向Null
    • +
    • 上述即原型链
    • +
    +
  30. +
  31. 一篇文章看懂_proto_和prototype的关系及区别

    +
  32. +
  33. prototype、__proto__与constructor区别与联系

    +
    查看答案
      +
    • function Person() {}
    • +
    • Person.prototype.name = ‘Lee’
    • +
    • Person.prototype // {name: Lee, constructor: ƒ}
    • +
    • Person.constructor // [Function: Function] || ƒ Function() { [native code] }
    • +
    • Person.proto // {name: Lee, constructor: ƒ}[Function] || ƒ () { [native code] }
    • +
    • —我是一条分割线—
    • +
    • var person1 = new Person()
    • +
    • person1.prototype // undefined
    • +
    • person1.constructor // [Function: Person] || ƒ Person() {}
    • +
    • person1.__proto__ // {name: Lee, constructor: ƒ}
    • +
    • person1.constructor.prototype // {name: Lee, constructor: ƒ}
    • +
    • person1.constructor.prototype === person1.proto // true
    • +
    +
  34. +
  35. 浅析JavaScript中原型及constructor、__proto__、prototype的关系

    +
    查看答案
      +
    • 任意对象:拥有constructor,指向构造函数
    • +
    • 任意对象:拥有__proto__,指向构造函数的原型
    • +
    • 任意函数:拥有prototype,指向原型对象
    • +
    • 任意函数:拥有__proto__和constructor,因为函数也是一种对象,所以这是从它的原型即Object构造函数那里共享来的
    • +
    +
  36. +
  37. 浅拷贝和深拷贝的区别

    +
    查看答案
      +
    • 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
    • +
    • 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
    • +
    +
  38. +
  39. 深拷贝的思路(递归?利用Object.prototype.toString.call(obj)判断类型,链接同上)

    +
    查看答案
      +
    • 递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝
    • +
    +
  40. +
  41. 实现深拷贝的方法

    +
    查看答案
      +
    • JSON.parse(JSON.stringfy(obj))
        +
      • 缺点1:拷贝Date()类型会被转换为字符串
      • +
      • 缺点2:RegExp、Error对象,结果将只得到空对象{}
      • +
      • 缺点3:function、undefined,结果会丢失
      • +
      • 缺点4:NaN、Infinity和-Infinity,结果会变成null
      • +
      • 缺点5:JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的,则使用JSON.parse(JSON.stringify(obj))深拷贝后,结果会丢弃对象的constructor
      • +
      +
    • +
    • 递归遍历逐级浅拷贝
        +
      • 每一次递归,无论此函数是否有改变都需要重新递归
      • +
      +
    • +
    • proxy深拷贝
        +
      • 判断target类型,isPlainObject()
      • +
      • const isProxy = value => !!value && !!value[MY_IMMER]
      • +
      • 利用上述语句判断是否是我们的proxy类型与对暗号,如果不是proxy,我们需要将其拦截
      • +
      • 判断我们深拷贝的对象是否有改变
      • +
      +
    • +
    +
  42. +
  43. 函数声明和var声明的优先级

    +
  44. +
  45. 如何利用正则匹配字符串

    +
    查看答案
      +
    • exec:查找并返回当前的匹配结果,并以数组的形式返回;exec是RegExp对象的方法;每次只返回一次匹配项
    • +
    • match:math是String对象的方法;一次性返回所有匹配项
    • +
    +
  46. +
  47. 将字符串变成数字

    +
    查看答案
      +
    • 一、当字符串中是纯数字,var s = ‘234’
    • +
    • s *= 1,字符串在运算操作中会被当做数字类型来处理
    • +
    • string的两个转换函数,只对string有效。parseInt(s)parseFloat(s)
    • +
    • Number(s),强制类型转换
    • +
    • 二、当字符串是数字加字母等非数字,如var s = ‘234string’,只能用第二种方法parseIntparseFloat
    • +
    +
  48. +
  49. new Set的数组去重和自己实现的哪个性能会更好

    +
  50. +
  51. new操作符的作用及运行过程(new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例)

    +
    查看答案
      +
    • 一个继承自 Person.prototype 的新对象被创建。
    • +
    • 使用指定的参数调用构造函数 Person ,并将 this 绑定到新创建的对象。new Person 等同于 new Person(),也就是没有指定参数列表,Person 不带任何参数调用的情况。
    • +
    • 由构造函数返回的对象就是new表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
    • +
    • 简单回答
    • +
    • 创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型。
    • +
    • 属性和方法被加入到this引用的对象中。
    • +
    • 新创建的对象由this所引用,并且最后隐式的返回this。
    • +
    +
  52. +
  53. Instanceof运算符的作用及运行过程(用于测试构造函数的prototype属性,是否出现在对象的原型链中的任何位置)

    +
    查看答案
      +
    • 判断构造函数的原型对象(如Person.prototype和Object.prototype)是否在实例对象(person1)的原型链上(__proto__);如果在对象的原型链上,就返回true,如果不在就返回false;
    • +
    +
  54. +
  55. 变量提升是什么?Var、Const 、let 是如何变量提升的(暂时性死区)?

    +
  56. +
  57. var与let、const的区别

    +
    查看答案
      +
    • var声明变量存在变量提升,let和const不存在变量提升
    • +
    • let、const都是块级局部变量
    • +
    • 同一作用域下let和const不能声明同名变量,而var可以
    • +
    +
  58. +
  59. js检测变量是否已定义

    +
    查看答案
      +
    • console.log(typeof undefined); // undefined
    • +
    • console.log(typeof null); // object
    • +
    • console.log(typeof 123); // number
    • +
    • console.log(typeof “字符串”); // string
    • +
    • console.log(typeof {}); // object
    • +
    • console.log(typeof aa); // undefined
    • +
    +
  60. +
  61. js判断对象中是否有某属性的常用方法

    +
    查看答案
      +
    • 点(.x)或者方括号([x]):这里的“不存在”指的是对象自身和原型链上都不存在,如果原型链有该属性,则会返回原型链上的属性值。局限性:不能用在x的属性值存在,但可能为undefined的场景
    • +
    • in运算符:如果指定的属性在指定的对象或其原型链中,则in运算符返回true。局限性:无法区分自身和原型链上的属性,即无法判断该属性是否是自身的
    • +
    • hasOwnProperty():适用于只判断自身属性的场景。
    • +
    +
  62. +
  63. ES6用过的新特性

    +
    查看答案
      +
    • 箭头函数、字符串插值、const、let(块作用域)
    • +
    • Promises异步机制、模块import导入、模块export导出
    • +
    • function默认参数、class类定义与extend继承
    • +
    • for-of遍历对象、…展开操作符
    • +
    +
  64. +
  65. es6中的数组方法

    +
    查看答案
      +
    • 扩展运算符(…)
    • +
    • Array.from()
    • +
    • Array.of()
    • +
    • 数组实例的 copyWithin()
    • +
    • 数组实例的 find() 和 findIndex()
    • +
    • 数组实例的 fill()
    • +
    • 数组实例的 entries(),keys() 和 values()
    • +
    • 数组实例的 includes()
    • +
    • 数组实例的 flat(),flatMap()
    • +
    • 数组的空位
    • +
    • Array.prototype.sort()的排序稳定性
    • +
    +
  66. +
  67. - es6中的对象方法

    +
    查看答案
      +
    • 属性的简洁表示法:module.exports = { getItem, setItem, clear };
    • +
    • 属性名表达式:obj[‘a’ + ‘bc’] = 123;
    • +
    • 方法的name属性
    • +
    • 属性的可枚举性和遍历
        +
      • 有四个操作会忽略enumerable为false的属性
      • +
      • for…in循环:只遍历对象自身的和继承的可枚举的属性。
      • +
      • Object.keys():返回对象自身的所有可枚举的属性的键名。
      • +
      • JSON.stringify():只串行化对象自身的可枚举的属性。
      • +
      • Object.assign():忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
      • +
      +
    • +
    • super关键字:指向当前对象的原型对象。
        +
      • super.foo等同于Object.getPrototypeOf(this).foo(属性)Object.getPrototypeOf(this).foo.call(this)(方法)
      • +
      +
    • +
    • 对象的扩展运算符:let { x, y, …z } = { x: 1, y: 2, a: 3, b: 4 };
    • +
    • 链判断运算符
        +
      • obj?.prop // 对象属性
      • +
      • obj?.[expr] // 同上
      • +
      • func?.(…args) // 函数或对象方法的调用
      • +
      +
    • +
    • Null 判断运算符
        +
      • const animationDuration = response.settings?.animationDuration ?? 300;
      • +
      +
    • +
    +
  68. +
  69. - JS继承的实现方式

    +
    查看答案
      +
    • 原型链继承:将父类的实例作为子类的原型。function Cat(){}; Cat.prototype = new Animal()
    • +
    • 构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)。function Cat(name){Animal.call(this);this.name = name || 'Tom';}
    • +
    • 实例集成:为父类实例添加新特性,作为子类实例返回。function Cat(name){var instance = new Animal();instance.name = name || 'Tom';return instance;}
    • +
    • 拷贝继承
    • +
    • 组合继承
    • +
    • 寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点
    • +
    +
  70. +
  71. - es6中的对象新增方法

    +
    查看答案
      +
    • Object.is():Object.is('foo', 'foo')Object.is({}, {})
        +
      • ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。JavaScript缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
      • +
      +
    • +
    • Object.assign(target, source1, source2)
        +
      • 用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
      • +
      +
    • +
    • Object.getOwnPropertyDescriptors(obj)
        +
      • 返回指定对象所有自身属性(非继承属性)的描述对象(descriptor)
      • +
      • {foo:{configurable:true,enumerable:true,value:123,writable:true}}
      • +
      +
    • +
    • __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()
        +
      • Object.getPrototypeOf(person1)===person1.constructor.prototype
      • +
      +
    • +
    • Object.keys(),Object.values(),Object.entries()
    • +
    • Object.fromEntries()
        +
      • 是Object.entries()的逆操作,用于将一个键值对数组转为对象
      • +
      +
    • +
    +
  72. +
  73. - js es6遍历对象的6种方法(应用中推荐前三种)

    +
    查看答案
      +
    • Object.keys()、Object.values()、Object.entries():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)
    • +
    • for…in…:循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)
    • +
    • Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性(包括不可枚举属性,但不含Symbol属性)
    • +
    • Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性(不管属性名是Symbol或字符串,也不管是否可枚举)
    • +
    +
  74. +
  75. - for…in…遍历对象时,为什么有的对象属性可以被遍历到,有的不行?

    +
    查看答案
      +
    • js中基本包装类型的自带原型属性是不可枚举的,如Object, Array, Number等
    • +
    • Object.defineProperty()定义的enumerable:false的属性也是不可枚举的
    • +
    +
  76. +
  77. - for-in和for-of的区别

    +
    查看答案
      +
    • for…in循环出的是key值,for…of循环出的是value值
    • +
    • 推荐在循环对象属性的时候,使用for…in,在遍历数组的时候的时候使用for…of
    • +
    • for…of不能循环普通的对象,需要通过和Object.keys()搭配使用
    • +
    +
  78. +
  79. - for-of的工作过程

    +
    查看答案
      +
    • 首先调用集合的Symbol.iterator方法,返回一个新的迭代器对象(迭代器对象可以是任意具有.next()方法的对象)
    • +
    • for-of循环将重复调用这个.next()方法,每次循环调用一次
    • +
    +
  80. +
  81. - a.b.c()中c的this(idea自己实现)

    +
    查看答案
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    var x = '我是a'
    var a = {
    x: '我是a',
    b: {
    x: '我是b',
    c: function () {
    var x = '我是c'
    console.log(this)
    }
    }
    }
    a.b.c() // { x: '我是b', c: [Function: c] }
    var d = {
    x: '我是d',
    e: () => a.b.c()
    }
    d.e() // { x: '我是b', c: [Function: c] }

    // 如果把c改为箭头函数
    c: () => {
    var x = '我是c'
    console.log(this)
    }
    // 输出结果如下
    a.b.c() // Window {...}
    d.e() // Window {...}
  82. +
  83. forEach和for/for…of循环在使用await上的区别,如果想同时执行呢?(promise.all)

    +
    查看答案
      +
    • for/for…of:遍历到每个元素后,执行await后的方法
    • +
    • forEach:在遍历每个元素后,执行的是该方法接收的回调函数方法,然后在回调中,执行await方法,forEach方法内部调用回调函数时,并没有使用await修饰,所以回调方法并不会等待上一个回调执行完毕。所以,内部的await也就失去了意义。
    • +
    +
  84. +
  85. IIEF立即执行为什么用两对括号包裹

    +
    查看答案
      +
    • 模拟函数执行
    • +
    • (function () { return 233 })() // 233
    • +
    • (function () { return 233 }()) // 233
    • +
    • +function () { return 233 }() // 233
    • +
    • -function () { return 233 }() // -233
    • +
    • ~function () { return 233 }() // -233
    • +
    • !function () { return 233 }() // false
    • +
    +
  86. +
  87. []+{}{}+[]结果有何不同

    +
    查看答案
      +
    • 加法会进行隐式类型转换,规则是调用其valueOf()或toString()以取得一个非对象的值(primitive value)
    • +
    • []+{} 结果是 “[object Object]”,字符串串接
    • +
    • {}+[] 结果是 0,{}解析为{ // empty block },即对一个空数组执行正号运算,实际上就是把数组转型为数字
    • +
    • ({}+[]) 结果是 “[object Object]”
    • +
    • +[] 结果是 0 ,此处+为正号
    • +
    • +{} 结果是 NaN ,此处+为正号
    • +
    • [].toString() 结果是 “”
    • +
    • ({}).toString() 结果是 “[object Object]”
    • +
    • {}.toString():会出错,Uncaught SyntaxError: Unexpected token .
    • +
    • 0+[] 结果是 “0”
    • +
    • 0+{} 结果是 “0[object Object]”
    • +
    +
  88. +
  89. var a=b=c=d=5是什么意思?如果接下来再写一句,d=9,a,b,c的值会变化吗?

    +
    查看答案
      +
    • 初始化给a、b、c、d赋值都为5
    • +
    • 不改变,改变d后a、b、c值不会改变,因为a、b、c、d都是值类型的变量,各自的值存在于自己的栈当中,当d变化了其他栈中的值不改变。
    • +
    +
  90. +
  91. var a=b=c=d=【1,2,3,4,5】是什么意思?如果接下来写一句d【5】=9;a,b,c,的值会发生变化吗

    +
    查看答案
      +
    • 发生变化,a、b、c、d值都改为[1,2,3,4,5,9]
    • +
    • 因为a、b、c、d是引用类型,引用类型的数据存在于堆当中,栈中存的是指向堆的地址,初始化时 a、b、c、d在各自的栈中指向的堆是同一个,该堆保存着[1,2,3,4,5],当改变了堆中的值,其他对象跟着改变。
    • +
    +
  92. +
  93. var a=b=c=d=【1,2,3,4,5】是什么意思?如果接下来再写一句d=【9】;a,b,c的值会发生变化吗

    +
    查看答案
      +
    • 不改变,因为对于d来说改变的是d栈中的地址,此时d指向的堆已经不是原地址,所以此时d与其他几个对象的值已经不同了。
    • +
    • 考点:对比上一题,改变的是对应堆中的值,而此题是将d栈中的指针地址改变了。
    • +
    +
  94. +
  95. js表达式和语句的区别

    +
    查看答案
      +
    • 表达式是由运算符构成,并运算产生结果的语法结构。每个表达式都会产生一个值,它可以放在任何需要一个值的地方,比如作为一个函数调用的参数
    • +
    • 语句:则是由“;(分号)”分隔的句子或命令。如果在表达式后面加上一个“;”分隔符,这就被称为“表达式语句”。它表明“只有表达式,而没有其他语法元素的语句”
        +
      • 声明语句:变量声明和函数声明
      • +
      • 赋值语句
      • +
      • 控制语句:能够对语句执行顺序产生改变,包括条件语句和循环语句,当然还有比较特殊的标签语句
      • +
      • 表达式语句:这些语句去掉最后分号,都也可当表达式用的。常见的有:对象操作(new、delete)、函数调用(函数执行,必有返回值)等
      • +
      +
    • +
    +
  96. +
  97. async 和 await 是谁的语法糖

    +
  98. +
  99. generator 又是如何实现的?

    +
  100. +
  101. js的5种基本和1(2)种引用数据类型

    +
    查看答案
      +
    • 基本数据类型 :String、Number、Boolean 、Null、Undefined、Symbol、BigInt
    • +
    • 引用数据类型:Object(Funtion)
    • +
    • 判断方法:Object.prototype.toString.call(data)
    • +
    +
  102. +
  103. null与undefined知识点(链接同上)

    +
    查看答案
      +
    • undefined值派生自null,所以相等比较null==undefined为true
    • +
    • null是空指针但未用,有个占位符,undefined连指针都没有,也没有占位符,所以绝对比较null===undefined为false
    • +
    +
  104. +
  105. 堆和栈的区别(第二篇帖子)

    +
    查看答案
      +
    • 栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的
    • +
    • 堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
    • +
    +
  106. +
  107. 为什么会有跨域的问题?

    +
    查看答案
      +
    • 前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问问题。在请求的过程中我们要想回去数据一般都是post/get请求,所以跨域问题出现
    • +
    • 跨域问题来源于JavaScript的同源策略,即只有协议+主机名(域名)+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。
    • +
    • 跨域问题是针对JS和ajax的,html本身没有跨域问题(比如a标签、script标签、甚至form标签,只要是带src的)可以直接跨域发送数据并接收数据
    • +
    +
  108. +
  109. 九种跨域方式实现原理

    +
    查看答案
      +
    • 开发环境:webpack自带proxyTable:target:'http://192.168.0.123:8080/'、pathRewrite:{'^/api': '/api'}
    • +
    • 生产环境:利用nginx反向代理,将请求分发到部署到相应项目的服务器上:location ~ /api { proxy_pass http://127.0.0.1:23480; }
    • +
    • JSONP:ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加。(但JSONP只支持GET请求,不支持POST请求)jsonp原理详解
    • +
    • CORS:是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),CORS通信与同源的AJAX通信没有差别,就是在请求头信息中增加了Origin:http://192.168.0.123:8080/字段。详见阮一峰的博客
    • +
    • web sockets:在JS创建了webSocket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。只有在支持webSocket协议的服务器上才能正常工作。(http->ws; https->wss)
    • +
    +
  110. +
  111. JavaScript手动实现JSONP代码

    +
    查看答案
      +
    • document.createElement(‘script’)
    • +
    • jsonpScript.setAttribute(‘src’, ${url}callback=${callbackFunction})
    • +
    • (完成后)document.getElementsByTagName(‘head’)[0].removeChild(script)
    • +
    +
  112. +
  113. 对前端模块化的认识

    +
    查看答案
      +
    • CommonJS规范:允许模块通过require方法来同步加载(同步意味阻塞)所要依赖的其他模块,然后通过module.exports来导出需要暴露的接口。CommonJS是以在浏览器环境之外构建JavaScript生态系统为目标而产生的项目,比如在服务器和桌面环境中。
    • +
    • AMD标准:AMD是RequireJS在推广过程中对模块定义的规范化产出(异步模块定义)。
        +
      • AMD标准中定义了以下两个API:
      • +
      • require([module], callback);用来加载一系列模块
      • +
      • define(id, [depends], callback);用来定义并暴露一个模块
      • +
      • 优点:
      • +
      • 异步加载,提前执行
      • +
      • 适合在浏览器环境中加载模块,且可以并行加载多个模块
      • +
      +
    • +
    • CMD标准:CMD是SeaJS在推广过程中对模块定义的规范化产出(在CommomJS和AMD基础上提出)。
        +
      • define(function (requie, exports, module) {});
      • +
      • 优点:
      • +
      • 依赖就近,延迟执行
      • +
      • 可以很容易在服务器中运行
      • +
      +
    • +
    • ES6模块化:EcmaScript6标准增加了JavaScript语言层面的模块体系定义(关键字)。在 ES6 中,我们使用import关键字引用模块,使用export关键字来导出模块。
    • +
    +
  114. +
  115. 四种常见的JS模块化管理方法的比较(表格形式:导入语法、导出语法、加载方式等)

    +
  116. +
  117. AMD 和 CMD 的区别

    +
    查看答案
      +
    • 对于依赖的模块,AMD是提前执行,CMD是延迟执行。
    • +
    • AMD推崇依赖前置;CMD推崇依赖就近,只有在用到某个模块的时候再去require。
    • +
    • AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一
    • +
    +
  118. +
  119. ES6 模块与 CommonJS 模块的差异

    +
    查看答案
      +
    • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
    • +
    • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
    • +
    • 即 CommonJS 先加载整个模块,输出一个对象,取对象内相应的值,输出后内部不会再变化;ES6 是静态编译命令,先加载一个引用,等执行时再根据引用到加载模块内取值输出,动态引用不缓存。
    • +
    • 目前很少JS引擎能直接支持 ES6 标准,因此 Babel 的做法实际上是将不被支持的 import 翻译成目前已被支持的 require。
    • +
    +
  120. +
  121. import和require的区别

    +
    查看答案
      +
    • 遵循规范
        +
      • require 是 AMD规范引入方式
      • +
      • import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法
      • +
      +
    • +
    • 调用时间
        +
      • require是运行时调用,所以require理论上可以运用在代码的任何地方
      • +
      • import是编译时调用,所以必须放在文件开头
      • +
      +
    • +
    • 本质
        +
      • require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
      • +
      • import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
      • +
      +
    • +
    +
  122. +
  123. XML和JSON的区别?

    +
  124. +
  125. 什么是dom0,dom1,dom2,dom3

    +
    查看答案
      +
    • DOM0:不是W3C规范。
    • +
    • DOM1:开始是W3C规范。专注于HTML文档和XML文档。
    • +
    • DOM2:对DOM1增加了样式表对象模型
    • +
    • DOM3:对DOM2增加了内容模型(DTD、Schemas) 和文档验证。
    • +
    +
  126. +
  127. dom0级和dom2级的区别

    +
    查看答案
      +
    • DOM0级事件处理:简单且具有跨浏览器的优势;但函数会被覆盖,只会执行最后一个的函数
    • +
    • DOM2级事件处理:不会覆盖且顺序执行;不具有跨浏览器优势
    • +
    +
  128. +
  129. 事件,事件冒泡和事件捕获

    +
  130. +
  131. addEventListener的第三个参数到底该怎么设置

    +
    查看答案
      +
    • target.addEventListener(type, listener[, useCapture]);
    • +
    • useCapture: 默认值为false(即 使用事件冒泡)
    • +
    +
  132. +
  133. JS阻止冒泡和取消默认事件(默认行为)

    +
    查看答案
      +
    • @click.stop="func($event)"vue取消事件冒泡
    • +
    • @click.prevent="func($event)"vue阻止默认事件
    • +
    • event.stopPropagation()W3C提供的方法,起到阻止捕获和冒泡阶段中当前事件的进一步传播
    • +
    • event.preventDefault()可以取消默认事件
    • +
    • e.cancelBubble = true,只针对IE
    • +
    +
  134. +
  135. Javascript垃圾回收方法

    +
    查看答案
      +
    • 标记清除(mark and sweep)是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
    • +
    • 引用计数(reference counting) 是另一种不太常见的垃圾回收策略。在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
    • +
    • 在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的,也就是说只要涉及BOM及DOM就会出现循环引用问题。
    • +
    +
  136. +
  137. Web Worker

    +
    查看答案
      +
    • 作用就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker线程在后台运行,两者互不干扰。等到Worker线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被Worker线程负担了,主线程(通常负责UI交互)就会很流畅,不会被阻塞或拖慢。
    • +
    • 通过 worker = new Worker(url) 加载一个JS文件来创建一个worker,同时返回一个worker实例。
    • +
    • 通过worker.postMessage( data) 方法来向worker发送数据。
    • +
    • 绑定worker.onmessage方法来接收worker发送过来的数据。
    • +
    • 可以使用 worker.terminate() 来终止一个worker的执行。
    • +
    +
  138. +
  139. js按位运算符

    +
    查看答案
      +
    • & 按位与
    • +
    • | 按位或
    • +
    • ^ 按位异或
    • +
    • ~ 按位非
    • +
    • >> 右移
    • +
    • << 左移
    • +
    +
  140. +
  141. 常见的js位运算

    +
    查看答案
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    一、取整
    // 异或运算取整::位运算只对整数有效,遇到小数时,会将小数部分舍去,只保留整数部分。
    // 所以,将一个小数与0进行或运算,等同于对该数去除小数部分,即取整数位。
    12.9 ^ 0 // 12
    -12.9 ^ 0 // -12

    // 双否定位操作符取整
    ~~4.9 // 4
    ~~(-4.9) // -4

    // 左移0位,就相当于将该数值转为32位整数,等同于取整,对于正数和负数都有效。
    13.5 << 0 // 13
    -13.5 << 0 // -13

    // 或运算取整:位运算只对整数有效,遇到小数时,会将小数部分舍去,只保留整数部分。
    // 所以,将一个小数与0进行或运算,等同于对该数去除小数部分,即取整数位。
    2.9 | 0 // 2
    -2.9 | 0 // -2

    二、判断奇数、偶数
    function assert(n) {
    if (n & 1) {
    console.log("n是奇数");
    } else {
    console.log("n是偶数");
    }
    }

    & 是按位与运算
    1 & 1 = 1
    1 & 0 = 0
    0 & 0 = 0
    0 & 1 = 0
    int型变量在一般内存中占用4个字节
    2 = 00000000 00000000 00000000 0000010
    1 = 00000000 00000000 00000000 0000001
    2 & 1 = 0
  142. +
  143. 2..toString

    +
  144. +
  145. 为什么0.1+0.2不等于0.3?

    +
    查看答案
      +
    • 原因在于在JS中采用的IEEE_754的双精度标准,计算机内部存储数据的编码的时候,0.1在计算机内部根本就不是精确的0.1,而是一个有舍入误差的0.1。
    • +
    • 两个有舍入误差的值在求和时,相互抵消了,但这种“负负得正,相互抵消”不一定是可靠的,当这两个数字是用不同长度数位来表示的浮点数时,舍入误差可能不会相互抵消。
    • +
    • 又如,对于0.1+0.3,结果其实并不是0.4,但0.4是最接近真实结果的数,比其它任何浮点数都更接近。许多语言也就直接显示结果为0.4了,而不展示一个浮点数的真实结果了。
    • +
    +
  146. +
  147. 数组的降维5种办法

    +
    查看答案
      +
    • 数组字符串化:arr += ''; arr = arr.split(',');
    • +
    • 递归,判断后push或concat
    • +
    • Array.prototype.flat()
    • +
    • 使用reduce、concat和递归无限反嵌套多层嵌套的数组
    • +
    +
  148. +
  149. 数组的join:把数组中的所有元素拼接成一个字符串,元素是通过指定的分隔符进行分隔的。

    +
  150. +
  151. 字符串的split:把一个字符串通过指定的分隔符分割成字符串数组。

    +
  152. +
  153. 数组的map和forEach的区别

    +
    查看答案
      +
    • map()方法:创建一个新的数组,其中每一个元素由调用数组中的每一个元素执行提供的函数得来,所以可以使用复合(composition)(map(),filter(),reduce()等组合使用)来玩出更多的花样
    • +
    • foreEach()方法:针对每一个元素执行提供的函数,不返回新数组,返回值为undefined
    • +
    +
  154. +
  155. js如何判断数据类型

    +
    查看答案
      +
    • Object.prototype.toString.call(data):最全面,但需要注意区分大小写
    • +
    • typeof操作符:不适合用于判断是否为数组。当使用typeof判断数组和对象的时候,都会返回object。可以使用isArray()来判断是否为数组
    • +
    • instanceof:只能用来判断对象和函数,不能用来判断字符串和数字等。判断它是否为字符串和数字时,只会返回false
    • +
    • constructor:返回对创建此对象的数组函数的引用
    • +
    +
  156. +
  157. ES6中Promise.all和Promise.race区别

    +
    查看答案
      +
    • Promise.all:都成功才会调用success,如果有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。
    • +
    • Promise.race:只要有一个成功就会调用success,但是进程不会立即停止
    • +
    • 对promise的考察,then链的应用
    • +
    +
  158. +
  159. Document.cookie-MDN

    +
  160. +
  161. js如何操作cookie

    +
    查看答案
      +
    • set:document.cookie = key + “=” + val + “;expires=” + date.toGMTString();
    • +
    • get:document.cookie.replace(/[ ]/g, “”).split(“;”)
    • +
    • delete:document.cookie = key + “=v; expires =” + date.toGMTString();
    • +
    • 或 利用小框架:cookies.js
    • +
    +
  162. +
  163. Cookie和Session的使用和区别

    +
  164. +
  165. js进程(process)和线程(thread)的区别

    +
    查看答案
      +
    • 进程:操作系统分配的占有CPU资源的最小单位。拥有独立的地址空间。
    • +
    • 线程:安排CPU执行的最小单位。同一个进程下的所有线程,共享进程的地址空间。
    • +
    +
  166. +
  167. js进程(process)和线程(thread)的关系

    +
    查看答案
      +
    • 以多进程形式,允许多个任务同时运行
    • +
    • 以多线程形式,允许单个任务分成不同的部分运行
    • +
    • 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源
    • +
    • 以下是详细解释:
    • +
    • 进程它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态
    • +
    • 一个进程可以包括多个线程
    • +
    • 一个进程的内存空间是共享的,每个线程都可以使用这些共享内存
    • +
    • 一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存
    • +
    • 一个防止其他线程使用的简单方法"互斥锁"(Mutual exclusion,缩写Mutex),防止多个线程同时读写某一块内存区域
    • +
    +
  168. +
  169. Object.create实现了什么?传null得到的结果和普通对象有什么区别?

    +
    查看答案
      +
    • 创建对象的方式不同
        +
      • newObject():通过构造函数来创建对象, 添加的属性是在自身实例下。console.log(b)//{rep:"apple"} console.log(b.__proto__)//{}
      • +
      • Object.create():创建对象的另一种方式,可以理解为继承一个对象,添加的属性是在原型下。console.log(b)//{} console.log(b.__proto__)//{rep:"apple"}
      • +
      +
    • +
    • 创建对象属性的性质不同,Object.getOwnPropertyDescriptors(obj)
        +
      • newObject():{value:42,writable:true,enumerable:true,configurable:true}
      • +
      • Object.create():{value:42,writable:false,enumerable:false,configurable:false}
      • +
      +
    • +
    • 创建空对象时不同
        +
      • newObject():__proto:Object
      • +
      • Object.create():No properties
      • +
      +
    • +
    • __proto__属性
        +
      • newObject():?
      • +
      • Object.create():?
      • +
      +
    • +
    +
  170. +
  171. call、apply和bind有何区别

    +
    查看答案
      +
    • call对函数直接调用:xw.say.call(xh,"实验小学","六年级")
    • +
    • apply对函数直接调用:xw.say.apply(xh,["实验小学","六年级"])
    • +
    • bind返回的是一个函数,需要手动()调用,且可在调用时传参:xw.say.bind(xh,"实验小学","六年级")()xw.say.bind(xh)("实验小学","六年级")
    • +
    +
  172. +
  173. 手写实现call、apply、bind

    +
    查看答案

    模拟call

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Function.prototype.myCall = function(obj){
    if(obj === null || obj === undefined){
    obj = window;
    } else {
    obj = Object(obj);
    }
    let arg = [];
    let val ;
    for(let i = 1 ; i<arguments.length ; i++){
    arg.push( 'arguments[' + i + ']' ) ;
    }
    obj._fn_ = this;
    val = eval( 'obj._fn_(' + arg + ')' )
    delete obj._fn_;
    return val
    }
    + +

    模拟apply

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Function.prototype.myApply = function(obj,arr){
    if(obj === null || obj === undefined){
    obj = window;
    } else {
    obj = Object(obj);
    }
    let args = [];
    let val ;
    for(let i = 0 ; i<arr.length ; i++){
    args.push( 'arr[' + i + ']' ) ;
    }
    obj._fn_ = this;
    val = eval( 'obj._fn_(' + args + ')' )
    delete obj._fn_;
    return val
    }
    + +

    模拟bind

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Function.prototype.myFind = function(obj){
    if(obj === null || obj === undefined){
    obj = window;
    } else {
    obj = Object(obj);
    }
    let _this = this;
    let argArr = [];
    let arg1 = [];
    for(let i = 1 ; i<arguments.length ; i++){
    arg1.push( arguments[i] );
    argArr.push( 'arg1[' + (i - 1) + ']' ) ;
    }
    return function(){
    let val ;
    for(let i = 0 ; i<arguments.length ; i++){
    argArr.push( 'arguments[' + i + ']' ) ;
    }
    obj._fn_ = _this;
    console.log(argArr);
    val = eval( 'obj._fn_(' + argArr + ')' ) ;
    delete obj._fn_;
    return val
    };
    }
  174. +
  175. call、apply、bind的应用

    +
    查看答案

    求数组中的最大和最小值

    +
    1
    2
    3
    var arr = [1,2,3,89,46]
    var max = Math.max.apply(null,arr)//89
    var min = Math.min.apply(null,arr)//1
    + +

    将类数组转化为数组

    +
    1
    var trueArr = Array.prototype.slice.call(arrayLike)
    + +

    数组追加

    +
    1
    2
    3
    4
    5
    var arr1 = [1,2,3];
    var arr2 = [4,5,6];
    var total = [].push.apply(arr1, arr2);//6
    // arr1 [1, 2, 3, 4, 5, 6]
    // arr2 [4,5,6]
    + +

    判断变量类型

    +
    1
    2
    3
    4
    5
    function isArray(obj){
    return Object.prototype.toString.call(obj) == '[object Array]';
    }
    isArray([]) // true
    isArray('dot') // false
    + +

    利用call和apply做继承

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Person(name,age){
    // 这里的this都指向实例
    this.name = name
    this.age = age
    this.sayAge = function(){
    console.log(this.age)
    }
    }
    function Female(){
    Person.apply(this,arguments)//将父元素所有方法在这里执行一遍就继承了
    }
    var dot = new Female('Dot',2)
    + +

    使用 log 代理 console.log

    +
    1
    2
    3
    4
    function log(){
    console.log.apply(console, arguments);
    }
    // 当然也有更方便的 var log = console.log()
  176. +
  177. 替代es6中拓展运算符传参的方式

    +
    查看答案
      +
    • 函数调用中替代数组的apply方法
    • +
    • add(...args)等同于f.apply(null, args)
    • +
    +
  178. +
  179. 实现一个发布订阅,有订阅(on),发布(emit),一次订阅功能(once)

    +
  180. +
  181. 实现防抖节流

    +
    查看答案

    防抖(debounce):(最后一次)规定一个期限时间,在首次触发事件时,不立即执行回调函数,而是在期限时间后再执行,如果期限时间内回调函数被重复执行,则期限时间重新计时。(输入完字符串再发请求)

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* 
    *fn --> 需要防抖的函数;
    *delaytime --> 毫秒数,防抖所需期限值;
    */
    function debounce(fn,delaytime){
    let timer = null
    return function(){
    if(timer){
    clearTimeout(timer) //进入这里说明当前存在一个执行过程,并且同时又执行了一个相同事件,故取消当前的执行过程
    }
    timer = setTimeout(fn,delaytime)
    }
    }
    function show_scrollPosition(){
    var scrollPosition = document.body.scrollTop || document.documentElement.scrollTop;
    console.log("当前滚动条位置为:",scrollPosition);
    }

    window.onscroll = debounce(show_scrollPosition,1000)
    + +

    节流(throttle):(第一次)规定一个期限时间,在该时间内,触发事件的回调函数只能执行一次,如果期限时间内回调函数被多次触发,则只有一次能生效。(页面滚动到底部就加载更多)

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    function throttle(fn, delay) {
    let last_time
    let timer = null
    return function () {
    let cur_time = new Date().getTime()
    if (last_time && cur_time < last_time + delay) { //若为真,则表示上次执行过,且在期限值范围内
    clearTimeout(timer)
    timer = setTimeout(() => {
    fn();
    last_time = cur_time
    }, delay)
    } else {
    last_time = cur_time;
    fn();
    }

    }
    }

    function show_scrollPosition() {
    var scrollPosition = document.body.scrollTop || document.documentElement.scrollTop;
    console.log("当前滚动条位置为:", scrollPosition);
    }

    window.onscroll = throttle(show_scrollPosition, 1000)
    +
  182. +
  183. 实现请求并发限制,具体为:封装一个函数,传递请求并发的个数为参数,实现对并发请求的限制

    +
  184. +
  185. 说说闭包以及垃圾回收机制

    +
  186. +
  187. 利用async和await如何处理异常事件

    +
  188. +
  189. 箭头函数和普通函数有什么区别?如果想改变箭头函数中绑定this怎么办?

    +
  190. +
  191. 原生js判断鼠标在一个有对角线矩形的位置

    + + + +
  192. +
+ +

Vue 2.x

源码相关

    +
  1. BiliBili: Vue 2.x 源码解读(12) —— path阶段
  2. +
+
    +
  • Emm…,慢慢看
  • +
+
    +
  1. v-if和v-for哪个优先级更高?如果两个同时出现,应该怎么优化得到更好的性能?

    +
    查看答案
      +
    • 源码: compiler/codegen/index.js
    • +
    • Vue 2.x版本中,v-if的优先级大于v-for
    • +
    • Vue 3.x版本中,v-for的优先级大于v-if
    • +
    • render函数: with(this){return _c('div', { ... })}
    • +
    +
    +
  2. +
  3. Vue组件data为什么必须是个函数而Vue的根实例则没有此限制?

    +
    查看答案
      +
    • 源码: src\core\instance\state.js - initData()
    • +
    • Vue组件可能存在多个实例,如果使用对象形式定义data,则会导致它们共用一个data对象,那么状态变更将会影响所有组件实例,这是不合理的
    • +
    • 采用函数形式定义,在initData时会将其作为工厂函数返回全新data对象,有效规避多实例之间状态污染问题
    • +
    • 而在Vue根实例创建过程中则不存在该限制,也是因为根实例只能有一个,不需要担心这种情况
    • +
    +
    +
  4. +
  5. 你知道vue中key的作用和工作原理吗?说说你对它的理解。

    +
    查看答案
      +
    • 源码: src\core\vdom\patch.js - updateChildren()
    • +
    • key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两 个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少DOM操 作量,提高性能
    • +
    • 另外,若不设置key还可能在列表更新时引发一些隐蔽的bug(暂时未知)
    • +
    • vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果
    • +
    +
    +
  6. +
  7. 你怎么理解vue中的diff算法?

    +
    查看答案
      +
    • 源码1: 必要性,lifecycle.js - mountComponent()
        +
      • 组件中可能存在很多个data中的key使用
      • +
      +
    • +
    • 源码2: 执行方式,patch.js - patchVnode()
        +
      • patchVnode是diff发生的地方,整体策略: 深度优先,同层比较
      • +
      +
    • +
    • 源码3: 高效性,patch.js - updateChildren()
    • +
    • diff算法是虚拟DOM技术的必然产物: 通过新旧虚拟DOM作对比(即diff),将变化的地方更新在真实DOM上
    • +
    • 另外,也需要 diff 高效的执行对比过程,从而降低时间复杂度为O(n)
    • +
    • vue 2.x 中为了降低 Watcher 粒度,每个组件只有一个Watcher与之对应,只有引入diff才能精确找到发生变化的地方
    • +
    • vue中diff执行的时刻是组件实例执行其更新函数时,它会比对上一次渲染结果oldVnode和新的渲染结果newVnode,此过程称为patch
    • +
    • diff过程整体遵循深度优先、同层比较的策略;两个节点之间比较会根据它们是否拥有子节点或者文本节点做不同操作;比较两组子节点是算法的重点,首先假设头尾节点可能相同做首首、尾尾、首尾、尾首4次比对尝试,如果没有找到相同节点才按照通用方式遍历查找,查找结束再按情况处理剩下的节点;借助key通常可以非常精确找到相同节点,因此整个patch过程非常高效。
    • +
    +
    +
  8. +
  9. 谈一谈对vue组件化的理解?

    +
    查看答案
      +
    • 源码1: 组件定义,src\core\global-api\assets.js
        +
      • vue-loader会编译template为render函数,最终导出的依然是组件配置对象
      • +
      +
    • +
    • 源码2: 组件化优点,lifecycle.js - mountComponent()
        +
      • 组件、Watcher、渲染函数和更新函数之间的关系
      • +
      +
    • +
    • 源码3: 组件化实现: 构造函数,src\core\global-api\extend.js、实例化及挂载,src\core\vdom\patch.js - createElm()
    • +
    • 组件是独立和可复用的代码组织单元。组件系统是 Vue 核心特性之一,它使开发者使用小型、独立和通常可复用的组件构建大型应用;
    • +
    • 组件化开发能大幅提高应用开发效率、测试性、复用性等;
    • +
    • 组件使用按分类有: 页面组件、业务组件、通用组件;
    • +
    • vue的组件是基于配置的,我们通常编写的组件是组件配置而非组件,框架后续会生成其构造函数,它们基于VueComponent,扩展于Vue;
    • +
    • vue中常见组件化技术有: 属性prop,自定义事件,插槽等,它们主要用于组件通信、扩展等;
    • +
    • 合理的划分组件,有助于提升应用性能;
    • +
    • 组件应该是高内聚、低耦合的;
    • +
    • 遵循单向数据流的原则。
    • +
    +
    +
  10. +
  11. 谈一谈对vue设计原则的理解?

    +
    查看答案
      +
    • 在vue的官网上写着大大的定义和特点: 渐进式JavaScript框架、易用、灵活和高效
    • +
    +
    +
  12. +
  13. 谈谈你对MVC、MVP和MVVM的理解?

    +
  14. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你了解哪些Vue性能优化方法?

    +
    查看答案
      +
    • 路由懒加载
    • +
    • keep-alive缓存页面
    • +
    • 使用v-show复用DOM
    • +
    • v-for 遍历避免同时使用 v-if
    • +
    • 长列表性能优化,静态列表:list = Object.freeze([])
    • +
    • 虚拟滚动:vxe-table
    • +
    • 事件的销毁,Vue 组件销毁时,会自动解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。beforeDestroy() { clearInterval(this.timer) }
    • +
    • 图片懒加载,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域 内的图片先不做加载,等到滚动到可视区域后再去加载。参考项目:vue-lazyload,代码:<img v-lazy="/static/img/1.png">
    • +
    • 第三方插件按需引入,import { Button, Select } from 'element-ui';
    • +
    • 无状态的组件标记为函数式组件,<template functional> ... </template>
    • +
    • 子组件分割,独立可复用功能可抽象出来
    • +
    • 变量本地化,如果有for循环等频繁访问this.xxx的情况,提前赋值给本地变量
    • +
    • SSR
    • +
    +
    +
  2. +
  3. 简单说一说vuex使用及其理解?

    +
    查看答案
      +
    • Vuex实现了一个单向数据流,在全局拥有一个state存放数据,当组件要更改state中的数据时,必须通过mutation提交修改信息,mutation同时提供了订阅者模式供外部插件调用获取state数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作 需要走action,但action也是无法直接修改state的,还是需要通过mutation来修改state的数据。最后,根据state的变化,渲染到视图上。
    • +
    +
    +
  4. +
  5. vue中组件之间的通信方式?

    +
    查看答案
      +
    • props ★★
        +
      • 父组件 A 通过 props 向子组件 B 传递值, B 组件传递 A 组件通过 $emit A 组件通过 v-on/@ 触发
      • +
      • 子组件通过 events 给父组件发送消息,实际上就是子组件把自己的数据发送到父组件。
      • +
      +
    • +
    • $emit/$on 事件总线 ★★ +
    • +
    • vuex ★★★
        +
      • 结合localStorage保存登录信息及权限列表等
      • +
      +
    • +
    • $parent/$children
    • +
    • $attrs/$listeners
        +
      • 多级组件嵌套需要传递数据时,通常使用的方法是通过vuex。但如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,未免有点大材小用。为此Vue2.4 版本提供了另一种方法。
      • +
      • $attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个 组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件。通常配合 interitAttrs 选项一起使用。
      • +
      • $listeners: 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v- on=”$listeners” 传入内部组件
      • +
      +
    • +
    • provide/inject ★★★
        +
      • 优点:使用简单 缺点:不是响应式
      • +
      • 父级:provide: { name: '王者峡谷' //这种绑定是不可响应的 }name: this会有响应式,把当前组件实例传递下去,但子组件会绑定一些多余的属性,比如props、methonds等)
      • +
      • 子级:inject: ['name'] }
      • +
      +
    • +
    +
    +
  6. +
  7. vue-router 中的导航钩子由那些?

    +
  8. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 什么是递归组件?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 说一说vue响应式理解?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. vue如果想要扩展某个组件现有组件时怎么做?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. vue为什么要求组件模版只能有一个根元素?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. watch和computed的区别以及怎么选用?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你知道nextTick的原理吗?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你知道vue双向数据绑定的原理吗?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 简单说一说vue生命周期的理解?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. vue.js的两大核心
    查看答案
      +
    • 数据驱动,也就是数据的双向绑定
    • +
    • 组件系统
        +
      • 模板(template):模板声明了数据和最终展现给用户的DOM之间的映射关系。
      • +
      • 初始数据(data):一个组件的初始数据状态。对于可复用的组件来说,这通常是私有的状态。
      • +
      • 接受的外部参数(props):组件之间通过参数来进行数据的传递和共享。
      • +
      • 方法(methods):对数据的改动操作一般都在组件的方法内进行。
      • +
      • 生命周期钩子函数(lifecycle hooks):一个组件会触发多个生命周期钩子函数,最新2.0版本对于生命周期函数名称改动很大。
      • +
      • 私有资源(assets):Vue.js当中将用户自定义的指令、过滤器、组件等统称为资源。一个组件可以声明自己的私有资源。私有资源只有该组件和它的子组件可以调用。
      • +
      +
    • +
    +
  2. +
  3. 什么是MVVM(操作数据,就是操作视图,就是操作DOM)
  4. +
  5. MVVM的优点:
    查看答案
      +
    • 分离视图(View) 和模型(Model) ,降低代码耦合,提高视图或者逻辑的重用性:比如视图(View) 可以独立于Model|变化和修改,-个ViewModel可以绑定不同的”View”上,当View变化的时候Model不可以不变,当Model|变化的时候View也可以不变。你可以把一些视图逻辑放在 -个ViewModel里面, 让很多view重用这段视图逻辑
    • +
    • 提高可测试性:ViewModel的存在可以帮助开发者更好地编写测试代码
    • +
    • 自动更新dom:利用双向绑定,数据更新后视图自动更新,让开发者从繁琐的手动dom中解放
    • +
    +
  6. +
  7. MVVM的缺点:
    查看答案
      +
    • Bug很难被调试:因为使用双向绑定的模式,当你看到界面异常了,有可能是你View的代码有Bug,也可能是Model的代码有问题。数据绑定使得一个位置的Bug被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。另外,数据绑定的声明是指令式地写在View的模版当中的,这些内容是没办法去打断点debug的
    • +
    • 一个大的模块中model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,不释放内存就造成了花费更多的内存
    • +
    • 对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高
    • +
    +
  8. +
  9. 你怎么理解vue中的diff算法?
    查看答案
      +
    • diff算法是虚拟DOM技术的必然产物:通过新旧虚拟DOM作对比(即diff),将变化的地方更新在真实DOM上;另外,也需要diff高效的执行对比过程,从而降低时间复杂度为0(n)。
    • +
    • vue 2.x中为了降低Watcher粒度,每个组件只有一个Watcher与之对应,只有引入diff才能精确找到发生变化的地方。
    • +
    • vue中diff执行的时刻是组件实例执行其更新函数时,它会比对上-次渲染结果oldVnode和新的渲染结果newVnode,此过程称为patch。
    • +
    • diff过程整体遵循深度优先、同层比较的策略;两个节点之间比较会根据它们是否拥有子节点或者文本节点做不同操作;比较两组子节点是算法的重点,首先假设头尾节点可能相同做4次比对尝试,如果没有找到相同节点才按照通用方式遍历查找,查找结束再按情况处理剩下的节点;借助key通常可以非常精确找到相同节点,因此整个patch过程非常高效。
    • +
    +
  10. +
  11. 谈一谈对vue组件化的理解?
    查看答案
      +
    • 组件是独立和可复用的代码组织单元。组件系统是Vue核心特性之一,它使开发者使用小型、独立和通常可复用的组件构建大型应用;
    • +
    • 组件化开发能大幅提高应用开发效率、测试性、复用性等;
    • +
    • 组件使用按分类有:页面组件、业务组件、通用组件;
    • +
    • vue的组件是基于配置的,我们通常编写的组件是组件配置而非组件,框架后续会生成其构造函数,它们基于VueComponent,扩展于Vue;
    • +
    • vue中常见组件化技术有:属性prop,自定义事件,插槽等,它们主要用于组件通信、扩展等;
    • +
    • 合理的划分组件,有助于提升应用性能;
    • +
    • 组件应该是高内聚、低耦合的;
    • +
    • 遵循单向数据流的原则。
    • +
    +
  12. +
  13. 谈一谈对vue设计原则的理解?
  14. +
  15. 谈谈你对MVC、MVP和MVVM的理解?
  16. +
  17. 你了解哪些Vue性能优化方法?
  18. +
  19. 什么叫发布订阅模式
  20. +
  21. 如何实现发布订阅模式
  22. +
  23. proxy和object.definepropoty的区别
  24. +
  25. proxy的应用场景
  26. +
  27. 你对虚拟dom和diff算法的理解,实现render函数
  28. +
  29. 绑定this的几种方式
  30. +
  31. setState是同步还是异步的
  32. +
+

双向绑定

    +
  1. 双向绑定的原理(差点让我手撸一个双向绑定)Object.defineProperty()Proxy
    查看答案
      +
    • Vue 采用数据劫持 结合 发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty(点我查看该属性)来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后进行相应的处理。
    • +
    • Observer:数据的观察者,让数据对象的读写操作都处于自己的监管之下。当初始化实例的时候,会递归遍历data,用Object.defineProperty来拦截数据(包含数组里的每个数据)。
    • +
    • Dep:数据更新的发布者,get数据的时候,收集订阅者,触发Watcher的依赖收集;set数据时发布更新,通知Watcher 。
    • +
    • Watcher:数据更新的订阅者,订阅的数据改变时执行相应的回调函数(更新视图或表达式的值)。
    • +
    • 图中红色的箭头表示的是收集依赖时获取数据的流程。Watcher会收集依赖的时候(这个时机可能是实例创建时, 解析模板、初始化watch、初始化computed,也可能是数据改变后,Watcher执行回调函数前),会获取数据的值,此时Observer会拦截数据 (即调用get函数),然后通知Dep可以收集订阅者啦。Dep将订阅数据的Watcher保存下来,便于后面通知更新。
    • +
    • 图中绿色的箭头表示的是数据改变时,发布更新的流程。当数据改变时,即设置数据时,此时Observer会拦截数据(即调用set函数),然后通知Dep,数据改变了,此时Dep通知Watcher,可以更新视图啦。
    • +
    +
  2. +
  3. vue2中对于数组的变化检测是重写数组方法:
    查看答案
      +
    • ‘push’
    • +
    • ‘pop’
    • +
    • ‘shift’
    • +
    • ‘unshift’
    • +
    • ‘splice’
    • +
    • ‘sort’
    • +
    • ‘reverse’
    • +
    +
  4. +
  5. 你知道vue中key的作用和工作原理吗?说说你对它的理解。
    查看答案
      +
    • 源码中找答案:src\core\vdom\patch.js - updateChildren()
    • +
    • key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中调用updateChildren(),利用patchVNode()方法,通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少DOM操作量提高性能。
    • +
    • 如果不适用key的时候,在执行patchVNode()之前会一直判断sameVNode()并返回true,因为不设置key的话标签的key会默认为undefined,此时undefined===undefined,所以会判断为同一个节点。
    • +
    • 另外,若不设置key还可能在列表更新时引发一些隐蔽的bug
    • +
    • vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。
    • +
    +
  6. +
  7. 你是如何理解Vue的响应式系统的?
    查看答案
      +
    • 任何一个Vue Component都有一个与之对应的Watcher实例。
    • +
    • Vue的data上的属性会被添加getter和setter属性。
    • +
    • 当Vue Component render函数被执行的时候,data. 上会被触碰(touch),即被读,getter方法会被调用,此时Vue会去记录此Vuecomponent所依赖的所有data。(这-过程被称为依赖收集)
    • +
    • data被改动时(主要是用户操作),即被写,setter方法会被调用,此时Vue会去通知所有依赖于此data的组件去调用他们的render函数进行更新。
    • +
    +
  8. +
  9. 既然Vue通过数据劫持可以精准探测数据变化,为什么还需要虛拟DOM进行diff检测差异?
    查看答案
      +
    • 考点: Vue的变化侦测原理
    • +
    • 前置知识:依赖收集、虚拟DOM、响应式系统
    • +
    • 现代前端框架有两种方式侦测变化,-种是pull-种是push
    • +
    • push: Vue的响应式系统则是push的代表当Vue程序初始化的时候就会对数据data进行依赖的收集,-但数据发生变化,响应式系统就会立刻得知,因此Vue是-开始就知道是「在哪发生变化了」,但是这又会产生一一个问题,如果你熟悉Vue的响应式系统就知道通常一个绑定-个数据就需要一个Watcher,-但我们的绑定细粒度过高就会产生大量的Watcher,这会带来内存以及依赖追踪的开销,而细粒度过低会无法精准侦测变化,因此Vue的设计是选择中等细粒度的方案,在组件级别进行push侦测的方式,也就是那套响应式系统,通常我们会第一时间侦测到发生变化的组件,然后在组件内部进行Virtual Dom Diff 获取更加具体的差异,而Virtual Dom Diff 则是pull操作,Vue是push+pull结合的方式进行变化侦测的.
    • +
    • pull:其代表为React,我们可以回忆一下React是如何侦测到变化的,我们通常会用setStateAPI显式更新,然后React会进行一层层的Virtual Dom Diff操作找出差异然后Patch到DOM上,React从一-开始就不知道到底是哪发生了变化,只是知道「有变化了」,然后再进行比较暴力的iff操作查找「哪发生变化了」,另外-个代表就是Angular的脏检查操作。
    • +
    +
    + +
  10. +
+

生命周期

    +
  1. 如何从零开始初始化vue项目
  2. +
  3. 生命周期是什么
    查看答案
      +
    • Vue实例有一个完整的生命周期,也就是从
    • +
    • 开始创建、初始化数据、编译模版、挂载Dom->渲染、更新-> 渲染、卸载等-系列过程,我们称这是Vue的生命周期。
    • +
    +
  4. +
  5. 简单说一说vue生命周期的理解?
    查看答案
      +
    • beforeCreate:在实例初始化之后,数据观测(data observe)和event/watcher事件配置之前被调用,这时无法访问data及props等数据;
    • +
    • created:在实例创建完成后被立即调用,此时实例已完成数据观测(data observer),属性和方法 的运算,watch/event事件回调,挂载阶段还没开始, $el 尚不可用。
    • +
    • beforemount:在挂载开始之前被调用,相关的render函数首次被调用。
    • +
    • mounted:实例被挂载后调用,这时el被新创建的vm. $el 替换,若根实例挂载到了文档上的元素上,当mounted被调用时vm.$el也在文档内。注意mounted不会保证所有子组件一起挂载。
    • +
    • beforeupdata:数据更新时调用,发生在虚拟dom打补丁前,这时适合在更新前访问现有dom,如手动移除已添加的事件监听器。
    • +
    • updated:在数据变更导致的虚拟dom重新渲染和打补丁后,调用该钩子。当这个钩子被调用时,组件dom已更新,可执行依赖于dom的操作。多数情况下应在此期间更改状态。 如需改变,最好使用watcher或计算属性取代。注意updated不会保证所有的子组件都能一起被重绘。
    • +
    • beforedestory:在实例销毁之前调用。在这时,实例仍可用。
    • +
    • destroyed:实例销毁后调用,这时vue实例的所有指令都被解绑,所有事件监听器被移除,所有子实 例也被销毁。
    • +
    • activated:(新增钩子)keep-alive 组件激活时调用。 类似 created 没有真正创建,只是激活
    • +
    • deactivated:(新增钩子)keep-alive 组件停用时调用。类似 destroyed 没有真正移除,只是禁用
    • +
    +
  6. +
  7. Vue.js的八大生命周期
  8. +
  9. Vue.js的父子组件生命周期调用顺序
  10. +
  11. Vue.js的ajax请求放在哪个生命周期中
  12. +
  13. 你知道nextTick的原理吗?
    查看答案
      +
    • (唯一能监听到DOM改动的API:MutationObserver,HTML5新增的属性,用于监听DOM修改事件,能够监听到节点的属性、文本内容、子节点等的改动,是一个功能强大的利器。)
    • +
    • 事件循环(Event Loop),浏览器
    • +
    • 任务队列(task queues)
    • +
    • 微任务队列(MicroTask_Queue),是做队列控制的最佳选择。每一次事件循环都包含一个microtask队列,在循环结束后会依次执行队列中的microtask并移除,然后再开始下一次事件循环。在执行microtask的过程中后加入microtask队列的微任务,也会在下一次事件循环之前被执行。也就是说,macrotask总要等到microtask都执行完后才能执行,microtask有着更高的优先级。
    • +
    • 常见的microtask有:Promise、MutationObserver、Object.observe(废弃),以及nodejs中的 process.nextTick.
    • +
    • vue的降级策略,队列控制的最佳选择是microtask,而microtask的最佳选择是Promise。但如果当前环境不支持Promise,vue就不得不降级为macrotask来做队列控制了。
    • +
    • 在vue2.5的源码中,macrotask降级的方案依次是:setImmediate、MessageChannel、setTimeout.
    • +
    +
    + +
  14. +
+

data

    +
  1. Vue组件data为什么必须是个函数而Vue的根实例则没有此限制?
    查看答案
      +
    • 源码中找答案:src\core\instance\state.js - initData()
    • +
    • Vue组件可能存在多个实例,如果使用对象形式定义data,则会导致它们共用一个data对象,那么状态变更将会影响所有组件实例,这是不合理的;采用函数形式定义,在initData时会将其作为工厂函数返回全新data对象,有效规避多实例之间状态污染问题。而在Vue根实例创建过程中则不存在该限制,也是因为根实例只能有一个,即单例存在,不需要担心这种情况。
    • +
    +
  2. +
  3. 如果改了data的多个值update钩子会执行几次,为什么
  4. +
+

computed && watch

    +
  1. Vue computed 的实现原理
  2. +
  3. Vue watch 的实现原理
  4. +
  5. computed和watch的区别和应用
  6. +
+

vuex

    +
  1. vuex是什么vuex的源码、底层(Vuex的注入代码比较简单,调用了一下applyMixin方法,现在的版本其实就是调用了Vue)、使用场景(组件通信、登录状态、加入购物车、公共码表维护、页面缓存(慎用))
  2. +
  3. mutation的用法
  4. +
+

vue-router

    +
  1. Vue-router 的实现原理
  2. +
  3. vue的两种路由模式,问我这两种路由模式的底层实现(昨天刚复习过 美滋滋)
  4. +
  5. vue-router中push和replace的区别
  6. +
  7. vueRouter的钩子函数
      +
    • 全局的路由钩子函数:beforeEach(全局前置守卫)、afterEach(全局后置守卫)
    • +
    • 路由配置文件独享的钩子函数:beforeEnter
    • +
    • 组件内的路由钩子函数:beforeRouteEnter、beforeRouteLeave、beforeRouteUpdate
    • +
    +
  8. +
  9. vue-router中的导航钩子由那些?
      +
    • 全局的路由钩子函数:beforeEach(全局前置守卫)、afterEach(全局后置守卫)
    • +
    • 路由配置文件独享的钩子函数:beforeEnter
    • +
    • 组件内的路由钩子函数:beforeRouteEnter、beforeRouteLeave、beforeRouteUpdate
    • +
    +
  10. +
  11. 如何(动态)控制路有权限,颗粒多大
  12. +
  13. vue项目实现路由按需加载(路由懒加载)的3种方式
      +
    • vue的异步组件技术:component: resolve => require(['@/components/home'],resolve)
    • +
    • es提案的import():const Home = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/home')。有时候我们想把某个路由下的所有组件都打包在同个异步块 (chunk) 中。只需要使用命名chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)。
    • +
    • webpack提供的require.ensure():r => require.ensure([], () => r(require('@/components/index')), 'demo')
    • +
    +
  14. +
  15. 完整的导航解析流程
      +
    • 导航被触发。
    • +
    • 在失活的组件里调用离开守卫。
    • +
    • 调用全局的 beforeEach 守卫。
    • +
    • 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
    • +
    • 在路由配置里调用 beforeEnter。
    • +
    • 解析异步路由组件。
    • +
    • 在被激活的组件里调用 beforeRouteEnter。
    • +
    • 调用全局的 beforeResolve 守卫 (2.5+)。
    • +
    • 导航被确认。
    • +
    • 调用全局的 afterEach 钩子。
    • +
    • 触发 DOM 更新。
    • +
    • 用创建好的实例调用 beforeRouteEnter - 守卫中传给 next 的回调函数。
    • +
    +
  16. +
+

组件通信

    +
  1. Vue.js组件如何通信以及有哪些方式?
  2. +
  3. vue中如何实现兄弟组件通信:
      +
    • EventBus(事件总线),即一个新的vue实例。
    • +
    • 使用方法:export const eventBuss = new Vue(),然后event.$emit()调用,created中使用event.$on()监听
    • +
    +
  4. +
  5. vue如果想要扩展某个组件现有组件时怎么做?
      +
    • mixin或者slots
    • +
    +
  6. +
  7. 什么是递归组件?
      +
    • 组件自身调用自身,但一定要有终止条件
    • +
    +
  8. +
+

directives

    +
  1. v-on事件修饰符及按键修饰符
      +
    • .stop:阻止事件冒泡
    • +
    • .self:当事件在该元素本身触发时才触发事件
    • +
    • .capture:添加事件侦听器是,使用事件捕获模式
    • +
    • .prevent:阻止默认事件
    • +
    • .once:事件只触发一次
    • +
    • 下面为,按键修饰符
    • +
    • @click.stop.prevent="btnClick":既阻止了默认事件,又阻止了事件冒泡
    • +
    • @keyup.enter.native="handleRegister"@keyup.13="submit":监听回车事件
    • +
    +
  2. +
  3. v-if和v-for哪个优先级更高?如果两个同时出现,应该怎么优化得到更好的性能?
      +
    • 源码中找答案compiler/codegen/index.js
    • +
    • 显然v-for优先于v-if被解析(把你是怎么知道的告诉面试官,比如打印渲染函数console.log(app.$options.render);或源码 else if 判断先v-for再v-if)
    • +
    • 如果同时出现,每次渲染都会先执行循环再判断条件,无论如何循环都不可避免,浪费了性能
    • +
    • 要避免出现这种情况,则在外层嵌套template,在这一层进行v-if判断,然后在内部进行v-for循环
    • +
    • 如果条件出现在循环内部,可通过计算属性提前过滤掉那些不需要显示的项
    • +
    +
  4. +
  5. vue自定义指令和私有指令
  6. +
  7. delete和Vue.delete(this.$delete)删除数组的区别
      +
    • var a=[1,2,3,4]
    • +
    • var b=[1,2,3,4]
    • +
    • delete a[1]
    • +
    • console.log(a) // [1,empty,2,3]
    • +
    • this.$delete(b,1)
    • +
    • console.log(b) // [1,3,4]
    • +
    +
  8. +
  9. v-model的作用和原理
  10. +
  11. v-show和v-if的区别,与dom操作是否相关
  12. +
  13. 如何取到子组件的实例,除了$ref还有无别的方法
  14. +
+

others

    +
  1. vue中css处scoped的实现原理及穿透的用法
  2. +
  3. video的层级(他的层级是最高的,问我怎么在video上添加一些div,我之前有看过aliplayer这个插件,面试官也很满意)
  4. +
  5. 30行写一个Vue图片懒加载指令
  6. +
+ + + + +

Vue 3.x

    +
  1. vue3.x的新特性研究
  2. +
+
    +
  • Emm…,慢慢看
  • +
+
    +
  1. 你对Vue3.0的新特性有没有了解?
  2. +
  3. vue2和vue3的特点和新特性
  4. +
  5. Proxy与Object.defineProperty的优劣对比?
      +
    • Proxy的优势如”下:
        +
      • Proxy可以直接监听对象而非属性
      • +
      • Proxy可以直接监 听数组的变化
      • +
      • Proxy有多达13种拦截方法,不限于apply、ownKeys、 deleteProperty、 has等 等是object . defineProperty不具备的
      • +
      • Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而object.defineProperty只能遍历对象属性直接修改
      • +
      • Proxy作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利
      • +
      +
    • +
    • Object.defineProperty的优势如”下:
        +
      • 兼容性好,支持IE9 + + +
      • +
      +
    • +
    +
  6. +
+ +

Webpack

    +
  • webpack基础配置
      +
    • context:基础目录,绝对路径,用于从配置中解析入口起点(entry point)和 loader
    • +
    • entry:起点或是应用程序的起点入口。从这个起点开始,应用程序启动执行。如果传递一个数组,那么数组的每一项都会执行。
    • +
    • output:位于对象最顶级键(key),包括了一组选项,指示webpack如何去输出、以及在哪里输出你的「bundle、asset和其他你所打包或使用webpack载入的任何内容」。比如path: config.build.assetsRoot
    • +
    • resolve:extensions: [‘.js’, ‘.vue’, ‘.json’],自动解析确定的扩展。
    • +
    • 模式(mode):告知 webpack 使用相应模式的内置优化。development、production
    • +
    +
  • +
  • webpack的工作原理和流程
      +
    • Webpack CLI 启动打包流程;
    • +
    • 载入 Webpack 核心模块,创建 Compiler 对象;
    • +
    • 使用 Compiler 对象开始编译整个项目;
    • +
    • 从入口文件开始,解析模块依赖,形成依赖关系树;
    • +
    • 递归依赖树,将每个模块交给对应的 Loader 处理;
    • +
    • 合并 Loader 处理完的结果,将打包结果输出到 dist 目录。
    • +
    +
  • +
  • webpack的构建流程
      +
    • 初始化参数:从配置文件和Shell语句中读取与合并参数,得出最终的参数。
    • +
    • 开始编译:用上一步得到的参数初始化Compiler对象,加载所有配置的插件,执行对象的run方法开始编译整个项目。
    • +
    • 确定入口:根据配置中的entry找出所有的入口文件。
    • +
    • 编译模块:从入口文件出发,调用所有配置的Loader对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。
    • +
    • 完成模块编译:在经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系树
    • +
    • 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的Chunk,再把每个Chunk转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会。
    • +
    • 输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统即dist目录。
    • +
    +
  • +
  • webpack基础知识
  • +
  • wepack中loader和plugin的区别
      +
    • 功能作用的角度区分:
        +
      • loader:直译为“加载器”,用于加载某些非js资源文件。这让webpack有了加载和解析非js文件的能力。因为webpack本身只能打包commonjs规范的js文件,对于其他资源例如css,图片,或者其他的语法集,比如jsx,coffee,是没有办法加载的。这就需要对应的loader将资源转化,加载进来。从字面意思,也能看出,loader是用于加载的,它作用于一个个文件上。
      • +
      • plugin:直译为“插件”,用于扩展webpack的功能。它直接作用于webpack,扩展了它的功能。在webpack的运行生命周期中会广播许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的api改变输出结果。
      • +
      +
    • +
    • 运行时机的角度区分:
        +
      • loader:运行在打包文件之前(loader为在模块加载时的预处理文件)
      • +
      • plugins:在整个编译周期都起作用。
      • +
      +
    • +
    • 配置方法的角度区分:
        +
      • loader:在module.rules中配置,也就是说他作为模块的解析规则存在。类型为数组,每一项都是一个object,里面描述了对于什么类型的文件(test),使用了什么加载(loader)和参数(options)
      • +
      • plugins:在plugins中单独配置。类型为数组,每一项都是一个plugin的实例,参数他通过构造函数传入。
      • +
      +
    • +
    +
  • +
  • 常见的、用过的loader
      +
    • 文件:file-loader将文件发送到输出文件夹,并返回(相对)URL,png|jpg|gif、svg、mp4
    • +
    • JSON:json-loader加载 JSON 文件(默认包含)
    • +
    • 转换编译(Transpiling):script-loader在全局上下文中执行一次 JavaScript 文件(如在 script 标签),不需要解析
    • +
    • 转换编译(Transpiling):babel-loader加载 ES2015+ 代码,然后使用 Babel 转译为 ES5
    • +
    • 模板(Templating):html-loader导出 HTML 为字符串,需要引用静态资源
    • +
    • 样式:css-loader解析 CSS 文件后,使用 import 加载,并且返回 CSS 代码
    • +
    • 样式:style-loader将模块的导出作为样式添加到 DOM 中
    • +
    • 样式:less-loader加载和转译 LESS 文件
    • +
    • 样式:sass-loader加载和转译 SASS/SCSS 文件
    • +
    • 清理和测试(Linting && Testing):eslint-loader,PreLoader,使用 ESLint 清理代码
    • +
    • 框架(Frameworks):vue-loader加载和转译 Vue 组件
    • +
    +
  • +
  • 常见的、用过的plugin
      +
    • DefinePlugin允许创建一个在编译时可以配置的全局常量(’process.env’: require(‘../config/dev.env’))
    • +
    • WebpackBar显示打包/启动可视化进度条
    • +
    • mini-css-extract-plugin是可以提取CSS到单独的文件中
    • +
    • HtmlWebpackPlugin简化了HTML文件的创建
    • +
    • webpack.HotModuleReplacementPlugin()启用热替换模块插件
    • +
    • CopyWebpackPlugin将单个文件或整个目录复制到生成目录(from:path.resolve(__dirname, ‘../static’),to:config.build.assetsSubDirectory,ignore: [‘.*’])
    • +
    +
  • +
  • 谈谈你对webpack的看法
      +
    • WebPack 是一个模块打包工具,你可以使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的HTML、JavaScript、CSS以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,webpack有对应的模块加载器。webpack模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源。
    • +
    +
  • +
  • webpack的两大特色:
      +
    • code splitting(代码拆分)按需加载
    • +
    • ==loader==:可以处理各种类型的静态文件,并且支持串联操作
    • +
    +
  • +
  • webpack是以commonJS的形式来书写脚本滴,但对AMD/CMD的支持也很全面,方便旧项目进行代码迁移。
  • +
  • webpack具有requireJs和browserify的功能,但仍有很多自己的新特性:
      +
    • 对CommonJS、AMD、ES6的语法做了兼容
    • +
    • 对js、css、图片等资源文件都支持打包
    • +
    • 串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对CoffeeScript、ES6的支持
    • +
    • 有独立的配置文件webpack.config.js
    • +
    • 可以将代码切割成不同的chunk,实现按需加载,降低了初始化时间
    • +
    • 支持SourceUrls和SourceMaps,易于调试
    • +
    • 具有强大的Plugin接口,大多是内部插件,使用起来比较灵活
    • +
    • webpack 使用异步 IO 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快
    • +
    +
  • +
  • webpack、vint、lua
  • +
  • Vue首屏加载慢的优化方案
      +
    • vendor.js过大问题解决
        +
      • 在index.html中使用CDN的资源
      • +
      • 在bulid/webpack.base.conf.js文件中添加externals
      • +
      • 在main.js里将以下import注释替换require引入模块
      • +
      +
    • +
    • vue-cli开启打包压缩和后台配合gzip访问
        +
      • npm install –save-dev compression-webpack-plugin@1.1.11
      • +
      • 打开 config/index.js ,找到 build 对象中的 productionGzip ,改成 true
      • +
      • 此时打包的文件会 新增 .gz 文件
      • +
      • 后台nginx开启gzip模式访问(gzip on;),浏览器访问项目,自动会找到 .gz 的文件
      • +
      +
    • +
    +
  • +
  • 如何用webpack来优化前端性能?(用webpack优化前端性能是指优化webpack的输出结果,让打包的最终结果在浏览器运行快速高效。)
      +
    • 压缩代码:删除多余的代码、注释、简化代码的写法等等方式。可以利用webpack的uglifyJsPlugin和ParalleluglifyPlugin来压缩JS文件,利用cssnano (css-loader?minimize) 来压缩css,利用 babel-plugin-transform-remove-console删掉console代码
    • +
    • 利用CDN加速:在构建过程中,将引用的静态资源路径修改为CDN.上对应的路径。可以利用webpack对于output参数和各loader的publicPath 参数来修改资源路径
    • +
    • Tree Shaking:将代码中永远不会走到的片段删除掉。可以通过在启动webpack时追加参数–optimize-minimize来实现
    • +
    • Code Splitting:将代码按路由维度或者组件分块(chunk),这样做到按需加载,同时可以充分利用浏览器缓存
    • +
    • 提取公共第三方库:SplitChunksPlugin插件来进行公共模块抽取,利用浏览器缓存可以长期缓存这些无需频繁变动的公共代码
    • +
    +
  • +
  • 如何提高webpack的打包速度?
      +
    • happypack:利用进程并行编译loader,利用缓存来使得rebuild更快,遗憾的是作者表示已经不会继续开发此项目,类似的替代者是thread-loader
    • +
    • 外部扩展(externals):将不怎么需要更新的第三方库脱离webpack打包,不被打入bundle中,从而减少打包时间,比如jQuery用script标签引入
    • +
    • dll:采用webpack的DIIPlugin和DIlReferencePlugin引入dll,让-些基本不会改动的代码先打包成静态资源,避免反复编译浪费时间
    • +
    • 利用缓存:webpack.cache、babel-loader.cacheDirectory、HappyPack.cache都可以利用缓存提高rebuild效率
    • +
    • 缩小文件搜索范围:比如babel-loader插件,如果你的文件仅存在于src中,那么可以include: path.resolve(_dirname,’sre’),当然绝大多数情况下这种操作的提升有限,除非不小心build了node-modules文件
    • +
    +
  • +
  • 如何提高webpack的构建速度?
      +
    • 多入口情况下,使用CommonsChunkPlugin来提取公共代码
    • +
    • 通过externals配置来提取常用库
    • +
    • 利用D1IPlugin和Dl1ReferencePlugin预编译资源模块通过D11Plugin来对那些我们引用但是绝对不会修改的npm包来进行预编译,再通过DllReferencePlugin将预编译的模块加载进来。
    • +
    • 使用Happypack实现多线程加速编译
    • +
    • 使用webpack-uglify-parallel来提升uglifyPlugin的压缩速度。原理上webpack-uglify-parallel采用了多核并行压缩来提升压缩速度
    • +
    • 使用Tree-shaking和ScopeHoisting来剔除多余代码
    • +
    +
  • +
  • 怎么配置多页应用?
      +
    • 可以使用webpack的AutowebPlugin来完成简单自动化的构建,但是前提是项目的目录结构必须遵守他预设的规范。要注意的是:
        +
      • 每个页面都有公共的代码,可以将这些代码抽离出来,避免重复的加载。比如,每个页面都引用了同一套css样式表
      • +
      • 随着业务的不断扩展,页面可能会不断的追加,所以一定要让入口的配置足够灵活,避免每次添加新页面还需要修改构建配置
      • +
      +
    • +
    +
  • +
+ + + + +

HTTP(S)

    +
  • HTTP2相对于HTTP1.x有什么优势和特点?
      +
    • 二进制分帧:HTTP/2采用二进制格式传输数据,而非HTTP 1.x的文本格式,二进制协议解析起来更高效。
        +
      • 帧: HTTP/2 数据通信的最小单位消息:指HTTP/2中逻辑上的HTTP消息。例如请求和响应等,消息由一个或多个帧组成。
      • +
      • 流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID
      • +
      +
    • +
    • 头部压缩:HTTP2使用“首部表”,只发送差异数据,而不是全部发送,从而减少头部的信息量。
        +
      • HTTP/1.x会在请求和响应中中重复地携带不常改变的、冗长的头部数据,给网络带来额外的负担。
      • +
      • HTTP/2在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送
      • +
      • 首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新
      • +
      • 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。
      • +
      +
    • +
    +
  • +
  • http的几个状态码,比如:304、200、500、502、504等
      +
    • 2XX成功
        +
      • 200 OK,表示从客户端发来的请求在服务器端被正确处理
      • +
      • 201 Created请求已经被实现,而且有-个新的资源已经依据请求的需要而建立
      • +
      • 202 Accepted请求已接受,但是还没执行,不保证完成请求
      • +
      • 204 No content,表示请求成功,但响应报文不含实体的主体部分
      • +
      • 206 Partial Content, 进行范围请求
      • +
      +
    • +
    • 3XX重定向
        +
      • 301 moved permanently,永久性重定向,表示资源已被分配了新的URL
      • +
      • 302 found, 临时性重定向,表示资源临时被分配了新的URL(302是http1.0的协议状态码,在http1.1版本的时候为 了细化302状态码又出来了两个303和307)
      • +
      • 303 see other, 表示资源存在着另一个URL,应使用GET方法J香获取资源(303明确表示客户端应当采用get方法获取资源,他会把POST请求变为GET请求进行重定向)
      • +
      • 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
      • +
      • 307 temporary redirect,临时重定向,和302含义相同(307会遵照浏览器标准,不会从post变为get)
      • +
      +
    • +
    • 4XX客户端错误
        +
      • 400 bad request,请求报文存在语法错误
      • +
      • 401 unauthorized,表示发送的请求需要有通过HTTP认证的认证信息
      • +
      • 403 forbidden,表示对请求资源的访问被服务器拒绝
      • +
      • 404 not found,表示在服务器.上没有找到请求的资源
      • +
      • 408 Request timeout,客户端请求超时
      • +
      • 409 Confict,请求的资源可能引起冲突
      • +
      +
    • +
    • 5XX服务器错误
        +
      • 500 internal sever error,表示服务器端在执行请求时发生了错误
      • +
      • 501 Not Implemented请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务
        器不支持的某个方法
      • +
      • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
      • +
      • 505 http version not supported服务器不支持,或者拒绝支持在请求中使用的HTTP版本
      • +
      +
    • +
    +
  • +
  • 关于HTTP协议,一篇就够了
  • +
  • 浏览器缓存机制 +
  • +
  • http的状态码200(强缓存)和304(协商缓存)有什么区别
      +
    • 强缓存:直接从本地副本比对读取,不去请求服务器,返回的状态码是200。主要包括expirescache-control
    • +
    • 协商缓存:去服务器比对,若没改变才直接读取本地缓存,返回的状态码是304。主要包括last-modifiedEtag
    • +
    +
  • +
  • 从输入URL到页面展现中间发生了什么
      +
    • 域名解析 -> TCP连接(3次握手)-> 建立连接 -> HTTP请求 -> 后台处理请求 -> HTTP响应 -> 关闭连接 (4次挥手)-> 解析HTML -> 渲染
    • +
    +
  • +
  • 图解tcp三次握手四次挥手
      +
    • 可以四次握手(确认报文段可以拆开发送,可以先发一个确认报文段:ack=x+1,ACK=1,再发送一个同步报文段:SYN=1,seq=y),但不能两次握手
    • +
    • 可以三次挥手(如果服务器收到FIN的时候,也正要关闭连接,就可以将FIN 和ACK一起发送过去)
    • +
    +
  • +
  • TCP传输的三次握手
      +
    • 第一次:SYN=1(请求连接),seq=x(传输数据流序号)
    • +
    • 第二次:SYN=1(接受连接),ack=x+1(ack=seq+1)(确认接受数据流),ACK=1(确认序号),seq=y(传输响应数据序号)
    • +
    • 第三次:ack=y+1,ACK=1(确认序号),seq=x+1(因为第一次是x)。没有SYN,因为SYN这个标志位只有TCP建立连接时才被置为1。
    • +
    +
  • +
  • TCP传输的四次挥手
      +
    • 第一次,FIN=1,seq=i,表示主动断开连接请求
    • +
    • 第二次,ack=i+1,ACK=1,seq=j,表示确认收到信息,同时可能存在服务器没有将数据全部传输完成
    • +
    • 第三次,FIN=1,ack=j+1,ACK=1,seq=k,表示可以(被动)关闭连接,同时可能发送数据
    • +
    • 第四次,ack=k+1,ACK=1,表示确认收到信息,断开连接。
    • +
    +
  • +
  • TCP和UDP的区别
      +
    • TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议
    • +
    • UDP(User Data Protocol,用户数据报协议)是面向非连接的协议
    • +
    +
  • +
  • HTTP和TCP协议是什么关系?
      +
    • 从OSI开放系统互连参考模型(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)看
    • +
    • TCP属于运输层的协议,主要解决数据如何在网络中传输,负责提供应用进程之间的通信
    • +
    • HTTP属于应用层上的一种协议,主要解决如何包装数据,是上层的协议,需要下层TCP的支持
    • +
    +
  • +
  • HTTPS为什么比较安全(这个关联性不是很大)
      +
    • HTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL。包含:证书、卸载、流量转发、负载均衡、页面适配、浏览器适配、refer传递等),这个时候就成了我们常说的HTTPS。
    • +
    +
  • +
  • 创建ajax过程
      +
    • 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
    • +
    • 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
    • +
    • 设置响应HTTP请求状态变化的函数.
    • +
    • 发送HTTP请求.
    • +
    • 获取异步调用返回的数据.
    • +
    • 使用JavaScript和DOM实现局部刷新.
    • +
    +
  • +
  • 如果一条请求返回了跨域提醒,服务器是否已经接收到(是,否则无法返回相应)
  • +
+ + + + +

浏览器

    +
  • 图解浏览器的基本工作原理
      +
    • Browser Process(浏览器主进程):负责包括地址栏,书签栏,前进后退按钮等部分的工作;负责处理浏览器的一些不可见的底层操作,比如网络请求和文件访问
    • +
    • Renderer Process:负责一个 tab 内关于网页呈现的所有事情
    • +
    • Plugin Process:负责控制一个网页用到的所有插件,如 flash
    • +
    • GPU Process:负责处理 GPU 相关的任务
    • +
    +
  • +
  • 线程和进程的区别
  • +
  • 浅读V8——强大的JavaScript引擎
      +
    • V8的大致流程:JavaScript源代码 -> 抽象语法树(AST)-> 本地代码
    • +
    • JavaScriptCore:JavaScript源代码 -> 抽象语法树(AST)-> 字节码-> 本地代码
    • +
    +
  • +
  • cookie是干嘛的?有什么用?session又是什么?
  • +
  • 浏览器的缓存机制如何实现的
  • +
  • 怎么查看某个缓存的到期时间及大小
  • +
  • 如何控制开关浏览器缓存
  • +
  • 如何实现跨浏览器保存登录状态
  • +
  • 浏览器自带多少进程
  • +
  • 浏览器自带多少线程
  • +
+ + + + +

WebSocket

    +
  • WebSocket协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。是Web应用程序的传输协议,它提供了双向的,按序到达的数据流。他是一个Html5协议,WebSocket的连接是持久的,他通过在客户端和服务器之间保持双工连接,服务器的更新可以被及时推送给客户端,而不需要客户端以一定时间间隔去轮询。
  • +
  • websocket(stomp.js+socket.js)
  • +
+ + + + +

安全

    +
  • 常见web安全及防护原理
      +
    • sql注入原理:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
        +
      • 1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双”-“进行转换等。
      • +
      • 2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
      • +
      • 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
      • +
      • 4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
      • +
      +
    • +
    • Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意 html标签或者javascript代码。
    • +
    • XSS防范方法:
        +
      • 尽量采用POST而非GET提交表单
      • +
      • 避免直接在cookie中泄露用户隐私,例如email、密码等等
      • +
      • 通过使cookie和系统ip绑定来降低cookie泄露后的危险。这样攻击者得到的cookie没有实际价值,不可能拿来重放
      • +
      • 如果网站不需要再浏览器端对cookie进行操作,可以在Set-Cookie末尾加上HttpOnly来防止javascript 代码直接获取cookie
      • +
      +
    • +
    +
  • +
  • XSS与CSRF有什么区别吗?
      +
    • XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。
    • +
    • CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。(登录受信任网站A,并在本地生成Cookie;在不登出A的情况下,访问危险网站B。)
    • +
    +
  • +
  • CSRF的防御
      +
    • 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
    • +
    • 通过验证码的方法
    • +
    +
  • +
  • XSS和CSRF攻击原理浅谈
  • +
  • XSS与CSRF攻击的详解与区别
  • +
  • XSS攻击的解决办法:
      +
    • 网站的Cookie设置HttpOnly属性
    • +
    • html escape 转义
    • +
    • 后端永远不要相信前端的数据,服务端的输出检查。
    • +
    +
  • +
  • CSRF攻击的解决办法:
      +
    • Token 验证
    • +
    • Referer Check:根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该 HTTP 请求的来源地址。
    • +
    • 验证码
    • +
    • 尽量不要在页面的链接中暴露用户隐私信息。
    • +
    • 对于用户修改删除等操作最好都使用post 操作 。
    • +
    +
  • +
  • 如何解决xss攻击(慎用v-html、过滤bmp图片、我说了后端请求头加一个属性设置为true即可,具体什么属性我忘了,还有一种是字符串过滤,过滤script标签即可)
  • +
+ + + + +

TypeScript

    +
  • 有哪些操作符?Typeof 是干嘛的?
  • +
  • TS引入一个JS模块?
  • +
  • Declare 关键字是干嘛的?
  • +
  • 什么是类型保护,有什么用?如何触发类型保护?
  • +
  • Never 类型有什么用? + + + +
  • +
+ +

Git

    +
  • Git rebase 和 merge 的区别
  • +
  • docker实现原理及部署命令 + + +
  • +
+ +

实战

    +
  1. 编程:编译一下模板字符串
  2. +
  3. 编程:实现音频和动画的onStart和onEnd异步控制
  4. +
  5. 编程:手动实现new运算符
  6. +
  7. 编程:手动实现instanceof运算符
  8. +
  9. 编程:手写parseInt + + +
  10. +
+ +

前端思想

    +
  • 如何理解前端工程化
  • +
  • webpack做过哪些优化
  • +
  • 如何实现前端性能优化
  • +
  • 你觉得前端工程的价值体现在哪
      +
    • 为简化用户使用提供技术支持(交互部分)
    • +
    • 为多个浏览器兼容性提供支持
    • +
    • 为提高用户浏览速度(浏览器性能)提供支持
    • +
    • 为跨平台或者其他基于webkit或其他渲染引擎的应用提供支持
    • +
    • 为展示数据提供支持(数据接口)
    • +
    +
  • +
  • 谈谈性能优化问题
  • +
  • 渐进增强和优雅降级
      +
    • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
    • +
    • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
    • +
    +
  • +
  • 前端的可视化库:ECharts、AntV + + +
  • +
+ +

全栈

    +
  • 一个Web应用是怎样运作的,如何优化 + + +
  • +
+ +

小程序

    +
  • 小程序里面存在域的概念吗
  • +
  • 小程序时候踩过哪些坑 + + +
  • +
+ +

Django

+ +

Sql

+ +

数据结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性\结构数组链表
元素个数固定按需增减
存储单元定义时分配,要连续程序执行时动态向系统申请,无需连续
元素顺序由位置(下标)确定由指针指向确定
元素增减会频繁移动元素改变指针指向即可
查找效率随机读取效率很高不可随机访问,只能按序
扩展性能空间不够时要重新定义数组链表大小不用定义,数据随意增删
+ + + + +

算法

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性
==冒泡排序==O(n^2^)O(n)O(n^2^)O(1)In-Place稳定
选择排序O(n^2^)O(n^2^)O(n^2^)O(1)In-Place不稳定
插入排序O(n^2^)O(n)O(n^2^)O(1)In-Place稳定
希尔排序O(n log n)O(n log^2^ n)O(n log^2^ n)O(1)In-Place不稳定
归并排序O(n log n)O(n log n)O(n log n)O(n)Out-Place稳定
==快速排序==O(n log n)O(n log n)O(n^2^)O(log n)In-Place不稳定
堆排序O(n log n)O(n log n)O(n log n)O(1)In-Place不稳定
计数排序O(n + k)O(n + k)O(n + k)O(k)Out-Place稳定
桶排序O(n + k)O(n + k)O(n^2^)O(n + k)Out-Place稳定
基数排序O(n * k)O(n * k)O(n * k)O(n + k)Out-Place稳定
+

冒泡排序(Bubble Sort)

    +
  • 时间复杂度:O(n^2^), 最好O(n),最坏O(n^2^)
  • +
  • 空间复杂度:O(1)
  • +
  • 实现思路:
      +
    • 比较相邻的元素。如果第一个比第二个大, 就交换他们两个。
    • +
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    • +
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • +
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    • +
    +
  • +
+
1
2
3
4
5
6
7
8
9
10
function bubbleSort(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
[arr[j - 1], arr[j]] = [arr[j], arr[j - 1]] // 交换操作
}
}
}
return arr
}
+ +
    +
  • 改进1:设置-标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function bubbleSort2(arr) {
var i = arr.length - 1 // 初始化,最后的交换位置,保持不变
while (i > 0) {
var pos = 0 // 每趟开始时,无记录交换
for (var j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
pos = j // 记录交换的位置
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]] // 交换操作
}
}
i = pos // 为下一趟排序做准备
}
return arr
}
+ +
    +
  • 改进2:传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法,一次可以得到两个最终值(最大者和最小者),从而使排序趟数几乎减少了一半。
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function bubbleSort3(arr) {
var low = 0
var high = arr.length - 1 // 设置变量初始值
var tmp, j
while (low < high) {
for (j = low; j < high; ++j) { // 正向冒泡,找到最大值
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]] // 交换操作
}
}
--high // 前移一位
for (j = high; j >low; --j) { // 反向冒泡,找到最小值
if (arr[j]<arr[j-1]) {
[arr[j - 1], arr[j]] = [arr[j], arr[j - 1]] // 交换操作
}
}
++low; // 后移一位
}
return arr
}
+ +

快速排序(Quick Sort)

    +
  • 时间复杂度:O(n log ^n^),最好O(n log ^n^),最坏O(n^2^)
  • +
  • 空间复杂度:O(log ^n^)
  • +
  • 实现思路
      +
    • 基准。从数组中选择中间一项作为基准pivot
    • +
    • 划分。创建两个指针,左边一个指向数组的第一项,右边指向数组最后一项。移动左指针直到我们找到一个比基准大的元素,接着,移动右指针直到找到一个比基准小的元素。然后交换它们,重复这个过程,直到左指针超过了右指针。这个过程是的比基准小的值都排在了基准之前,而比基准大的值都排在了基准之后,这一步叫划分操作
    • +
    • 递归。算法对划分的小数组(较基准小的值组成的子数组,以及较基准大的值组成的子数组)重复之前的两个步骤,直至数组以完全排序。
    • +
    +
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const quickSort = (function() { // 立即执行函数
// 默认状态下的比较函数
function compare(a, b) {
if (a === b) {
return 0
}
return a < b ? -1 : 1
}

// 交换操作
function swap(array, a, b) {
[array[a], array[b]] = [array[b], array[a]]
}

// 分治函数
function partition(array, left, right) {
// 用index取中间值,而非splice
const pivot = array[Math.floor((right + left) / 2)]
let i = left
let j = right
while (i <= j) {
while (compare(array[i], pivot) === -1) { // arr[i] < pivot
i++
}
while (compare(array[j], pivot) === 1) { // arr[j] >= pivot
j--
}
if (i <= j) {
swap(array, i, j)
i++
j--
}
}
return i
}

// 快速排序主函数
function quick(array, left, right) {
let index
if (array.length > 1) {
index = partition(array, left, right)
if (left < index - 1) {
quick(array, left, index - 1)
}
if (index < right) {
quick(array, index, right)
}
}
return array
}

// 调用主函数
return function quickSort(array) {
return quick(array, 0, array.length - 1)
}

})()
+ +
    +
  • 阮一峰的思路:
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const quickSort = function(arr) {
if (arr.length <= 1) {
return arr
}
var pivotIndex = Math.floor(arr.length / 2)
var pivot = arr.slice(pivotIndex, 1)[0]
var left = []
var right = []
for (let i = 0; i <= arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat([pivot], quickSort(right))
}
+ +
    +
  • 6种二分查找及其变式总结及牢记方法
  • +
  • 实现思路:
      +
    • 折半查找算法要求查找表的数据是线性结构存储,还要求查找表中的顺序是由小到大排序(由大到小排序)
    • +
    • 首先设两个指针,left和right, 表示最低索引和最高索引
    • +
    • 然后取中间位置索引mid,判断mid处的值是否与所要查找的数相同,相同则结束查找,mid处的值比所要查找的值小就把left设为mid+1,如果mid处的值比所要查找的值大就把right设为mid-1
    • +
    • 然后再新区间继续查到,直到找到或者left>right找不到所要查找的值结束查找
    • +
    +
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var binarySearch = function (arr, i) {
var left = 0
var right = arr.length - 1
while (left <= right) {
var mid = Math.floor((left + right) / 2)
if (i < arr[mid]) {
right = mid - 1
} else if (i > arr[mid]) {
left = mid + 1
} else if (i === arr[mid]) {
return mid
}
}
return false
}
+ +

深度优先遍历(DFS)

    +
  • 深度优先遍历(DFS)和广度优先遍历(BFS)
  • +
  • 实现思路:
      +
    • 从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续找它的下一个顶点进行访问
    • +
    • 重复此步骤,直至所有结点都被访问完为止
    • +
    +
  • +
+
DFS 递归写法
1
2
3
4
5
6
7
8
9
10
11
12
function deepTraversal(node, nodeList) {
if (node) {
nodeList.push(node)
var children = node.children
for (var i = 0; i < children.length; i++) {
deepTraversal(children[i], nodeList)
}
}
return nodeList
}
var root = document.getElementById('root')
console.log(deepTraversal(root,nodeList=[]))
+ +
DFS 非递归写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function deepTraversal(node) {
var nodeList = []
if (node) {
var stack = []
stack.push(node)
while (stack.length != 0) {
var childrenItem = stack.pop()
nodeList.push(childrenItem)
var childrenList = childrenItem.children
for (var i = childrenList.length - 1; i >= 0; i--) {
stack.push(childrenList[i])
}
}
}
return nodeList
}
var root = document.getElementById('root')
console.log(deepTraversal(root))
+ +

广度优先遍历(BFS)

    +
  • 深度优先遍历(DFS)和广度优先遍历(BFS)
  • +
  • 实现思路:
      +
    • 从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点所有未被访问的邻结点,访问完后再访问这些结点中第一个邻结点的所有结点
    • +
    • 重复此方法,直到所有结点都被访问完为止
    • +
    +
  • +
+
BFS 非递归写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function wideTraversal(node) {
var nodes = []
if (node != null) {
var queue = []
queue.unshift(node)
while (queue.length != 0) {
var item = queue.shift()
nodes.push(item)
var children = item.children
for (var i = 0; i < children.length; i++) {
queue.push(children[i])
}
}
}
return nodes
}
var root = document.getElementById('root')
console.log(wideTraversal(root))
+ + + + +

未分类试题

    +
  • 前端和后端的区别
  • +
  • http和http2.0
  • +
  • http和https
  • +
  • 如果要把http升级成https应该怎么做
  • +
  • get和post的区别
  • +
  • 浏览器缓存机制
  • +
  • 浏览器缓存存放位置
  • +
  • 浏览器从输入url到页面生成结果哪些步骤
  • +
  • tcp三次连接
  • +
  • 进程和线程
  • +
  • bfc是什么,解决哪些问题
  • +
  • ajax的原理和缺点
  • +
  • typeof和instanceof的区别
  • +
  • 有几种方式判断Array类型
  • +
  • 函数深拷贝和浅拷贝的区别,怎么实现深拷贝
  • +
  • js垃圾回收机制
  • +
  • 事件循环
  • +
  • 事件冒泡
  • +
  • 阻止事件冒泡的方式,ie是什么方式
  • +
  • this的情况
  • +
  • js的继承方式,有什么缺点
  • +
  • new做了什么事情
  • +
  • node线程池
  • +
  • node有哪些模块
  • +
  • node的事件循环和浏览器的有什么区别
  • +
  • node应该怎么读取2DB的数据
  • +
  • vue的双向绑定是怎么做到的
  • +
  • vue的diff算法是怎么样的
  • +
  • vue cil做了哪些事情,你会怎么设计
  • +
  • MVC,ajax, 布局,JQuery
  • +
  • “敏感信息”(密码、身份证之类的)的处理
  • +
  • 页面优化相关
  • +
  • px rem em
  • +
  • border-radius,完整写法几个值
  • +
  • 实现一个背景色,一半红一半白
  • +
  • 什么场景使用HTTP,什么场景使用HTTPS
  • +
  • web前端学习到了什么程度
  • +
  • MVVM和MVC的区别
  • +
  • Vue哪些对数组的操作不会导致页面变化
  • +
  • websocket原理
  • +
  • nocache和nostore的区别
  • +
  • 有没有做哪些自适应的页面布局(栅格,圣杯布局)
  • +
  • cookie和localstorage的区别
  • +
  • cookie可以取哪些值
  • +
  • xss是什么如何防范
  • +
  • csp了解吗
  • +
  • async await settimeout promise一堆放在一起的执行结果
  • +
  • 隐式类型转换
  • +
  • 写个css布局左右定宽中间自适应
  • +
  • 数组去掉(false,null, undefine)去重后从大到小排序
  • +
  • 给一个对象数组,是一个树的形式存储的城市代码,要求遍历找到id为x的节点输出城市名
  • +
  • css怎么实现水平垂直居中
  • +
  • css如何处理类名冲突的问题
  • +
  • plugin的原理
  • +
  • promise怎么实现
  • +
  • ip协议有哪些
  • +
  • f5随机生成0-5的随机数,如何构造f7
  • +
  • 一个桥有20个格子,出发点有无限多的米,一个人每前进一步需要吃十粒米,后退不需要,问如何能够走到桥对面
  • +
+ + + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/08/12/2020%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" "b/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" new file mode 100644 index 000000000..a031ede98 --- /dev/null +++ "b/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" @@ -0,0 +1,309 @@ +qiankun 2.0.24 爬坑记录 | 淳淳同学的个人博客 + + + + + + + + + + + + +

qiankun 2.0.24 爬坑记录

+

由于本次开发项目需要嵌入之前的老项目,由于考虑到iframe速度慢、css/js需要额外请求、阻塞页面加载、浏览器前进/后退等缺点,遂打算踩坑qiankun,为了更早的爬坑,整理此文。

+
+

简介

qiankun 是一个基于 single-spa微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

+

官方提供的资源:

+ +

根据 qiankun官方文档 介绍,主要有以下七大特性:

+
    +
  • 📦 基于 single-spa 封装,提供了更加开箱即用的 API。
  • +
  • 📱 技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架。
  • +
  • 💪 HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单。
  • +
  • 🛡​ 样式隔离,确保微应用之间样式互相不干扰。
  • +
  • 🧳 JS 沙箱,确保微应用之间 全局变量/事件 不冲突。
  • +
  • ⚡️ 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度。
  • +
  • 🔌 umi 插件,提供了 @umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统。
  • +
+

行业内其他前端团队对微前端的看法和实践:

+ +

API介绍

此处只介绍api的简单功能描述,如想继续了解请移步官方文档

+

registerMicroApps(apps, lifeCycles?)

注册微应用的基础配置信息。当浏览器 url 发生变化时,会自动检查每一个微应用注册的 activeRule 规则,符合规则的应用将会被自动激活。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { registerMicroApps } from 'qiankun';

registerMicroApps(
[
{
// name - string - 必选,微应用的名称,微应用之间必须确保唯一
name: 'apass-micro',
// entry - string - 必选,微应用的入口
entry: 'localhost:8080',
// container - string | HTMLElement - 必选,微应用的容器节点的选择器或者 Element 实例
container: '#apassMicroTemplateConfig',
// activeRule - string - 必选,微应用的激活规则
activeRule: '/index/config/template/edit',
// props - object - 可选,主应用需要传递给微应用的数据
props: {
name: 'kuitos',
routerPushFunc: (that) => {
that.$router.push('/713/5f4f65fabcb7c173/fields')
},
data: {
// 已响应式的数据通信
store: microAppStore.getGlobalState
},
}
}
],
{
beforeLoad: app => console.log('before load', app.name),
beforeMount: [
app => console.log('before mount', app.name),
],
afterMount: [
app => console.log('after mount', app.name),
],
beforeUnmoun: [
app => console.log('before unmount', app.name),
],
afterUnmount: [
app => console.log('after unmount', app.name),
]
},
);
+ +

start(opts?)

启动 qiankun

+
1
2
3
import { start } from 'qiankun';

start();
+ +

设置主应用启动后默认进入的微应用。

+
1
2
3
import { setDefaultMountApp } from 'qiankun';

setDefaultMountApp('/homeApp');
+ +

runAfterFirstMounted(effect)

第一个微应用 mount 后需要调用的方法,比如开启一些监控或者埋点脚本。

+
1
2
3
4
5
6
import { runAfterFirstMounted } from 'qiankun';

runAfterFirstMounted(() => {
console.log('第一个子应用加载完后,该方法被调用')
this.otherFunction()
})
+ +

loadMicroApp(app, configuration?)

适用于需要手动 加载/卸载 一个微应用的场景。

+

通常这种场景下微应用是一个不带路由的可独立运行的业务组件。 微应用不宜拆分过细,建议按照业务域来做拆分。业务关联紧密的功能单元应该做成一个微应用,反之关联不紧密的可以考虑拆分成多个微应用。 一个判断业务关联是否紧密的标准:看这个微应用与其他微应用是否有频繁的通信需求。如果有可能说明这两个微应用本身就是服务于同一个业务场景,合并成一个微应用可能会更合适。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { loadMicroApp } from 'qiankun';

// 因为loadMicroApp()返回子应用的实例,拿一个全局变量接收后续可进行其他操作如:手动卸载子应用
this.microApp = loadMicroApp(
{
name: 'sub-vue',
entry: 'http://localhost:7777/subapp/sub-vue',
container: '#apassMicroTemplateConfig',
props: {
routerBase: '/index/config/template/edit',
getGlobalState: microAppStore.getGlobalState,
sheetId: '2133123123'
}
},
{
// sandbox - boolean | { strictStyleIsolation?: boolean, experimentalStyleIsolation?: boolean } - 可选,是否开启沙箱,默认为 true
sandbox: { strictStyleIsolation: true },
// singular - boolean | ((app: RegistrableApp<any>) => Promise<boolean>); - 可选,是否为单实例场景,单实例指的是同一时间只会渲染一个微应用。默认为 false
singular: true
}
)

// 封装卸载子应用的函数
private unmountMicroApp () {
if (this.microApp) {
this.microApp.mountPromise.then(() => {
this.microApp.unmount()
})
}
}
+ +

prefetchApps(apps, importEntryOpts?)

手动预加载指定的微应用静态资源。仅手动加载微应用场景需要,基于路由自动激活场景直接配置 prefetch 属性即可。

+
1
2
3
import { prefetchApps } from 'qiankun';

prefetchApps([ { name: 'app1', entry: '//locahost:7001' }, { name: 'app2', entry: '//locahost:7002' } ])
+ + +

主应用配置

安装qiankun

1
$ npm i qiankun -S # 或者 yarn add qiankun
+ +

调整main.js

如果你需要在项目初始化的时候就加载这些子应用,那么需要修改main.js的一些配置;如果是在页面中手动加载可略过此步。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import Vue from "vue"
import App from "./App.vue"
import router from "./router"

import { registerMicroApps, setDefaultMountApp, start } from "qiankun"
Vue.config.productionTip = false
let app = null;
/**
* 渲染函数
* appContent 子应用html内容
* loading 子应用加载效果,可选
*/
function render({ appContent, loading } = {}) {
if (!app) {
app = new Vue({
el: "#container",
router,
data() {
return {
content: appContent,
loading
};
},
render(h) {
return h(App, {
props: {
content: this.content,
loading: this.loading
}
});
}
});
} else {
app.content = appContent;
app.loading = loading;
}
}

/**
* 路由监听
* @param {*} routerPrefix 前缀
*/
function genActiveRule(routerPrefix) {
return location => location.pathname.startsWith(routerPrefix);
}

function initApp() {
render({ appContent: '', loading: true });
}

initApp();

// 传入子应用的数据
let msg = {
data: {
auth: false
},
fns: [
{
name: "_LOGIN",
_LOGIN(data) {
console.log(`父应用返回信息${data}`);
}
}
]
};

// 注册子应用
registerMicroApps(
[
{
name: "sub-app-1",
entry: "//localhost:8091",
render,
activeRule: genActiveRule("/app1"),
props: msg
},
{
name: "sub-app-2",
entry: "//localhost:8092",
render,
activeRule: genActiveRule("/app2"),
}
],
{
beforeLoad: [
app => {
console.log("before load", app);
}
], // 挂载前回调
beforeMount: [
app => {
console.log("before mount", app);
}
], // 挂载后回调
afterUnmount: [
app => {
console.log("after unload", app);
}
] // 卸载后回调
}
);

// 设置默认子应用,与 genActiveRule中的参数保持一致
setDefaultMountApp("/app1");

// 启动
start();
+ +

修改App.vue中的id 或 增加渲染子应用的盒子

因为一个主应用可能会嵌套多个子应用,所以App.vue难免会重名,所以最好加一个自己项目名称的前缀来做区分。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template>
<div id="main-root">
<!-- loading -->
<div v-if="loading">loading</div>
<!-- 子应用盒子 -->
<div id="root-view" class="app-view-box" v-html="content"></div>
</div>
</template>

<script>
export default {
name: "App",
props: {
loading: Boolean,
content: String
}
};
</script>
+ + + +

配置vue子应用

因为子应用本身就是一个单独的应用,所以不必安装qiankun,只需要暴露被当做子应用嵌入时,qiankun所需的3个生命周期即可。

+

配置maim.js

在支持被当做子应用嵌入的同时,需要支持项目独立运行,兼容之前配置

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App.vue';
import routes from './router';
import './public-path';

Vue.config.productionTip = false;

let router = null;
let instance = null;

function render() {
router = new VueRouter({
base: window.__POWERED_BY_QIANKUN__ ? '/app1' : '/',
mode: 'history',
routes,
});

instance = new Vue({
router,
render: h => h(App),
beforeMount () {
if (window.__POWERED_BY_QIANKUN__) {
routerPushFunc(this)
AppModule.SET_CURRENT_ENV()
}
}
}).$mount(container ? container.querySelector('#templateConfig') : '#templateConfig');
}

if (!window.__POWERED_BY_QIANKUN__) {
render();
}

export async function bootstrap() {
console.log('vue app bootstraped');
}

export async function mount(props) {
console.log('props from main app', props);
render();
}

export async function unmount() {
(instance as Vue).$destroy();
(instance as Vue).$el.innerHTML = ''; // 防止内存泄漏,子项目销毁时清空dom
instance = null;
router = null;
}
+ +

public-path.js

使用 webpack 静态 publicPath 配置:可以通过两种方式设置,一种是直接在 mian.js 中引入 public-path.js 文件,一种是在开发环境直接修改 vue.config.js

+
1
2
3
4
if (window.__POWERED_BY_QIANKUN__) {
// eslint-disable-next-line no-undef
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}
+ +

配置 vue.config.js

子应用必须支持跨域:由于 qiankun 是通过 fetch 去获取子应用的引入的静态资源的,所以必须要求这些静态资源支持跨域

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const path = require('path');
const { name } = require('./package');

function resolve(dir) {
return path.join(__dirname, dir);
}

const pagesMicro = {
templateConfig: {
entry: 'src/microPage/templateConfig/main.ts',
template: 'src/microPage/templateConfig/index.html',
chunks: ['runtime~templateConfig', 'chunk-vendors', 'chunk-common', 'templateConfig']
},
}

const pagesMain = {
index: {
entry: 'src/main.ts',
template: '/index.html'
}
}

const pages = process.env.VUE_APP_ENTRY === 'main' ? pagesMain : pagesMicro

let config = {
/**
* You will need to set publicPath if you plan to deploy your site under a sub path,
* for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then publicPath should be set to "/bar/".
* In most cases please use '/' !!!
* Detail: https://cli.vuejs.org/config/#publicpath
*/
outputDir: 'dist',
assetsDir: 'static',
filenameHashing: true,
// tweak internal webpack configuration.
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
devServer: {
// host: '0.0.0.0',
hot: true,
disableHostCheck: true,
port,
overlay: {
warnings: false,
errors: true,
},
headers: {
'Access-Control-Allow-Origin': '*',
},
},
// 自定义webpack配置
configureWebpack: {
resolve: {
alias: {
'@': resolve('src'),
},
},
output: {
// 把子应用打包成 umd 库格式
library: `${name}-[name]`,
libraryTarget: 'umd',
jsonpFunction: `webpackJsonp_${name}`,
},
},
};

if (process.env.VUE_APP_ENTRY === 'micro') {
config.pages = pagesMicro
}

module.exports = config
+ + +

qiankun常见问题及解决方案

避免 css 污染

qiankun 只能解决子项目之间的样式相互污染,不能解决子项目的样式污染主项目的样式,技术与规范方面大约有这 5 种方案:

+
    +
  • vue自带的scope
      +
    • 只能解决一部分页面内的样式污染,但一般不会有这个问题
    • +
    +
  • +
  • BEM命名方式
  • +
  • css-in-js
      +
    • 学习曲线高;可读性差;借助前端堆栈消耗性能;
    • +
    +
  • +
  • css-loader
      +
    • 开启css-modules,类似于图片懒加载,替换attr
    • +
    • 缺点:页面中需要把class写成css-modules的形式;样式多了之后都是hash的形式可读性不高;
    • +
    +
  • +
  • postcss-loader
      +
    • 利用postcss-modules插件的getJson()函数将所有css文件中的class转为json对象;利用postcss-html把json对象渲染回html页面的class
    • +
    • 缺点:利用新的gulp,意义不大;每次修改都要编译,很慢;
    • +
    +
  • +
+

拿css-loader举例,开启css-modules,可参考以下文章:

+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module.exports = {
// ... 省略其他配置
css: {
// 是否使用css分离插件 ExtractTextPlugin
extract: false,
// 开启 CSS source maps?
sourceMap: false,
// css预设器配置项
loaderOptions: {
css: {
// These properties are valid:
// object { url?, import?, modules?, sourceMap?, importLoaders?, localsConvention?, onlyLocals?, esModule? }
modules: {
// These properties are valid:
// object { auto?, mode?, exportGlobals?, localIdentName?, localIdentRegExp?, context?, hashPrefix?, getLocalIdent? }
exportGlobals: true,
localIdentName: '[path][name]__[local]--[hash:base64:5]'
},
localsConvention: 'asIs' // asIs camelCase camelCaseOnly dashes dashesOnly
}
},
// 启用 CSS modules for all css / pre-processor files.
requireModuleExtension: true
},
}
+ +

谨慎使用 position:fixed

在子项目中这个定位会出现问题,基本出现在模态框和抽屉的定位上,应尽量避免使用,确有相对于浏览器窗口定位需求,可以用 position: sticky,但是会有兼容性问题(IE不支持)。如果定位使用的是 bottom 和 right,则问题不大。
还有个办法,位置可以写成动态绑定 style 的形式:

+
1
<div :style="{ top: isQiankun ? '10px' : '0'}">
+ +

给 body 、 document 等绑定的事件,请在 unmount 周期清除

js 沙箱只劫持了 window.addEventListener,使用 document.body.addEventListener 或者 document.body.onClick 添加的事件并不会被沙箱移除,会对其他的页面产生影响,请在 unmount 周期清除

+

报错:Uncaught Error application ‘xxx’ died in status LOADING_SOURCE_CODE: [qiankun] You need to export lifecycle functions in xxx entry

一般就是打包姿势不对,可能原因:未打包成umd格式;所需的js文件虽然被整体打包了但没被加载,需要利用runtimeChunk单独打包出来

+

现刷新页面报错,容器找不到

解决方案1:在组件 mounted 周期注册并启动 qiankun

+

解决方案2:new Vue() 之后,等 DOM 加载好了再注册并启动 qiankun

+
1
2
3
4
5
6
7
8
const vueApp = new Vue({
router,
store,
render: h => h(App)
}).$mount("#app");
vueApp.$nextTick(() => {
//在这里注册并启动 qiankun
})
+ +

主、子应用的路由,均可用 history 模式

因为vue-router的history模式是全匹配的,所以如果当前子应用是被qiankun嵌入时,需要在子应用的一级路由前加上主应用除了http://ip+port/后的所有路由,即在主应用中初始子应用是定义的activeRule

+
1
2
3
4
5
6
7
router = new VueRouter({
base: window.__POWERED_BY_QIANKUN__ ? '/templateConfig' : '/',
mode: 'history',
routes: [
{ ... }
]
})
+ +

history模式下,主、子应用的路由配置问题

如果主、子应用的vue-router都是history模式(即路由全匹配)时

+
    +
  • 主应用中的route信息的path属性需要改为’index/edit*’的形式,即模糊全匹配,而且子应用的跟路由需要改为’index/edit/‘的形式(上面说过了)。否则子应用改变路由后,主应用匹配不到当前页面,则会跳回登录页会调至404。
  • +
  • 子应用中的route信息里最好不要有’’或者’*’之类的判空。否则主应用(从嵌入子应用的那个页面)跳转到其他页面后,会触发子应用的路由匹配规则,进而跳转至子应用的登录页,而且导致主应用的路由跳转失败(也不能叫失败,实际上是跳转出去了又被redirect重定向回来了)。
  • +
+

从一个子项目跳转到另一个子项目

在子项目里面如何跳转到另一个子项目/主项目页面呢,直接写 或者用 router.push/router.replace 是不行的,原因是这个 router 是子项目的路由,所有的跳转都会基于子项目的 base 。写 链接可以跳转过去,但是会刷新页面,用户体验不好。

+

解决办法也比较简单,在子项目注册时将主项目的路由实例对象传过去,子项目挂载到全局,用父项目的这个 router 跳转就可以了。

+

但是有一丢丢不完美,这样只能通过 js 来跳转,跳转的链接无法使用浏览器自带的右键菜单

+

图片资源报错404

最好改为绝对路径

+
1
2
3
<img src="./img/logo.jpg">
<!-- 改为 -->
<img src="/img/logo.jpg">
+ +

或者在主应用中配置nginx静态文件的代理(这里没有后台的nginx配置,所以拿webpack自带的proxyTable代理作示例)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (item === '/index/config/template/edit/static') { // 登录页img
proxyObj[item] = {
target: 'http://localhost:8081',
ws: false,
changeOrigin: true,
pathRewrite: { '^/index/config/template/edit/static': '/static' }
}
} else if (item === '/static/home') { // 首页img
proxyObj[item] = {
target: 'http://localhost:8081',
ws: false,
changeOrigin: true,
pathRewrite: { '^/static/home': '/static/home' }
}
}
+ +

手动加载子应用时,如果子应用的js文件太大会造成阻塞

如果是手动加载子应用,即loadMicroApp(),推荐在页面初始化的时候就预加载资源,即prefetchApps()。避免请求的pending时间太长阻塞加载

+

ts项目与js项目文件加载的问题

因为主项目是ts,默认加载的是ts文件;但子项目是js。所以在子项目中引入js文件的时候要标清楚后缀名,例如

+
1
2
3
4
5
// 会报错  Unknown custom element: <widget> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
import {widgetInRecord as widget} from '@/views/sheetConfig/fieldConfig/widget/widget'

// 加上后缀名就不报错了
import {widgetInRecord as widget} from '@/views/sheetConfig/fieldConfig/widget/widget.js'
+ + +

在一个页面内以不同的初始化数据加载同一子应用(如:左侧是列表,右侧的详情是qiankun嵌入的子应用)

重复加载问题、数据通信问题、请求响应问题

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
```

## 主项目与子项目的数据通信

项目之间的不要有太多的数据依赖,毕竟项目还是要独立运行的。通信操作需要判断是否 qiankun 模式,做兼容处理。

通过 props 传递父项目的 Vuex ,如果子项目是 vue 技术栈,则会很好用。假如子项目是 jQuery/react/angular ,就不能很好的监听到数据的变化。

qiakun 提供了一个全局的 GlobalState 来共享数据。主项目初始化之后,子项目可以监听到这个数据的变化,也能提交这个数据。

```js
// 主项目初始化
import { initGlobalState } from 'qiankun';

const actions = initGlobalState(state);

// 主项目项目监听和修改
actions.onGlobalStateChange((state, prev) => {
// state: 变更后的状态; prev 变更前的状态
console.log(state, prev);
});

actions.setGlobalState(state);

// 子项目监听和修改
export function mount(props) {
props.onGlobalStateChange((state, prev) => {
// state: 变更后的状态; prev 变更前的状态
console.log(state, prev);
});
props.setGlobalState(state);
}
+ +

vue子项目内存泄露问题

这个问题挺难发现的,是在 qiankun 的 issue 区看到的: github.com/umijs/qiank… ,排查过程我就不发了,解决方案挺简单。

+

子项目销毁时清空 dom 即可:

+
1
2
3
4
5
6
export async function unmount() {
instance.$destroy();
+ instance.$el.innerHTML = ""; //新增这一行代码
instance = null;
router = null;
}
+ +

但是其实,来回切换子项目并不会使内存不断增加。也就是说,即使卸载子项目时,子项目占用的内存没有被释放,但是下次加载时会复用这块内存,那这样的话,子项目会不会加载更快?(还未考证)

+

安全和性能的问题

qiankun 将每个子项目的 js/css 文件内容都记录在一个全局变量中,如果子项目过多,或者文件体积很大,可能会导致内存占用过多,导致页面卡顿。

+

另外,qiankun 运行子项目的 js,并不是通过 script 标签插入的,而是通过 eval 函数实现的,eval 函数的安全和性能是有一些争议的:MDN的eval介绍

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/10/27/qiankun-2-0-24-%E7%88%AC%E5%9D%91%E8%AE%B0%E5%BD%95/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Announcement
This is my Blog
Recent Posts
\ No newline at end of file diff --git "a/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" new file mode 100644 index 000000000..5ca937f18 --- /dev/null +++ "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" @@ -0,0 +1,183 @@ +中央事件总线插件vue-bus-ts | 淳淳同学的个人博客 + + + + + + + + + + + + +

中央事件总线插件vue-bus-ts

+

项目中难免会遇到非父子组件之间的传参与通信问题,遂整理此文。

+
+

简介

vue-bus-ts 是一款支持在ts环境下使用的全局事件总线插件。

+

安装及使用方法

安装

1
npm i -S vue-bus-ts
+ +

注册

安装后需要在main.ts中引入并注册,挂载到全局的Vue实例上即可

+
1
2
3
4
5
6
7
8
9
10
11
12
# main.ts

import Vue from 'vue';
import EventBus from 'vue-bus-ts';

Vue.use(EventBus);
var bus = new EventBus.Bus();

new Vue({
bus,
render: (h) => h(App),
}).$mount('#app');
+ +

注册事件

在调用事件前,需要实现注册该事件,否则不会生效

+

一般写在vue文件的mounted或者created生命周期中

+
1
2
3
4
5
6
# *.vue

var eventId = this.$bus.$on('event_name', function (params: any) {
// params is the parameter passed in by $emit
// do something...
})
+ +

调用事件

注册成功后,打印this.$bus即可看到当前的事件总线实例,下面为调用的方法

+
1
2
3
4
5
6
7
8
9
10
11
12
# *.vue
// params can pass in any form of value, including Array, Object, String, Number, null, undefined or even array expansion items.or example,

var eventResult = this.$bus.$emit('event_name', params)

1. var result = this.$bus.$emit('event_name', [1,2,3])
2. var result = this.$bus.$emit('event_name', {})
3. var result = this.$bus.$emit('event_name', 'string')
4. let a = 1, b = 'test', c = [1, 2, 3], d = {a: 'test'}
var result = this.$bus.$emit('event_name', a, b ,c, d)
5. var result = this.$bus.$emit('event_name', null)
6. var result = this.$bus.$emit('event_name')
+ +

注销事件

如果不注销的话,下一次$on注册同一个事件时,会生成两个相同的事件,调用时会触发n次。所以建议在离开当前页面或当前模块时注销该事件,即写在beforeRouterLeave中(如果开启了keep-alive,可写在deactivated中)。

+
1
2
3
# *.vue

this.$bus.$off('event_name', eventId) // To unbind event binding, eventId is the return value of this.$bus.$on
+ +

订阅事件?

1
2
3
4
5
6
# *.vue

let result = this.$bus.$subscribed('event_name')
if (result) {
// do something...
}
+ +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/11/07/%E4%B8%AD%E5%A4%AE%E4%BA%8B%E4%BB%B6%E6%80%BB%E7%BA%BF%E6%8F%92%E4%BB%B6vue-bus-ts/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git a/2020/11/10/jsdelivr/index.html b/2020/11/10/jsdelivr/index.html new file mode 100644 index 000000000..c75ce8eeb --- /dev/null +++ b/2020/11/10/jsdelivr/index.html @@ -0,0 +1,193 @@ +jsdelivr | 淳淳同学的个人博客 + + + + + + + + + + + + +

jsdelivr

+

本文概要

+
+

CDN

jsdelivr for GitHub

需要配合PicGo图床使用

+
    +
  • 使用PicGo客户端上传图片
  • +
  • 复制url
      +
    • 默认格式为:PicGo默认前缀 + GitHub用户名 + / + 仓库名 + / + 分支名 + 图片在GitHub仓库的绝对路径
    • +
    • 例如:https://raw.githubusercontent.com/LeeDebug/PicGo/master/img/xxx.png
    • +
    +
  • +
  • 替换url中的前缀部分
      +
    • 默认格式为jsdeliver默认前缀 + 图片在GitHub仓库的绝对路径
    • +
    • 例如:https://cdn.jsdelivr.net/gh/LeeDebug/PicGo/img/xxx.png
    • +
    +
  • +
+

测试图片:
GitHub自带的CND

+

图床

PicGo+GitHub

支持桌面客户端上传、快捷键上传;仅支持普通url复制;

+

参考文档:

+ +

测试图片:
PicGo+GitHub

+

新浪图床

chrome插件上传;支持多种格式url复制;

+

测试图片:
新浪图床

+

搜狗图床

网页上传;不支持url复制;

+

测试图片:
搜狗图床

+

奇虎图床

网页上传;不支持url复制;

+

测试图片:
奇虎图床

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/11/10/jsdelivr/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" "b/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" new file mode 100644 index 000000000..3e805a37f --- /dev/null +++ "b/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" @@ -0,0 +1,201 @@ +Mac配置多个SSH-Key | 淳淳同学的个人博客 + + + + + + + + + + + + +

Mac配置多个SSH-Key

+

随着项目与能力的提升与扩展,一台电脑上同时用着多个git仓库的情况越来越普遍,所以我们需要创建多个ssh key来对应不同的账号。本文以github为例

+
+

本地配置ssh秘钥和公钥

进入到ssh文件夹下

1
cd ~/.ssh/
+ +

生成一个ssh-key

引号内填写你github对应的邮箱

+
1
→ ssh-keygen -t rsa -b 4096 -C "your email"
+ +

如果你之前mac上创建过ssh-key,在.ssh文件夹下会有id_rsaid_rsa.pub两个文件,分别为秘钥和公钥;当再次创建时,会有如下提示:

+
1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa):
+ +

如果想覆盖之前的文件直接回车即可;如果想创建新的ssh-key,则需要在此处输入新的名称,如id_rsa_github,回车后会提示你下次使用此ssh-key时是否需要密码,如果是个人电脑,直接回车即可(如果需要,设置便可)

+
1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
+ +

设置完密码后,会提示你ssh-key设置成功

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
our identification has been saved in id_rsa_github.
Your public key has been saved in id_rsa_github.pub.
The key fingerprint is:
SHA256: hash值 你的邮箱
The key's randomart image is:
+---[RSA 4096]----+
| .@/0+ o |
| o=+0*O o |
| .o=.*** .|
| o.o B = |
| @ + + * .|
| o + + o . |
| o . o |
| |
| |
+----[SHA256]-----+
+ +

查看.ssh文件夹下的新文件,则会看到刚才新生成的id_rsa_github秘钥和id_rsa_github.pub公钥

+
1
2
3
4
5
ls
id_rsa
id_rsa.pub
id_rsa_github
id_rsa_github.pub
+ +

将ssh-key添加到ssh-agent

因为本地默认只读id_rsa,我们想要使用新的秘钥对则需要把新添加的ssh-key添加到ssh-agent

+

首先,查看ssh agent所有密钥对(如果有以下提示,则表示从未添加过)

+
1
2
→ ssh-add -l
The agent has no identities.
+ +

将新的ssh-key添加到ssh agent

+
1
2
→ ssh-add id_rsa_github
Identity added: id_rsa_github (id_rsa_github)
+ +

此时再次查看ssh agent

+
1
2
→ ssh-add -l
4096 SHA256: hash值 id_rsa_github (RSA)
+ +

配置github的ssh-key

首先查看我们刚配置好的ssh-key的公钥,即以*.pub为后缀名的文件。复制整个文件的内容,即公钥信息

+
1
2
cat id_rsa_github.pub
ssh-rsa 公钥 你的邮箱
+ +

登录github后,在右上角的头像下拉列表中选择Settings选项,在左侧菜单中选择SSH and GPG keys,即可看到当前的SSH Keys,点击右上角绿色的New SSH Key按钮,在Key下方的文本框中,粘贴你的公钥信息,会默认以你的邮箱作为title(也可自行更改),点击下方的Add SSH Key即可。步骤如下图所示

+

github的ssh-key

+

测试连接

回到自己的项目仓库下git fetch;或打开控制台,输入以下命令

+
1
2
→ ssh -T git@github.com
Hi LeeDebug! You've successfully authenticated, but GitHub does not provide shell access.
+ +

到此,你的ssh-key已经可以正常使用,你可以使用ssh的方式去clone项目了

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/11/Mac%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AASSH-Key/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" new file mode 100644 index 000000000..821339620 --- /dev/null +++ "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" @@ -0,0 +1,179 @@ +git推送后没有贡献记录 | 淳淳同学的个人博客 + + + + + + + + + + + + +

git推送后没有贡献记录

+

github的contribution记录墙不展示问题

+
+

问题背景

最近打算把自己的项目同时部署到github、gitlab、gitee上,并且都改成了统一的email邮箱和username用户名,但是发现只有github没有任何的contribution记录。

+

于是我把本地的git信息及mac钥匙串保存的信息都删掉,重新记录了一遍;把SSH KEY也都删掉重新加了一遍。但都么有解决问题。

+

最后发现是github和其他两个仓库用的邮箱不一样,本地git的全局配置邮箱为a,gitee和gitlab用的邮箱也是a,只有github用的邮箱为b;所以github可能认为提交者不是当前用户,所以就没有提交记录。

+

解决方案

所以将多个仓库的邮箱改为同一个,并且将全局的gitconfig的email也改成此邮箱,即可。

+

命令代码

查看全局git信息:

+
1
2
3
4
5
git config --global --list

# 或

cat ~/.gitconfig
+ +

修改全局的git信息的邮箱:

+
1
git config --gloabl user.email "your github email"
+ +

配置本仓库的git信息的邮箱:

+
1
git config user.email "your github email"
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/11/git%E6%8E%A8%E9%80%81%E5%90%8E%E6%B2%A1%E6%9C%89%E8%B4%A1%E7%8C%AE%E8%AE%B0%E5%BD%95/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" "b/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" new file mode 100644 index 000000000..347fb8088 --- /dev/null +++ "b/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" @@ -0,0 +1,170 @@ +node打包内存溢出 | 淳淳同学的个人博客 + + + + + + + + + + + + +

node打包内存溢出

+

vue项目利用webpack打包时提示内存堆栈溢出

+
+

报错信息

1
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
+ +

解决方案

在build前,根据自己的项目大小设置一下最大分配内存空间,即可。

+
1
2
3
4
5
// 在package.json中
"scripts": {
...
"build": "node --max_old_space_size=4096 build/build.js"
}
+ +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/11/node%E6%89%93%E5%8C%85%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" new file mode 100644 index 000000000..a62e398be --- /dev/null +++ "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" @@ -0,0 +1,260 @@ +git贡献墙 gitcalendar | 淳淳同学的个人博客 + + + + + + + + + + + + +

git贡献墙 gitcalendar

+

公司为了访问便捷,大都使用gitlab或gitee,所以前两年的贡献度都在这两个仓库上。从今年打算转战github,多做项目、多做整理、多输出文章,旨在提升自己。所以本文的git贡献墙也以github为例

+
+

诸多解决方案

Github Official API

参考地址:

+ +

优势:

+
    +
  • 官方的
  • +
+

缺点:

+
    +
  • 速度慢
  • +
  • 不稳定,可能会挂
  • +
  • 单纯的canvas
  • +
  • 没有可读数据
  • +
+

Github Chart API

参考地址:

+ +

优势:

+
    +
  • 实时性好,与官网同步
  • +
+

缺点:

+
    +
  • 速度慢
  • +
  • 不稳定,可能会挂
  • +
  • 单纯的canvas
  • +
  • 没有可读数据
  • +
+

github-calendar.js

参考地址:

+ +

优势:

+
    +
  • 自带色卡
  • +
+

缺点:

+
    +
  • 作者不维护了
  • +
+

GitHub Contribution Calendar API

参考地址:

+ +

优势:

+
    +
  • 有数据返回,可读信息多
  • +
+

缺点:

+
    +
  • 没有图形化展示
  • +
  • 实时性差,第二天才更新
  • +
+

Butterfly-gitcalendar

结合 github-calendar.jsGitHub Contribution Calendar API

+

参考地址:

+ +

优势:

+
    +
  • 自定义样式与弹窗
  • +
  • 有数据返回,可读信息多
  • +
  • 汉化
  • +
+

缺点:

+
    +
  • 实时性差,第二天才更新
  • +
+

实现方案

本次以最后一种解决方案 Butterfly-gitcalendar 为基础,进行了部分更改

+

步骤一:新增gitcalendar.pug页面

项目根目录/themes/hexo-theme-butterfly-3.3.0/layout/文件夹下新建gitcalendar.pug文件,并复制以下代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#calendar.calendar
#gitmessage(:style='{top:y+px,left:x+px,position: fixed,zIndex:9999}')
.angle-wrapper
span {{span1}} &nbsp;
span {{span2}} 次提交
.position-relative
.border.py-2.graph-before-activity-overview
.js-calendar-graph.mx-md-2.mx-3.d-flex.flex-column.flex-items-end.flex-xl-items-center.overflow-hidden.pt-1.is-graph-loading.graph-canvas.calendar-graph.height-full.text-center(data-graph-url='/users/LeeDebug/contributions?to=2020-10-29', data-url='/LeeDebug', data-from='2019-10-27 00:00:00 UTC', data-to='2020-10-29 23:59:59 UTC', data-org)
#calendarcanvasbox(v-if='simplemode')
canvas#gitcanvas(style='animation: none;')
svg.js-calendar-graph-svg(width='100%', viewBox='0 0 770 128', v-if='!simplemode')
text.month(:x='32 + monthindex*64', y='20', v-for='(month,monthindex) in monthchange') {{month}}
text.wday(text-anchor='start', dx='0', dy='40') 日
text.wday(text-anchor='start', dx='0', dy='65') 二
text.wday(text-anchor='start', dx='0', dy='90') 四
text.wday(text-anchor='start', dx='0', dy='115') 六
g(v-for='(weekitem,weekIndex) in data', :transform='\'translate(\'+ (16 + weekIndex*14) + \',\' + \'0)\'')
rect(@mouseover="selectStyle(dayitem,$event)" @mouseleave="outStyle()" v-for='(dayitem,dayIndex) in weekitem', :style='{fill:thiscolor(dayitem.count),shapeRendering:crispedges}', :data-score='dayitem.count', :data-date='dayitem.date', x='0', :y=' 30 + dayIndex*13 ', width='11', height='11')
.contrib-footer.clearfix.mt-1.mx-3.px-3.pb-1
.float-left.text-gray
| 数据来源
a(:href="'https://github.com/'+ user ", target='blank') @{{user}}
.contrib-legend.text-gray(title='A summary of pull requests, issues opened, and commits to the default and gh-pages branches.')
| Less

ul.legend
li(:style='{backgroundColor:leeGreen[0]}')
li(:style='{backgroundColor:leeGreen[1]}')
li(:style='{backgroundColor:leeGreen[2]}')
li(:style='{backgroundColor:leeGreen[3]}')
li(:style='{backgroundColor:leeGreen[4]}')
| More

.contrib-column.contrib-column-first.table-column
span.text-muted 过去一年提交
span.contrib-number {{total}}
span.text-muted.data-range {{oneyearbeforeday}}&nbsp;-&nbsp;{{thisday}}
.contrib-column.table-column
span.text-muted 最近一月提交
span.contrib-number {{thisweekdatacore}}
span.text-muted.data-range {{amonthago}}&nbsp;-&nbsp;{{thisday}}
.contrib-column.table-column
span.text-muted 最近一周提交
span.contrib-number {{weekdatacore}}
span.text-muted.data-range {{aweekago}}&nbsp;-&nbsp;{{thisday}}
+ +

注:请将代码中的两处LeeDebug替换为你自己的github用户名

+

步骤二:在首页引用gitcalendar.pug

请打开项目根目录/themes/hexo-theme-butterfly-3.3.0/layout/index.pug页面,添加下面三行代码(如有顾虑,请自行备份)

+
1
2
3
4
5
6
7
8
9
10
  extends includes/layout.pug

block content
include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts
+ .recent-post-item(style='width:100%; height: auto;')
+ include gitcalendar.pug
+ .recent-post-item(style='height:0px; clear:both; margin-top: 0px;')
+postUI
include includes/pagination.pug
+ +

前两行为引用gitcalendar.pug页面,第3行是为了清除上面的布局样式;如有影响,请删除即可

+

步骤三:新增gitcalendar.js脚本

项目根目录/themes/hexo-theme-butterfly-3.3.0/source/下,新建文件夹并命名为gitcalendar,在此目录下新建文件夹并命名为js,在此目录下新建js文件并命名为gitcalendar.js(为了区分版本,个人命名为gitcalendar_v01.js),并复制以下代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
const calendar = new Vue({
el: '#calendar',
data: {
// 打开时使用canvas绘制gitcalendar,关闭时使用svg绘制gitcalendar
// canvas:dom数少,但图像会发生模糊,自适应一般 svg:dom数多,图像清晰,自适应更佳
simplemode: false,
// 这里填写你的github用户名
user: 'LeeDebug',
fixed: 'fixed',
px: 'px',
x: '',
y: '',
span1: '',
span2: '',
month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
monthchange: [],
oneyearbeforeday: '',
thisday: '',
amonthago: '',
aweekago: '',
weekdatacore: 0,
datacore: 0,
total: 0,
datadate: '',
data: [],
positionplusdata: [],
firstweek: [],
lastweek: [],
beforeweek: [],
thisweekdatacore: 0,
mounthbeforeday: 0,
mounthfirstindex: 0,
crispedges: 'crispedges',
thisdayindex: 0,
amonthagoindex: 0,
amonthagoweek: [],
firstdate: [],
first2date: [],
montharrbefore: [],
monthindex: 0,
leeGreen: ['#ebedf0', '#9be9a8', '#40c463', '#30a14e', '#216e39'], // github的强度颜色
purple: ['#ebedf0', '#fdcdec', '#fc9bd9', '#fa6ac5', '#f838b2', '#f5089f', '#c4067e', '#92055e', '#540336', '#48022f', '#30021f',],
green: ['#ebedf0', '#f0fff4', '#dcffe4', '#bef5cb', '#85e89d', '#34d058', '#28a745', '#22863a', '#176f2c', '#165c26', '#144620'],
blue: ['#ebedf0', '#f1f8ff', '#dbedff', '#c8e1ff', '#79b8ff', '#2188ff', '#0366d6', '#005cc5', '#044289', '#032f62', '#05264c',],
color: ['#ebedf0', '#fdcdec', '#fc9bd9', '#fa6ac5', '#f838b2', '#f5089f', '#c4067e', '#92055e', '#540336', '#48022f', '#30021f',]
},
methods: {
selectStyle(data, event) {
$('.angle-wrapper').show();
this.span1 = data.date;
this.span2 = data.count;
this.x = event.clientX - 100;
this.y = event.clientY - 60
},
outStyle() {
$('.angle-wrapper').hide()
},
thiscolor(x) {
if (x === 0) {
return this.leeGreen[0]
} else if (x <= 5) {
return this.leeGreen[1]
} else if (x <= 10) {
return this.leeGreen[2]
} else if (x <= 18) {
return this.leeGreen[3]
} else {
return this.leeGreen[4]
}
},
}
});
let githubapiurl = "https://githubapi.ryanchristian.dev/user/" + calendar.user;
$(function () {
$.ajax({
type: "GET",
url: githubapiurl,
dataType: "json",
success: function (data) {
;
calendar.data = data.contributions;
calendar.total = data.total;
calendar.first2date = calendar.data[48];
calendar.firstdate = calendar.data[47];
calendar.firstweek = data.contributions[0];
calendar.lastweek = data.contributions[52];
calendar.beforeweek = data.contributions[51];
calendar.thisdayindex = calendar.lastweek.length - 1;
calendar.thisday = calendar.lastweek[calendar.thisdayindex].date;
calendar.oneyearbeforeday = calendar.firstweek[0].date;
calendar.monthindex = calendar.thisday.substring(5, 7) * 1;
calendar.montharrbefore = calendar.month.splice(calendar.monthindex, 12 - calendar.monthindex);
calendar.monthchange = calendar.montharrbefore.concat(calendar.month);
addweek();
addlastmonth();

function responsiveChart() {
let c = document.getElementById("gitcanvas");
let cmessage = document.getElementById("gitmessage");
let ctx = c.getContext("2d");
c.width = document.getElementById("calendarcanvasbox").offsetWidth;
let linemaxwitdh = 0.96 * c.width / calendar.data.length;
c.height = 9 * linemaxwitdh;
let lineminwitdh = 0.8 * linemaxwitdh;
let setposition = {
x: 0.02 * c.width,
y: 0.025 * c.width
};
for (let week in calendar.data) {
weekdata = calendar.data[week];
for (let day in weekdata) {
let dataitem = {date: "", count: "", x: 0, y: 0};
calendar.positionplusdata.push(dataitem);
ctx.fillStyle = calendar.thiscolor(weekdata[day].count);
// ctx.fillStyle = calendar.leeGreen[weekdata[day].intensity]; // 可按api的强度直接取色
setposition.y = Math.round(setposition.y * 100) / 100;
dataitem.date = weekdata[day].date;
dataitem.count = weekdata[day].count;
dataitem.x = setposition.x;
dataitem.y = setposition.y;
ctx.fillRect(setposition.x, setposition.y, lineminwitdh, lineminwitdh);
setposition.y = setposition.y + linemaxwitdh
}
;
setposition.y = 0.025 * c.width;
setposition.x = setposition.x + linemaxwitdh
}
;
ctx.font = "600 Arial";
ctx.fillStyle = '#aaa';
ctx.fillText("日", 0, 1.9 * linemaxwitdh);
ctx.fillText("二", 0, 3.9 * linemaxwitdh);
ctx.fillText("四", 0, 5.9 * linemaxwitdh);
ctx.fillText("六", 0, 7.9 * linemaxwitdh);
let monthindexlist = c.width / 24;
for (let index in calendar.monthchange) {
ctx.fillText(calendar.monthchange[index], monthindexlist, 0.7 * linemaxwitdh);
monthindexlist = monthindexlist + c.width / 12
}
;
cmessage.onmousemove = function (event) {
$('.angle-wrapper').hide()
};
c.onmousemove = function (event) {
$('.angle-wrapper').hide()
getMousePos(c, event);
};

function getMousePos(canvas, event) {
var rect = canvas.getBoundingClientRect();
var x = event.clientX - rect.left * (canvas.width / rect.width);
var y = event.clientY - rect.top * (canvas.height / rect.height);
for (let item of calendar.positionplusdata) {
let lenthx = x - item.x;
let lenthy = y - item.y;
if (0 < lenthx && lenthx < lineminwitdh) {
if (0 < lenthy && lenthy < lineminwitdh) {
$('.angle-wrapper').show();
calendar.span1 = item.date;
calendar.span2 = item.count;
calendar.x = event.clientX - 100;
calendar.y = event.clientY - 60
}
}
}
}
}

responsiveChart();
$(window).on('resize', responsiveChart);
window.onscroll = function () {
$('.angle-wrapper').hide()
};
console.log(calendar.positionplusdata)

function addlastmonth() {
if (calendar.thisdayindex === 0) {
thisweekcore(52);
thisweekcore(51);
thisweekcore(50);
thisweekcore(49);
thisweekcore(48);
calendar.thisweekdatacore += calendar.firstdate[6].count;
calendar.amonthago = calendar.firstdate[6].date
} else {
thisweekcore(52);
thisweekcore(51);
thisweekcore(50);
thisweekcore(49);
thisweek2core();
calendar.amonthago = calendar.first2date[calendar.thisdayindex - 1].date
}
};

function thisweek2core() {
for (let i = calendar.thisdayindex - 1; i < calendar.first2date.length; i++) {
calendar.thisweekdatacore += calendar.first2date[i].count
}
};

function thisweekcore(index) {
for (let item of calendar.data[index]) {
calendar.thisweekdatacore += item.count
}
};

function addlastweek() {
for (let item of calendar.lastweek) {
calendar.weekdatacore += item.count
}
};

function addbeforeweek() {
for (let i = calendar.thisdayindex; i < calendar.beforeweek.length; i++) {
calendar.weekdatacore += calendar.beforeweek[i].count
}
};

function addweek() {
if (calendar.thisdayindex === 6) {
calendar.aweekago = calendar.lastweek[0].date;
addlastweek()
} else {
lastweek = data.contributions[51];
calendar.aweekago = lastweek[calendar.thisdayindex + 1].date;
addlastweek();
addbeforeweek()
}
}
}
})
});
if(document.getElementById("calendarcanvasbox").offsetWidth<500){calendar.simplemode=false}
+ +

注:同理,请将代码中的一处LeeDebug替换为你自己的github用户名

+

步骤四:新增gitcalendar.css样式

在步骤三新增的gitcalendar目录下,即项目根目录/themes/hexo-theme-butterfly-3.3.0/source/gitcalendar下,新建文件夹并命名为css,在此目录下新建css文件并命名为gitcalendar.css(同理,为了区分版本,个人命名为gitcalendar_v01.css),并复制以下代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
.calendar {
font-family: SourceHanSans-Medium;
border: 1px solid #DDDDDD;
border-radius: 3px;
min-height: 120px;
text-align: center;
margin: 0 auto;
border-width:0px;
width:100%;
display: flex;
display: -webkit-flex;
justify-content: center;
align-items:center;
flex-wrap:wrap;
}
.calendar-graph text.wday,
.calendar-graph text.month {
font-size: 10px;
fill: #aaa;
}
.contrib-legend {
text-align: right;
padding: 0 14px 10px 0;
display: inline-block;
float: right;
}
.contrib-legend .legend {
display: inline-block;
list-style: none;
margin: 0 5px;
position: relative;
bottom: -1px;
padding: 0;
}
.contrib-legend .legend li {
display: inline-block;
width: 10px;
height: 10px;
}
.text-small {
font-size: 12px;
color: #767676;
}
.calendar-graph {
padding: 15px 0 0;
text-align: center;
}
.contrib-column {
text-align: center;
border-left: 1px solid #ddd;
border-top: 1px solid #ddd;
font-size: 11px;
}
.contrib-column-first {
border-left: 0;
}
.table-column {
padding:10px;
display: table-cell;
width:33%;
vertical-align: top;
}
.contrib-number {
font-weight: 300;
line-height: 1.3em;
font-size: 24px;
display: block;
}
.calendar img.spinner {
width: 70px;
margin-top: 50px;
min-height: 70px;
}
.monospace {
text-align: center;
color: #000;
font-family: monospace;
}
.monospace a {
color: #1D75AB;
text-decoration: none;
}
.contrib-footer {
font-size: 12px;
padding: 0 12px 12px;
text-align: left;
width: 100%;
box-sizing: border-box;
height: 26px;
}
.left.text-muted {
float: left;
margin-left: 9px;
color: #767676;
}
.left.text-muted a {
color: #4078c0;
text-decoration: none;
}
.left.text-muted a:hover,
.monospace a:hover {
text-decoration: underline;
}
h2.f4.text-normal.mb-3 {
display: none;
}

.float-left.text-gray {
float: left;
}
#user-activity-overview{
display:none;
}
.day-tooltip {
white-space: nowrap;
position: absolute;
z-index: 99999;
padding: 10px;
font-size: 12px;
color: #959da5;
text-align: center;
background: rgba(0,0,0,.85);
border-radius: 3px;
display: none;
pointer-events: none;
}
.day-tooltip strong {
color: #dfe2e5;
}
.day-tooltip.is-visible {
display: block;
}
.day-tooltip:after {
position: absolute;
bottom: -10px;
left: 50%;
width: 5px;
height: 5px;
box-sizing: border-box;
margin: 0 0 0 -5px;
content: " ";
border: 5px solid transparent;
border-top-color: rgba(0,0,0,.85)
}
.position-relative {
width:100%;
padding-left:20px;
padding-right:20px;
}
@media screen and (max-width: 650px){
.contrib-footer{
padding: 0;
}
.contrib-column{
/* display:none */
line-height: initial;
padding: 5px;
}
.contrib-column .contrib-number{
font-size: 14px;
font-weight: 500;
}
.contrib-column .data-range{
display:none
}
}
.angle-wrapper {
z-index:9999;
display:inline;
display:none;
width: 200px;
height: 40px;
position: relative;
padding: 5px 0;
background: rgba(0, 0, 0, 0.8);
border-radius: 8px;
text-align: center;
color: white;
}
.angle-box {
position:fixed;
padding:10px
}
.angle-wrapper span{
padding-bottom:1em;
}
.angle-wrapper:before {
content: '';
width: 0;
height: 0;
border: 10px solid transparent;
border-top-color: rgba(0, 0, 0, 0.8);
position: absolute;
left: 47.5%;
top: 100%;
}
+ +

引入js、css代码,即vue的依赖

项目根目录/themes/hexo-theme-butterfly-3.3.0/_config.yml文件内,找到inject处,并添加以下3行代码

+
1
2
3
4
5
6
inject:
head:
+ - <link rel="stylesheet" href="/gitcalendar/css/gitcalendar_v01.css"/>
bottom:
+ - <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
+ - <script src="/gitcalendar/js/gitcalendar_v01.js"></script>
+ +

注:此处的js和css文件也可改为cdn引入,但要注意缓存问题。另,如无特殊需求,请引入vue@2.6.11,非必要请不要修改

+

步骤五:打包部署

教程到此结束,打包部署即可查看效果。如有疑问请联系博主

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/14/git%E8%B4%A1%E7%8C%AE%E5%A2%99gitcalendar/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git a/2020/12/15/GitHub-Corners/index.html b/2020/12/15/GitHub-Corners/index.html new file mode 100644 index 000000000..4487f435f --- /dev/null +++ b/2020/12/15/GitHub-Corners/index.html @@ -0,0 +1,175 @@ +GitHub Corners | 淳淳同学的个人博客 + + + + + + + + + + + + +

GitHub Corners

+

可以在你的博客或者自己的网站上增加一个github的标志链接

+
+

GitHub Ribbons

github repo是最初的角标链接,像丝带一样的长条形状,如下图所示:

+

GitHub Ribbons

+

接入代码如下所示:

+
1
<a href="https://github.com/you"><img loading="lazy" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png?resize=149%2C149" class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1"></a>
+ +

GitHub Corners

GitHub Corners是一款更为简单干净的角标链接,如本站右上角所示:

+

接入代码如下所示:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<a href="https://your-url" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#70B7FD; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
<style>
.github-corner:hover .octo-arm{
animation:octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave{
0%,100%{
transform:rotate(0);
}
20%,60%{
transform:rotate(-25deg);
}
40%,80%{
transform:rotate(10deg);
}
}
@media (max-width:500px){
.github-corner:hover .octo-arm{
animation:none;
}
.github-corner .octo-arm{
animation:octocat-wave 560ms ease-in-out;
}
}
</style>
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/15/GitHub-Corners/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" "b/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" new file mode 100644 index 000000000..d156c28a9 --- /dev/null +++ "b/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" @@ -0,0 +1,205 @@ +qiankun的css样式污染解决方案 | 淳淳同学的个人博客 + + + + + + + + + + + + +

qiankun的css样式污染解决方案

+

在使用qiankun框架做微前端开发的过程中,遇到了诸多难题,比如路由重定向、变量名及事件名冲突、挂载注销机制及生命周期、keep-alive等,目前遇到的比较难解决的问题可能就是css样式污染问题了。这次抽出了几天时间研究了一下,遂总结此文

+
+

问题概述

在qiankun加载子应用后,主子应用的样式之间会产生污染,常见的css样式污染有以下几种情况:

+
    +
  • 无论是否进行样式隔离:主应用的样式污染了子应用(原因:主应用的样式添加了 !important 属性或 >>> 穿透属性)
  • +
  • 未进行样式隔离:子应用的样式污染了主应用(原因:样式重名,后加载的优先级高)
  • +
  • 处理过样式隔离:子应用打开的弹窗、抽屉、popover等这种需要插入到主应用body的dom元素,样式丢失或应用了主项目的样式(原因:开启沙箱时,子应用的样式作用域只在子应用内,但如描述,子应用的dom被插入到了主应用的body中,遂出现了此种情况)
  • +
+

qiankun自带的css沙箱

个人理解,qiankun加载子项目css样式机制大体为:挂载子应用时将子应用的css样式以style标签的形式插入并做快照,卸载子应用时再将快照内的style样式删除。所以在加载子应用期间,若未开启css沙箱隔离,后加载的这些样式,可能会对整个系统的样式产生影响,对此,qiankun提供了两种css沙箱功能,可以将子应用的样式包裹在沙箱容器内部,以此来达到样式隔离的目的。大体代码如下所示:

+
1
2
3
4
5
6
7
8
9
this.microApp = loadMicroApp(
{ apps infos ... },
{
sandbox: {
strictStyleIsolation: true // 严格沙箱
experimentalStyleIsolation: true // 实验性沙箱
}
}
)
+ +
    +
  1. 严格沙箱
  2. +
+

在加载子应用时,添加strictStyleIsolation: true属性,实现形式为将整个子应用放到Shadow DOM内进行嵌入,完全隔离了主子应用

+

缺点:

+
    +
  • 子应用的弹窗、抽屉、popover因找不到主应用的body会丢失,或跑到整个屏幕外(具体原因作者并未详细研究)
  • +
  • 主应用不方便去修改子应用的样式
  • +
+
    +
  1. 实验性沙箱
  2. +
+

在加载子应用时,添加experimentalStyleIsolation: true属性,实现形式类似于vue中style标签中的scoped属性,qiankun会自动为子应用所有的样式增加后缀标签,如:div[data-qiankun-microName]

+

缺点:

+
    +
  • 子应用的弹窗、抽屉、popover因插入到了主应用的body,所以导致样式丢失或应用了主应用了样式
  • +
+

最终解决方案

说了这么多qiankun自带的css沙箱隔离,但都有各自的缺点,并且对于系统的实现上,影响范围还比较严重,代码的修改范围也比较大。作者的项目中,主子应用都是vue项目,并且都用了element家的样式且都各自魔改过,遂果断不开启css沙箱,给各自的项目class全局加上一个各自的命名空间,可以自己的项目名,比如:myVue bodymyVue el-form-info__labelmyVue customClass等。

+

代码实现

    +
  1. 添加依赖
  2. +
+
1
→ npm i postcss-plugin-namespace -D
+ +
    +
  1. 配置postcss
  2. +
+

在项目根目录创建postcss.config.js文件,并复制以下内容:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
// console.log('=> => => postcss.config.js start => => =>')
module.exports = (ctx) => {
return {
plugins: [
require('postcss-plugin-namespace')('#lee_project', {
ignore: [
'html', /body/, 'span', 'el-form-item'
]
}),
]
}
}
// console.log('=> => => postcss.config.js end => => =>')
+ +

该插件会将全局所有class前加上统一前缀,并过滤掉ignore内的标签;ignore内可以写字符串,可以写正则表达式。但每次编译前都会运行,所以可能会增加编译时间,所以日常开发环境下可以将此文件名随便改成别的,上线前记得改回来调试一下(如果直接隐藏掉代码的话,只要有postcss.config.js这个文件webpack会自动帮你执行,并且会提示你的postcss啥也没干,也相当于每次都走了这个脚本)。

+

注意:如果用/body/这样的正则,会将所有带body的class都过滤掉,比如el-drawer__bodyel-dialog__body等。

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/19/qiankun%E7%9A%84css%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" new file mode 100644 index 000000000..e94e36f75 --- /dev/null +++ "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" @@ -0,0 +1,170 @@ +git仓库推送脚本(本地简易版) | 淳淳同学的个人博客 + + + + + + + + + + + + +

git仓库推送脚本(本地简易版)

+

由于每次写完代码都要执行一大堆命令来将本地代码推送至远程仓库,所以索性写一个sh脚本

+
+

新建push.sh文件:

在项目主目录,即/git所在目录新建push.sh文件,并复制以下内容:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
echo → 暂存选取所有代码
git add .

read -p "→ 请输入您的commit提交信息:" MSG

echo → 提交所有暂存代码
git commit -m "$MSG"

echo → 将代码推送至三端git仓库
git push -u all master

# 如果不是hexo项目可忽略以下内容
echo → Hexo自动构建及部署
npm run clean
npm run build
npm run deploy
+ +

运行脚本

每次推送时,在当前目录运行sh push.sh命令即可,接下来会提示你输入要提交的信息,输入完点击回车即可

+

注:如果加入了hexo项目的构建部署命令,每次推送时也会帮你完成部署

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/26/git%E4%BB%93%E5%BA%93%E6%8E%A8%E9%80%81%E8%84%9A%E6%9C%AC%EF%BC%88%E6%9C%AC%E5%9C%B0%E7%AE%80%E6%98%93%E7%89%88%EF%BC%89/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" new file mode 100644 index 000000000..42423c3a2 --- /dev/null +++ "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" @@ -0,0 +1,214 @@ +vue3的生命周期钩子 | 淳淳同学的个人博客 + + + + + + + + + + + + +

vue3的生命周期钩子

+

vue3的生命周期钩子与vue2的差不多,只是命名和调用上有一些诧异,详见下文

+
+

与 2.x 版本生命周期相对应的 Composition API

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Vue 2.xVue 3.x
beforeCreate改用 setup()
created改用 setup()
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted
errorCapturedonErrorCaptured
+

新增的钩子函数

除了和 2.x 生命周期等效项之外,Composition API 还提供了以下调试钩子函数:

+
    +
  • onRenderTracked
  • +
  • onRenderTriggered
  • +
+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2020/12/27/vue3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" "b/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" new file mode 100644 index 000000000..abbaa5669 --- /dev/null +++ "b/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" @@ -0,0 +1,169 @@ +copy-webpack-plugin处理单独js文件 | 淳淳同学的个人博客 + + + + + + + + + + + + +

copy-webpack-plugin处理单独js文件

+

当文件在static或public目录下但又想对文件进行编译处理,即可在此插件中进行配置

+
+

使用说明

copy-webpack-plugin是webpack自带的插件,本意是将某个文件/文件夹,从dir1处复制到dist下,即当你在运行npm run build时,static或public目录下的文件就是走的此插件

+

配置信息

因为我使用的是基于@vue/cli-servicevue3.x,所以是在vue.config.js中设置(如果是vue2.x的版本,请在webpack.base.js中设置)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 引入
const CopyWebpackPlugin = require('copy-webpack-plugin')
const UglifyJS = require('uglify-js')

// 使用
let config = {
// ...others,
configureWebpack: config => {
config.plugins.push(
// see document: https://www.npmjs.com/package/copy-webpack-plugin/v/5.1.2
new CopyWebpackPlugin([
{
from: resolve('./public/handle.js'), // 文件名或目录
to: './[name].[contenthash].[ext]', // 文件名后添加hash值
transform(content, path) { // 修改文件内容
const code = UglifyJS.minify(content.toString()).code;
return code;
},
transformPath(targetPath, absolutePath) { // 修改文件路径:目标路径、源路径
newHashPath = targetPath;
return targetPath;
},
},
{
from: resolve('./public/index2.html'),
to: './[name].[ext]',
transform(content, path) {
let code = UglifyJS.minify(content.toString()).code;
return code;
},
force: true, // 覆盖已经存在的文件
},
])
);
},
}
module.exports = config;
+ +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/01/08/copy-webpack-plugin%E5%A4%84%E7%90%86%E5%8D%95%E7%8B%ACjs%E6%96%87%E4%BB%B6/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" new file mode 100644 index 000000000..b82e1a84b --- /dev/null +++ "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" @@ -0,0 +1,170 @@ +安卓微信浏览器中type=file的input框无法使用 | 淳淳同学的个人博客 + + + + + + + + + + + + +

安卓微信浏览器中type=file的input框无法使用

+

如果使用html的input框设为type=file来选择文件,在安卓的微信中打开页面时,会提示暂无可使用应用等错误提示

+
+

解决方案

若要选择图片,需将input框的accept属性设为image/*;若要选择文件,需将此属性设为

+
1
2
3
4
5
6
7
<input
v-show="false"
:ref="el => { if (el) uploadRefs = el }"
type="file"
:accept="acceptFileTypeArr"
@change="handleUploadFunc"
/>
+
1
2
3
4
5
6
7
8
9
const acceptFileTypeArr: any = computed(() => { // 当前支持上传类型
if (uploadType.value === 'image') {
return 'image/*';
}
if (uploadType.value === 'file') {
return '';
}
return '';
});
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/01/17/%E5%AE%89%E5%8D%93%E5%BE%AE%E4%BF%A1%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%ADtype-file%E7%9A%84input%E6%A1%86%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" new file mode 100644 index 000000000..83fbd3a06 --- /dev/null +++ "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" @@ -0,0 +1,170 @@ +修改element-ui的全局配置 | 淳淳同学的个人博客 + + + + + + + + + + + + +

修改element-ui的全局配置

+

项目因使用qiankun嵌入了子项目,且都使用了element-ui的弹窗样式,遂导致子应用中插入到父应用body的弹窗因层级过低无法展示

+
+

配置信息

element-ui的弹窗默的z-index层级默认是从2000开始的,并且打开多个弹窗时z-index会逐步递增,所以若主子应用不做区分的话,很可能会导致有的弹窗被遮挡

+

好在element提供了入口可将全局的弹窗层级设置一个起始值,即只需将子应用的层级初始值调高即可

+
1
2
3
4
5
6
7
// 在main.ts中
import Vue from 'vue';
import Element from 'element-ui';
Vue.use(Element, {
size: 'small', // 组件的默认尺寸 mini、small、medium
zIndex: 3000 // 弹窗默认层级初始值,默认2000
});
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/01/26/%E4%BF%AE%E6%94%B9element-ui%E7%9A%84%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" new file mode 100644 index 000000000..945b430b1 --- /dev/null +++ "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" @@ -0,0 +1,172 @@ +viewerjs查看大图组件 | 淳淳同学的个人博客 + + + + + + + + + + + + +

viewerjs查看大图组件

+

因为项目没有使用element-ui,所以不能使用自带的el-image组件进行大图查看,遂找了一个单独的组件

+
+

安装

1
npm install viewerjs
+ +

使用案例

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 单个图片查看 -->
<div>
<img id="image" src="picture.jpg" alt="Picture">
</div>

<!-- 多个图片查看 -->
<div>
<ul id="images">
<li><img src="picture-1.jpg" alt="Picture 1"></li>
<li><img src="picture-2.jpg" alt="Picture 2"></li>
<li><img src="picture-3.jpg" alt="Picture 3"></li>
</ul>
</div>
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// see document: https://github.com/fengyuanchen/viewerjs/blob/master/README.md
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
let viewer: any;
export function initImageViewer(thumbnail: string = '') {
// 获取最新的消息框实例
const msgDom: any = (document as any).getElementById('messageBox');
// 已加载过
if (viewer) {
// 更新实例里的图片源
viewer.update(msgDom);
} else { // 第一次加载
viewer = new Viewer(msgDom, {
// 只筛选出图片消息
filter(image: any) {
const isImgMsg = image.className.indexOf('imageMsg') > -1;
return isImgMsg;
},
// 去掉url中的缩略图参数
url(image: any) {
return image.src.replace(thumbnail, '');
},
});
}
}

+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/02/06/viewerjs%E6%9F%A5%E7%9C%8B%E5%A4%A7%E5%9B%BE%E7%BB%84%E4%BB%B6/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" new file mode 100644 index 000000000..087166b9f --- /dev/null +++ "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" @@ -0,0 +1,173 @@ +实现输入框的n种形式 | 淳淳同学的个人博客 + + + + + + + + + + + + +

实现输入框的n种形式

+

开发过程中遇到的新方案

+
+

textarea

最常见的就是这种形式,不多赘述。代码如下

+

但要展示带html元素的内容,可能就不是那么方便了

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<textarea
id="sendMsgBox"
class="sendMsgBox"
ref="sendMsgBox"
row="3"
maxlength="1000"
v-model="sendContent"
:readonly="cantOperate"
:placeholder="getPlaceholder"
@blur="handleBlurFun"
@focus="handleFocusFun"
@keydown="handleKeyDown($event)"
:style="{ 'height': textareHeight }"
></textarea>
+ +

pre标签

contenteditable属性会将该段落变为可编辑状态,如同直接用vue的v-html展示。代码如下

+
1
2
3
<pre contenteditable="true">
可以直接在这里输入.....
</pre>
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/02/10/%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84n%E7%A7%8D%E5%BD%A2%E5%BC%8F/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" "b/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" new file mode 100644 index 000000000..0250223fa --- /dev/null +++ "b/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" @@ -0,0 +1,169 @@ +navigator.userAgent获取当前设备信息 | 淳淳同学的个人博客 + + + + + + + + + + + + +

navigator.userAgent获取当前设备信息

+

获取当前是何设备,来区分不同的事件及渲染模式

+
+

navigator.userAgent

封装好函数直接调用,利用switch直接进行判断即可

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
export function currDevice() {
const u = navigator.userAgent;
const app = navigator.appVersion; // appVersion 可返回浏览器的平台和版本信息。该属性是一个只读的字符串。
const browserLang = (navigator.browserLanguage || navigator.language).toLowerCase(); //获取浏览器语言
const deviceBrowser = (() => {
return {
trident: u.indexOf('Trident') > -1, // IE内核
presto: u.indexOf('Presto') > -1, // opera内核
webKit: u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, // 火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.Mac OS X/), // ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1, // 是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, // 是否iPad
webApp: u.indexOf('Safari') === -1, // 是否web应用程序,没有头部和底部
weixin: u.indexOf('MicroMessenger') > -1, // 是否微信
qq: u.match(/\sQQ/i) === "qq", // 是否QQ
};
})();
return deviceBrowser;
}
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/02/17/navigator.userAgent%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" "b/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" new file mode 100644 index 000000000..6c8158970 --- /dev/null +++ "b/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" @@ -0,0 +1,177 @@ +linear-gradient函数实现线性渐变 | 淳淳同学的个人博客 + + + + + + + + + + + + +

linear-gradient函数实现线性渐变

+

当tab标签超出滚动时,在侧边增加一个渐变透明的框,会使视觉上更加明显,让用户感知到该处可以滑动

+
+

效果对比展示

原本样式:

+

原本样式

+

增加渐变的透明框后的样式:

+

增加渐变的透明框后的样式

+

滚动后的效果:

+

滚动后的效果

+

可滑动的tab标签

1
2
3
4
5
6
7
8
9
/* 超出部分可所有滑动 */
.tab_scroll {
display: -webkit-box;
overflow: auto;
}
/* 隐藏滚轮 */
.tab_scroll::-webkit-scrollbar {
display: none;
}
+ + +

渐变透明的小方块

1
2
3
4
5
6
7
8
9
10
.tab_scroll:before {
content: '';
position: absolute;
right: 0;
float: right;
/* border: 1px solid red; */
height: 66px;
width: 60px;
background: linear-gradient(to right, transparent, white);
}
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/02/21/linear-gradient%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%E7%BA%BF%E6%80%A7%E6%B8%90%E5%8F%98/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" "b/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" new file mode 100644 index 000000000..ecc5c9be9 --- /dev/null +++ "b/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" @@ -0,0 +1,173 @@ +查看代码行数 | 淳淳同学的个人博客 + + + + + + + + + + + + +

查看代码行数

+

项目写久了,就像看看自己一个项目的真实代码有多少行,所以找了下面两个方法

+
+

命令行查看

用mac终端自带的的find命令,可以查看目录下每个文件的行数,及最后输出总行数

+
1
2
3
4
5
6
7
8
# input >
find . "(" -name "*.vue" -or -name "*.html" -or -name "*.ts" -or -name "*.js" ")" -print | xargs wc -l

# output >
423 a.js
1842 b.vue
52 c.html
7253 total
+ + +

VsCode查看

直接在vscode的全局搜索中(快捷键为Command + Shift + c),输入b*[^:b#/]+.*$,并使用Use Regular Expression选项(即最右侧的星号和方块的按钮),进行搜索,即可查看

+
1
2
3
4
5
6
7
8
9
# input >
b*[^:b#/]+.*$

# output >
7253 results in 77 files

423 a.js
1842 b.vue
52 c.html
+ +

VsCode查看代码行数

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/03/01/%E6%9F%A5%E7%9C%8B%E4%BB%A3%E7%A0%81%E8%A1%8C%E6%95%B0/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" "b/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" new file mode 100644 index 000000000..0dbd57580 --- /dev/null +++ "b/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" @@ -0,0 +1,178 @@ +加载聊天历史记录并保留滚动条当前位置 | 淳淳同学的个人博客 + + + + + + + + + + + + +

加载聊天历史记录并保留滚动条当前位置

+

在聊天框中,加载历史消息肯定是往消息的上面去加载,即对应数组的Array.unshift()操作,此时默认滚动条会回到顶部,所以我们需要重置滚动条的位置

+
+

Vue中代码实现

首先记录加载历史前,滚动条的位置scrollHeight

+
1
const scrollHeight: number = (document as any).getElementById('messageBox').scrollHeight;
+ +

加载历史消息

+
1
2
3
4
for (let i = 0; i < outMsg.list.length; i++) {
// todo sth, ex: 消息处理
activeList.unshift(list[i]);
}
+ +

滚动到原来的位置

+

注:因为我是在vue环境下,需要确保页面已经渲染完,再滚动到加载前的位置,所以使用Vue.nextTick()

+
1
2
3
4
nextTick(() => {
const scrollDom: any = (document as any).getElementById('messageBox');
scrollDom.scrollTop = (scrollDom.scrollHeight - scrollHeight);
});
+ +

jQuery代码实现

原理同上,直接上代码

+
1
2
var scrollHeight = document.getElementById("messageBox").scrollHeight;
$("#messageBox").scrollTop(document.getElementById("messageBox").scrollHeight - scrollHeight);
+ +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/03/08/%E5%8A%A0%E8%BD%BD%E8%81%8A%E5%A4%A9%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%B9%B6%E4%BF%9D%E7%95%99%E6%BB%9A%E5%8A%A8%E6%9D%A1%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" "b/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" new file mode 100644 index 000000000..4190a0708 --- /dev/null +++ "b/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" @@ -0,0 +1,255 @@ +【转】看完让你彻底搞懂Websocket原理 | 淳淳同学的个人博客 + + + + + + + + + + + + +

【转】看完让你彻底搞懂Websocket原理

+

最近在学习websocket的时候,从知乎的《WebSocket 是什么原理?为什么可以实现持久连接?》问题下看到了这个回帖,对我的帮助比较大,遂转载到自己的博客

+
+

WebSocket 和 Http

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解

+

WebSocket和Http的关系

+

有交集,但是并不是全部。另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=再简单来说,层级不一样。

+

Websocket是什么样的协议,具体有什么优点

首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。

+

HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么在HTTP1.0中,这次HTTP请求就结束了。

+

在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。

+

但是请记住 Request = Response,在HTTP中永远是这样,也就是说一个request只能有一个response。

+

而且这个response也是被动的,不能主动发起。

+

教练,你BB了这么多,跟Websocket有什么关系呢?

+

_(:з」∠)_好吧,我正准备说Websocket呢。。

+

首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。在握手阶段是一样的

+

——-以下涉及专业技术内容,不想看的可以跳过,或者只看加黑内容——–

+

首先我们来看个典型的Websocket握手(借用Wikipedia的。。)

+
1
2
3
4
5
6
7
8
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
+ +

熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。

+
1
2
Upgrade: websocket
Connection: Upgrade
+ +

这个就是Websocket的核心了,告诉Apache、Nginx等服务器:注意啦,窝发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。

+
1
2
3
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
+ +

首先,Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。

+

然后,Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~

+

最后,Sec-WebSocket-Version 是告诉服务器所使用的Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦大家都使用的一个东西 脱水:服务员,我要的是13岁的噢→_→

+

然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦!

+
1
2
3
4
5
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
+ +

这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~

+
1
2
Upgrade: websocket
Connection: Upgrade
+ +

依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket。

+

然后,Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key。服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。

+

后面的,Sec-WebSocket-Protocol 则是表示最终使用的协议。

+

至此,HTTP已经完成它所有工作了,接下来就是完全按照Websocket协议进行了。具体的协议就不在这阐述了。

+

——————技术解析部分完毕——————

+

+

你TMD又BBB了这么久,那到底Websocket有什么鬼用,http long poll,或者ajax轮询不都可以实现实时信息传递么。

+

+

好好好,年轻人,那我们来讲一讲Websocket有什么用。来给你吃点胡(苏)萝(丹)卜(红)

+

+

Websocket的作用

在讲Websocket之前,我就顺带着讲下 long poll 和 ajax轮询 的原理。

+

首先是 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

+

场景再现:

+
1
2
3
4
5
6
7
8
9
10
11
客户端:啦啦啦,有没有新信息(Request)
服务端:没有(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:没有。。(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:好啦好啦,有啦给你。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:。。。。。没。。。。没。。。没有(Response)
--- loop
+ +

long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

+

场景再现:

+
1
2
3
4
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:额。。 等待到有消息的时候。。来 给你(Response)
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
--- loop
+ +

从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。

+

何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。

+

简单地说就是,服务器是一个很懒的冰箱(这是个梗)(不会、不能主动发起连接),但是上司有命令,如果有客户来,不管多么累都要好好接待。

+

说完这个,我们再来说一说上面的缺陷(原谅我废话这么多吧OAQ)

+

从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。

+

ajax轮询 需要服务器有很快的处理速度和资源。(速度)

+

long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

+

所以ajax轮询 和long poll 都有可能发生这种情况。

+
1
2
3
4
5
客户端:啦啦啦啦,有新信息么?
服务端:月线正忙,请稍后再试(503 Server Unavailable)
客户端:。。。好吧,啦啦啦,有新信息么?
服务端:月线正忙,请稍后再试(503 Server Unavailable)
客户端:。。。
+ +

然后服务端在一旁忙的要死:冰箱,我要更多的冰箱!更多。。更多。。(我错了。。这又是梗。。)

+
+

言归正传,我们来说Websocket吧通过上面这个例子,我们可以看出,这两种方式都不是最好的方式,需要很多资源。

+

一种需要更快的速度,一种需要更多的’电话’。这两种都会导致’电话’的需求越来越高。

+

哦对了,忘记说了HTTP还是一个无状态协议。(感谢评论区的各位指出OAQ)

+

通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

+

所以在这种情况下出现了,Websocket出现了。

+

他解决了HTTP的这几个难题。

+

首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

+

所以上面的情景可以做如下修改:

+
1
2
3
4
5
6
7
8
客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
服务端:balabalabalabala
服务端:balabalabalabala
服务端:哈哈哈哈哈啊哈哈哈哈
服务端:笑死我了哈哈哈哈哈哈哈
+ +

就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)

+

这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。

+

那么为什么他会解决服务器上消耗资源的问题呢?

+

其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。

+

简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。

+

本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。

+

Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。这样就可以解决客服处理速度过慢的问题了。

+

同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。

+

虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。

+

但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。

+

同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了

+
+

至于怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能

+

但是可以通过上面说的 long poll 和 ajax 轮询来 模拟出类似的效果

+

祝君无Bug~

+

作者:Ovear

+

链接:点击查看原文

+

来源:知乎

+
+
Author: 淳淳同学
Link: https://leedebug.github.io/2021/03/17/%E7%9C%8B%E5%AE%8C%E8%AE%A9%E4%BD%A0%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82Websocket%E5%8E%9F%E7%90%86/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" "b/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" new file mode 100644 index 000000000..9e8b2add1 --- /dev/null +++ "b/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" @@ -0,0 +1,173 @@ +VSCode注释高亮插件 Better Comments | 淳淳同学的个人博客 + + + + + + + + + + + + +

VSCode注释高亮插件 Better Comments

+

本文概要

+
+

安装插件

打开VSCode的插件市场,搜索Better Comments,点击install

+

插件安装

+

使用

该插件提供5中默认的高亮方式,配置信息如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"better-comments.tags": [
{
"tag": "!",
"color": "#FF2D00",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "?",
"color": "#3498DB",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "//",
"color": "#474747",
"strikethrough": true,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "todo",
"color": "#FF8C00",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
},
{
"tag": "*",
"color": "#98C379",
"strikethrough": false,
"underline": false,
"backgroundColor": "transparent",
"bold": false,
"italic": false
}
]
+ +

效果如下所示:

+

+

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/03/25/VSCode%E6%B3%A8%E9%87%8A%E9%AB%98%E4%BA%AE%E6%8F%92%E4%BB%B6BetterComments/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" new file mode 100644 index 000000000..1a672c9cb --- /dev/null +++ "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" @@ -0,0 +1,180 @@ +预防XSS攻击插件 js-xss | 淳淳同学的个人博客 + + + + + + + + + + + + +

预防XSS攻击插件 js-xss

+

在面向客户开发时,特别是根据客户输入的内容进行入库试,无法预计会输入什么,所以需要对客户输入的内容进行过滤,以免引起不必要的bug甚至数据库崩掉

+
+

参考网站

+

安装插件

1
npm install xss
+ +

引入插件

1
import { getDefaultWhiteList, FilterXSS } from 'xss';
+ +

封装函数

插件的github文档中给出了很多api,根据自己的需求进行封装即可,如下所示:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
export const filterXSS = (() => {
const whiteList: any = getDefaultWhiteList(); // 获取默认白名单
// 添加新的白名单标签或属性
for (const i of Object.keys(whiteList)) {
whiteList[i].push('style', 'class');
if (i === 'table' && whiteList[i]) {
whiteList[i].push('cellpadding', 'cellspacing', 'bordercolor');
}
}
whiteList.strike = ['style', 'class'];
const options = {
whiteList,
css: false,
stripIgnoreTag: true, // 非白名单标签,过滤标签,显示标签里的内容
stripIgnoreTagBody: ['script', 'style'],
onTagAttr(tag: any, name: any, value: any, isWhiteAttr: any) {
// 过滤img标签的src属性
if (tag === 'img' && name === 'src') {
return `${name}="data:image/ico;base64,aWNv" data-${name}=${value}`;
}
// 处理a标签
if (tag === 'a') {
return `${name}=${value} style="pointer-events: none;"`;
}
// 如果不返回任何值,表示还是按照默认的方法处理
},
};
const myxss = new FilterXSS(options);
return myxss.process.bind(myxss);
})();
+ +

使用方法

1
2
3
4
import { filterXSS } from '@/utils';

var filterData = filterXSS(res.data);
console.log(filterData);
+ + +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/04/02/%E9%A2%84%E9%98%B2XSS%E6%94%BB%E5%87%BB/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" "b/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" new file mode 100644 index 000000000..35842b8bd --- /dev/null +++ "b/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" @@ -0,0 +1,476 @@ +JavaScript运算符优先级 | 淳淳同学的个人博客 + + + + + + + + + + + + +

JavaScript运算符优先级

+

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。

+
+

优先级汇总表

下面的表将所有运算符按照优先级的不同从高(20+)到低(1)排列。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
优先级运算类型关联性运算符
21圆括号n/a(不相关)( … )
20成员访问从左到右… . …
需计算的成员访问从左到右… [ … ]
new (带参数列表)n/anew … ( … )
函数调用从左到右… ( … )
可选链(Optional chaining)从左到右?.
19new (无参数列表)从右到左new …
18后置递增(运算符在后)n/a
+  
… ++
后置递减(运算符在后)… --
17逻辑非从右到左! …
按位非~ …
一元加法+ …
一元减法- …
前置递增++ …
前置递减-- …
typeoftypeof …
voidvoid …
deletedelete …
awaitawait …
16从右到左… ** …
15乘法从左到右
+  
… * …
除法… / …
取模… % …
14加法从左到右
+  
… + …
减法… - …
13按位左移从左到右… << …
按位右移… >> …
无符号右移… >>> …
12小于从左到右… < …
小于等于… <= …
大于… > …
大于等于… >= …
in… in …
instanceof… instanceof …
11等号从左到右
+  
… == …
非等号… != …
全等号… === …
非全等号… !== …
10按位与从左到右… & …
9按位异或从左到右… ^ …
8按位或从左到右… | …
7逻辑与从左到右… && …
6逻辑或从左到右… || …
5空值合并从左到右… ?? …
4条件运算符从右到左… ? … : …
3赋值从右到左… = …
… += …
… -= …
… **= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
… &&= …
… ||= …
… ??= …
2yield从右到左yield …
yield*yield* …
1展开运算符n/a... …
0逗号从左到右… , …
+ +

示例

1
2
3
4
5
6
7
8
9
A && B
// 若A为true,则return B。若A为false,return A

A || B
// 若A为true,return A。若A为false,则return B

false || 3 && 2
// ||的左侧为false,所以返回(3 && 2)的结果;
// 又,3为true,所以直接返回2
+ +

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/04/08/JavaScript%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" "b/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" new file mode 100644 index 000000000..2a966d972 --- /dev/null +++ "b/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" @@ -0,0 +1,396 @@ +2021前端知识点总结 | 淳淳同学的个人博客 + + + + + + + + + + + + +

2021前端知识点总结

+ +

目录

[TOC]

+

JavaScript

    +
  1. +
+
    +
  • +
+
    +
  1. +
+
    +
  • +
+

Vue 2.x

    +
  1. BiliBili: Vue 2.x 源码解读(12) —— path阶段
  2. +
+
    +
  • Emm…,慢慢看
  • +
+
    +
  1. v-if和v-for哪个优先级更高?如果两个同时出现,应该怎么优化得到更好的性能?
  2. +
+
    +
  • 源码: compiler/codegen/index.js
  • +
  • Vue 2.x版本中,v-if的优先级大于v-for
  • +
  • Vue 3.x版本中,v-for的优先级大于v-if
  • +
  • render函数: with(this){return _c('div', { ... })}
  • +
+
    +
  1. Vue组件data为什么必须是个函数而Vue的根实例则没有此限制?
  2. +
+
    +
  • 源码: src\core\instance\state.js - initData()
  • +
  • Vue组件可能存在多个实例,如果使用对象形式定义data,则会导致它们共用一个data对象,那么状态变更将会影响所有组件实例,这是不合理的
  • +
  • 采用函数形式定义,在initData时会将其作为工厂函数返回全新data对象,有效规避多实例之间状态污染问题
  • +
  • 而在Vue根实例创建过程中则不存在该限制,也是因为根实例只能有一个,不需要担心这种情况
  • +
+
    +
  1. 你知道vue中key的作用和工作原理吗?说说你对它的理解。
  2. +
+
    +
  • 源码: src\core\vdom\patch.js - updateChildren()
  • +
  • key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两 个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少DOM操 作量,提高性能
  • +
  • 另外,若不设置key还可能在列表更新时引发一些隐蔽的bug(暂时未知)
  • +
  • vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果
  • +
+
    +
  1. 你怎么理解vue中的diff算法?
  2. +
+
    +
  • 源码1: 必要性,lifecycle.js - mountComponent()
      +
    • 组件中可能存在很多个data中的key使用
    • +
    +
  • +
  • 源码2: 执行方式,patch.js - patchVnode()
      +
    • patchVnode是diff发生的地方,整体策略: 深度优先,同层比较
    • +
    +
  • +
  • 源码3: 高效性,patch.js - updateChildren()
  • +
  • diff算法是虚拟DOM技术的必然产物: 通过新旧虚拟DOM作对比(即diff),将变化的地方更新在真实DOM上
  • +
  • 另外,也需要 diff 高效的执行对比过程,从而降低时间复杂度为O(n)
  • +
  • vue 2.x 中为了降低 Watcher 粒度,每个组件只有一个Watcher与之对应,只有引入diff才能精确找到发生变化的地方
  • +
  • vue中diff执行的时刻是组件实例执行其更新函数时,它会比对上一次渲染结果oldVnode和新的渲染结果newVnode,此过程称为patch
  • +
  • diff过程整体遵循深度优先、同层比较的策略;两个节点之间比较会根据它们是否拥有子节点或者文本节点做不同操作;比较两组子节点是算法的重点,首先假设头尾节点可能相同做首首、尾尾、首尾、尾首4次比对尝试,如果没有找到相同节点才按照通用方式遍历查找,查找结束再按情况处理剩下的节点;借助key通常可以非常精确找到相同节点,因此整个patch过程非常高效。
  • +
+
    +
  1. 谈一谈对vue组件化的理解?
  2. +
+
    +
  • 源码1: 组件定义,src\core\global-api\assets.js
      +
    • vue-loader会编译template为render函数,最终导出的依然是组件配置对象
    • +
    +
  • +
  • 源码2: 组件化优点,lifecycle.js - mountComponent()
      +
    • 组件、Watcher、渲染函数和更新函数之间的关系
    • +
    +
  • +
  • 源码3: 组件化实现: 构造函数,src\core\global-api\extend.js、实例化及挂载,src\core\vdom\patch.js - createElm()
  • +
  • 组件是独立和可复用的代码组织单元。组件系统是 Vue 核心特性之一,它使开发者使用小型、独立和通常可复用的组件构建大型应用;
  • +
  • 组件化开发能大幅提高应用开发效率、测试性、复用性等;
  • +
  • 组件使用按分类有: 页面组件、业务组件、通用组件;
  • +
  • vue的组件是基于配置的,我们通常编写的组件是组件配置而非组件,框架后续会生成其构造函数,它们基于VueComponent,扩展于Vue;
  • +
  • vue中常见组件化技术有: 属性prop,自定义事件,插槽等,它们主要用于组件通信、扩展等;
  • +
  • 合理的划分组件,有助于提升应用性能;
  • +
  • 组件应该是高内聚、低耦合的;
  • +
  • 遵循单向数据流的原则。
  • +
+
    +
  1. 谈一谈对vue设计原则的理解?
  2. +
+
    +
  • 在vue的官网上写着大大的定义和特点: 渐进式JavaScript框架、易用、灵活和高效
  • +
+
    +
  1. 谈谈你对MVC、MVP和MVVM的理解?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你了解哪些Vue性能优化方法?
  2. +
+
    +
  • 路由懒加载
  • +
  • keep-alive缓存页面
  • +
  • 使用v-show复用DOM
  • +
  • v-for 遍历避免同时使用 v-if
  • +
  • 长列表性能优化,静态列表:list = Object.freeze([])
  • +
  • 虚拟滚动:vxe-table
  • +
  • 事件的销毁,Vue 组件销毁时,会自动解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。beforeDestroy() { clearInterval(this.timer) }
  • +
  • 图片懒加载,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域 内的图片先不做加载,等到滚动到可视区域后再去加载。参考项目:vue-lazyload,代码:<img v-lazy="/static/img/1.png">
  • +
  • 第三方插件按需引入,import { Button, Select } from 'element-ui';
  • +
  • 无状态的组件标记为函数式组件,<template functional> ... </template>
  • +
  • 子组件分割,独立可复用功能可抽象出来
  • +
  • 变量本地化,如果有for循环等频繁访问this.xxx的情况,提前赋值给本地变量
  • +
  • SSR
  • +
+
    +
  1. 简单说一说vuex使用及其理解?
  2. +
+
    +
  • Vuex实现了一个单向数据流,在全局拥有一个state存放数据,当组件要更改state中的数据时,必须通过mutation提交修改信息,mutation同时提供了订阅者模式供外部插件调用获取state数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作 需要走action,但action也是无法直接修改state的,还是需要通过mutation来修改state的数据。最后,根据state的变化,渲染到视图上。
  • +
+
    +
  1. vue中组件之间的通信方式?
  2. +
+
    +
  • props ★★
      +
    • 父组件 A 通过 props 向子组件 B 传递值, B 组件传递 A 组件通过 $emit A 组件通过 v-on/@ 触发
    • +
    • 子组件通过 events 给父组件发送消息,实际上就是子组件把自己的数据发送到父组件。
    • +
    +
  • +
  • $emit/$on 事件总线 ★★ +
  • +
  • vuex ★★★
      +
    • 结合localStorage保存登录信息及权限列表等
    • +
    +
  • +
  • $parent/$children
  • +
  • $attrs/$listeners
      +
    • 多级组件嵌套需要传递数据时,通常使用的方法是通过vuex。但如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,未免有点大材小用。为此Vue2.4 版本提供了另一种方法。
    • +
    • $attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个 组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件。通常配合 interitAttrs 选项一起使用。
    • +
    • $listeners: 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v- on=”$listeners” 传入内部组件
    • +
    +
  • +
  • provide/inject ★★★
      +
    • 优点:使用简单 缺点:不是响应式
    • +
    • 父级:provide: { name: '王者峡谷' //这种绑定是不可响应的 }name: this会有响应式,把当前组件实例传递下去,但子组件会绑定一些多余的属性,比如props、methonds等)
    • +
    • 子级:inject: ['name'] }
    • +
    +
  • +
+
    +
  1. vue-router 中的导航钩子由那些?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 什么是递归组件?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 说一说vue响应式理解?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. vue如果想要扩展某个组件现有组件时怎么做?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. vue为什么要求组件模版只能有一个根元素?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. watch和computed的区别以及怎么选用?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你知道nextTick的原理吗?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 你知道vue双向数据绑定的原理吗?
  2. +
+
    +
  • 源码: compiler
  • +
+
    +
  1. 简单说一说vue生命周期的理解?
  2. +
+
    +
  • 源码: compiler
  • +
+

Vue 3.x

    +
  1. vue3.x的新特性研究
  2. +
+
    +
  • Emm…,慢慢看
  • +
+

Webpack

    +
  1. +
+
    +
  • +
+

Css & Css3

    +
  1. +
+
    +
  • +
+

项目结构化?

    +
  1. +
+
    +
  • +
+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/05/24/2021%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E6%80%BB%E7%BB%93/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" new file mode 100644 index 000000000..8f9556d6f --- /dev/null +++ "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" @@ -0,0 +1,346 @@ +【个人开源】Vue3 轮播组件: v3-carousel | 淳淳同学的个人博客 + + + + + + + + + + + + +

【个人开源】Vue3 轮播组件: v3-carousel

+

引水方知开源不易

+

与朋友首次开源了一个轮播插件,希望大家积极品尝

+
+

介绍

基于 vue3 composition api 编写的轮播插件,多种属性适配,轮播内容 可完全自定义,基本可以满足大部分的轮播需求。

+

基本功能介绍:

+
    +
  • 是否开启自动轮播,自定义轮播时间
  • +
  • 鼠标移入后暂停轮播,鼠标移出后重置轮播
  • +
  • 点击 左侧/右侧 切换按钮,手动切换
  • +
  • 点击 底部轮播指示器,手动切换
  • +
  • 切换按钮 与 轮播指示器,可设置 hover 展示
  • +
  • 左侧切换向左滚动,右侧切换向右滚动
  • +
  • +
+

在线Demo:正在制作…

+

安装

1
npm install v3-carousel
+

or

+
1
yarn add v3-carousel
+

使用

main.js

+
1
2
3
4
5
6
import { createApp } from "vue";
import App from "./App.vue";
import Carousel from "v3-carousel"; // 引入

const app = createApp(App)
app.use(Carousel).mount('#app') // 使用
+ +
+

注意点:将你需要显示的图片使用CarouselItem包裹起来(创建CarouselItem暂时必须使用v-for循环完成,因为我需要使用到idx来操作),完成之后你还需要将这些CarouselItem用一个大的Carousel包裹起来,再给Carousel添加你需要的属性,好了,到这里一个实例就完成了,你可以去网页上查看轮播图了

+
+

App.vue

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<template>
<div class="app">
<Carousel
:autoplay="true"
:duration="2000"
:initIndex="2"
:direction="true"
directionMode="hover"
:directionSize="20"
directionColor="skyblue"
:indicator="true"
indicatorMode="always"
indicatorColor="white"
indicatorActiveColor="skyblue"
@before-moving="beforeMoving"
@after-moving="afterMoving"
>
<CarouselItem v-for="(item, index) in data" :key="index" :idx="index">
<img :src="item" />
</CarouselItem>
</Carousel>
</div>
</template>

<script>
import { defineComponent, reactive, toRefs } from "vue";
export default defineComponent({
name: "App",
setup() {
const state = reactive({
data: [
"https://ns-strategy.cdn.bcebos.com/ns-strategy/upload/fc_big_pic/part-00693-2745.jpg",
"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2190440116,1436403087&fm=26&gp=0.jpg",
"https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3593656793,3600757928&fm=26&gp=0.jpg",
],
});

function beforeMoving(dire) {
console.log("before", dire);
},
function afterMoving(obj) {
console.log("after", obj);
},

return {
...toRefs(state),
beforeMoving,
afterMoving,
};
},
});
</script>
+ + +

参数

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
property nametypedefault valuemeaning
containerWidthString100%设置整个carousel容器的宽度,当然你也可以使用vw,rem,em等像素单位
containerHeightString100%设置整个carousel容器的g高度,同上
durationNumber3000轮播间隔是多久一次
initIndexNumber0初始化显示的图片索引
autoplayBooleantrue是否自动开始轮播
directionBooleantrue是否需要切换按钮(即 上、下一张按钮)
directionModeStringalways切换按钮的展示方式,可选 always、hover
directionColorStringwhite切换按钮的颜色
directionSizeNumber25切换按钮的大小,单位(px)
indicatorBooleantrue是否需要轮播图指示器(底部当前选中标识)
indicatorModeStringalways切换按钮的展示方式,可选 always、hover
indicatorColorString#FFFFFF80未选中时的指示器颜色
indicatorActiveColorString#FFFFFF选中时的指示器颜色
+ + + + + + + + + + + + + + + + + + +
event Nameparmasmeaning
@before-moving该钩子函数拥有一个对象参数,你可以获取到它们:轮播的方向(direction)以及当前轮播的索引(index)视图移动前会执行的钩子函数,如果您想在轮播图轮播前做一些逻辑可以使用该钩子
@after-moving同上…视图移动完成后会执行的钩子函数,如果您想在轮播图轮播完成之后做一些逻辑可以使用该钩子
+

CarouselItem 组件选项(Props)

+ + + + + + + + + + + + + + +
property nametypedefault valuemeaning
idxNumber0每个子实例对应的索引,一般用 v-for 中的第二个参数即可
+

联系方式

+

使用如果出现问题欢迎来讨论,觉得好用的话就点个 star 吧,o( ̄▽ ̄)o

+

有什么建议欢迎大佬们提交 pr,谢谢!

+
+

repo归属者

    +
  • WeChat: x972761675
  • +
  • 前端qq交流群: 700785102
  • +
+

目前维护者: 淳淳同学

+

相关链接

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
\ No newline at end of file diff --git "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" new file mode 100644 index 000000000..03eed387d --- /dev/null +++ "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" @@ -0,0 +1,584 @@ +Vue源码解读(知识点总结) | 淳淳同学的个人博客 + + + + + + + + + + + + +

Vue源码解读(知识点总结)

+

为了方便自己对知识点的巩固和理解,整理了李永宁大佬 12 篇《Vue源码解读》的文末知识点总结,在这里可以一览天下。如果想看详细文章,可点击标题下方的“阅读原文”即可。

+
+

(1)前言

阅读原文

+

(2)Vue 初始化过程

阅读原文

+

Vue 的初始化过程(new Vue(options))都做了什么?

    +
  • 处理组件配置项
      +
    • 初始化根组件时进行了选项合并操作,将全局配置合并到根组件的局部配置上
    • +
    • 初始化每个子组件时做了一些性能优化,将组件配置对象上的一些深层次属性放到 vm.$options 选项中,以提高代码的执行效率
    • +
    +
  • +
  • 初始化组件实例的关系属性,比如 $parent、$children、$root、$refs 等
  • +
  • 处理自定义事件
  • +
  • 调用 beforeCreate 钩子函数
  • +
  • 初始化组件的 inject 配置项,得到 ret[key] = val 形式的配置对象,然后对该配置对象进行响应式处理,并代理每个 key 到 vm 实例上
  • +
  • 数据响应式,处理 props、methods、data、computed、watch 等选项
  • +
  • 解析组件配置项上的 provide 对象,将其挂载到 vm._provided 属性上
  • +
  • 调用 created 钩子函数
  • +
  • 如果发现配置项上有 el 选项,则自动调用 $mount 方法,也就是说有了 el 选项,就不需要再手动调用 $mount 方法,反之,没提供 el 选项则必须调用 $mount
  • +
  • 接下来则进入挂载阶段
  • +
+

(3)响应式原理

阅读原文

+

Vue 响应式原理是怎么实现的?

    +
  • 响应式的核心是通过 Object.defineProperty 拦截对数据的访问和设置
  • +
  • 响应式的数据分为两类:
      +
    • 对象,循环遍历对象的所有属性,为每个属性设置 getter、setter,以达到拦截访问和设置的目的,如果属性值依旧为对象,则递归为属性值上的每个 key 设置 getter、setter
        +
      • 访问数据时(obj.key)进行依赖收集,在 dep 中存储相关的 watcher
      • +
      • 设置数据时由 dep 通知相关的 watcher 去更新
      • +
      +
    • +
    • 数组,增强数组的那 7 个可以更改自身的原型方法,然后拦截对这些方法的操作
        +
      • 添加新数据时进行响应式处理,然后由 dep 通知 watcher 去更新
      • +
      • 删除数据时,也要由 dep 通知 watcher 去更新
      • +
      +
    • +
    +
  • +
+

methods、computed 和 watch 有什么区别?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<!DOCTYPE html>
<html lang="en">

<head>
<title>methods、computed、watch 有什么区别</title>
</head>

<body>
<div id="app">
<!-- methods -->
<div>{{ returnMsg() }}</div>
<div>{{ returnMsg() }}</div>
<!-- computed -->
<div>{{ getMsg }}</div>
<div>{{ getMsg }}</div>
</div>
<script src="../../dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'test'
},
mounted() {
setTimeout(() => {
this.msg = 'msg is changed'
}, 1000)
},
methods: {
returnMsg() {
console.log('methods: returnMsg')
return this.msg
}
},
computed: {
getMsg() {
console.log('computed: getMsg')
return this.msg + ' hello computed'
}
},
watch: {
msg: function(val, oldVal) {
console.log('watch: msg')
new Promise(resolve => {
setTimeout(() => {
this.msg = 'msg is changed by watch'
}, 1000)
})
}
}
})
</script>
</body>

</html>
+ +

methodsComputedWatch.gif

+

示例其实就是答案了

+
    +
  • 使用场景
      +
    • methods 一般用于封装一些较为复杂的处理逻辑(同步、异步)
    • +
    • computed 一般用于封装一些简单的同步逻辑,将经过处理的数据返回,然后显示在模版中,以减轻模版的重量
    • +
    • watch 一般用于当需要在数据变化时执行异步或开销较大的操作
    • +
    +
  • +
  • 区别
      +
    • methods VS computed
        +
      • 通过示例会发现,如果在一次渲染中,有多个地方使用了同一个 methods 或 computed 属性,methods 会被执行多次,而 computed 的回调函数则只会被执行一次。
      • +
      • 通过阅读源码我们知道,在一次渲染中,多次访问 computedProperty,只会在第一次执行 computed 属性的回调函数,后续的其它访问,则直接使用第一次的执行结果(watcher.value),而这一切的实现原理则是通过对 watcher.dirty 属性的控制实现的。而 methods,每一次的访问则是简单的方法调用(this.xxMethods)。
      • +
      +
    • +
    • computed VS watch
        +
      • 通过阅读源码我们知道,computed 和 watch 的本质是一样的,内部都是通过 Watcher 来实现的,其实没什么区别,非要说区别的化就两点:1、使用场景上的区别,2、computed 默认是懒执行的,切不可更改。
      • +
      +
    • +
    • methods VS watch
        +
      • methods 和 watch 之间其实没什么可比的,完全是两个东西,不过在使用上可以把 watch 中一些逻辑抽到 methods 中,提高代码的可读性。
      • +
      +
    • +
    +
  • +
+

(4)异步更新

阅读原文

+

Vue 的异步更新机制是如何实现的?

    +
  • Vue 的异步更新机制的核心是利用了浏览器的异步任务队列来实现的,首选微任务队列,宏任务队列次之。
  • +
  • 当响应式数据更新后,会调用 dep.notify 方法,通知 dep 中收集的 watcher 去执行 update 方法,watcher.update 将 watcher 自己放入一个 watcher 队列(全局的 queue 数组)。
  • +
  • 然后通过 nextTick 方法将一个刷新 watcher 队列的方法(flushSchedulerQueue)放入一个全局的 callbacks 数组中。
  • +
  • 如果此时浏览器的异步任务队列中没有一个叫 flushCallbacks 的函数,则执行 timerFunc 函数,将 flushCallbacks 函数放入异步任务队列。如果异步任务队列中已经存在 flushCallbacks 函数,等待其执行完成以后再放入下一个 flushCallbacks 函数。
  • +
  • flushCallbacks 函数负责执行 callbacks 数组中的所有 flushSchedulerQueue 函数。
  • +
  • flushSchedulerQueue 函数负责刷新 watcher 队列,即执行 queue 数组中每一个 watcher 的 run 方法,从而进入更新阶段,比如执行组件更新函数或者执行用户 watch 的回调函数。
  • +
  • 完整的执行过程其实就是今天源码阅读的过程。
  • +
+

Vue 的 nextTick API 是如何实现的?

Vue.nextTick 或者 vm.$nextTick 的原理其实很简单,就做了两件事:

+
    +
  • 将传递的回调函数用 try catch 包裹然后放入 callbacks 数组
  • +
  • 执行 timerFunc 函数,在浏览器的异步任务队列放入一个刷新 callbacks 数组的函数
  • +
+

(5)全局 API

阅读原文

+

Vue.use(plugin) 做了什么?

负责安装 plugin 插件,其实就是执行插件提供的 install 方法。

+
    +
  • 首先判断该插件是否已经安装过
  • +
  • 如果没有,则执行插件提供的 install 方法安装插件,具体做什么有插件自己决定
  • +
+

Vue.mixin(options) 做了什么?

负责在 Vue 的全局配置上合并 options 配置。然后在每个组件生成 vnode 时会将全局配置合并到组件自身的配置上来。

+
    +
  • 标准化 options 对象上的 props、inject、directive 选项的格式
  • +
  • 处理 options 上的 extends 和 mixins,分别将他们合并到全局配置上
  • +
  • 然后将 options 配置和全局配置进行合并,选项冲突时 options 配置会覆盖全局配置
  • +
+

Vue.component(compName, Comp) 做了什么?

负责注册全局组件。其实就是将组件配置注册到全局配置的 components 选项上(options.components),然后各个子组件在生成 vnode 时会将全局的 components 选项合并到局部的 components 配置项上。

+
    +
  • 如果第二个参数为空,则表示获取 compName 的组件构造函数
  • +
  • 如果 Comp 是组件配置对象,则使用 Vue.extend 方法得到组件构造函数,否则直接进行下一步
  • +
  • 在全局配置上设置组件信息,this.options.components.compName = CompConstructor
  • +
+

Vue.directive(‘my-directive’, {xx}) 做了什么?

在全局注册 my-directive 指令,然后每个子组件在生成 vnode 时会将全局的 directives 选项合并到局部的 directives 选项中。原理同 Vue.component 方法:

+
    +
  • 如果第二个参数为空,则获取指定指令的配置对象
  • +
  • 如果不为空,如果第二个参数是一个函数的话,则生成配置对象 { bind: 第二个参数, update: 第二个参数 }
  • +
  • 然后将指令配置对象设置到全局配置上,this.options.directives[‘my-directive’] = {xx}
  • +
+

Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?

负责在全局注册过滤器 my-filter,然后每个子组件在生成 vnode 时会将全局的 filters 选项合并到局部的 filters 选项中。原理是:

+
    +
  • 如果没有提供第二个参数,则获取 my-filter 过滤器的回调函数
  • +
  • 如果提供了第二个参数,则是设置 this.options.filters[‘my-filter’] = function(val) {xx}。
  • +
+

Vue.extend(options) 做了什么?

Vue.extend 基于 Vue 创建一个子类,参数 options 会作为该子类的默认全局配置,就像 Vue 的默认全局配置一样。所以通过 Vue.extend 扩展一个子类,一大用处就是内置一些公共配置,供子类的子类使用。

+
    +
  • 定义子类构造函数,这里和 Vue 一样,也是调用 _init(options)
  • +
  • 合并 Vue 的配置和 options,如果选项冲突,则 options 的选项会覆盖 Vue 的配置项
  • +
  • 给子类定义全局 API,值为 Vue 的全局 API,比如 Sub.extend = Super.extend,这样子类同样可以扩展出其它子类
  • +
  • 返回子类 Sub
  • +
+

Vue.set(target, key, val) 做了什么?

由于 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = ‘hi’),所以通过 Vue.set 为向响应式对象中添加一个 property,可以确保这个新 property 同样是响应式的,且触发视图更新。

+
    +
  • 更新数组指定下标的元素:Vue.set(array, idx, val),内部通过 splice 方法实现响应式更新
  • +
  • 更新对象已有属性:Vue.set(obj, key ,val),直接更新即可 => obj[key] = val
  • +
  • 不能向 Vue 实例或者 $data 动态添加根级别的响应式数据
  • +
  • Vue.set(obj, key, val),如果 obj 不是响应式对象,会执行 obj[key] = val,但是不会做响应式处理
  • +
  • Vue.set(obj, key, val),为响应式对象 obj 增加一个新的 key,则通过 defineReactive 方法设置响应式,并触发依赖更新
  • +
+

面试官 问:Vue.delete(target, key) 做了什么?

删除对象的 property。如果对象是响应式的,确保删除能触发更新视图。这个方法主要用于避开 Vue 不能检测到 property 被删除的限制,但是你应该很少会使用它。当然同样不能删除根级别的响应式属性。

+
    +
  • Vue.delete(array, idx),删除指定下标的元素,内部是通过 splice 方法实现的
  • +
  • 删除响应式对象上的某个属性:Vue.delete(obj, key),内部是执行 delete obj.key,然后执行依赖更新即可
  • +
+

Vue.nextTick(cb) 做了什么?

Vue.nextTick(cb) 方法的作用是延迟回调函数 cb 的执行,一般用于 this.key = newVal 更改数据后,想立即获取更改过后的 DOM 数据:

+
1
2
3
4
5
this.key = 'new val'

Vue.nextTick(function() {
// DOM 更新了
})
+ +

其内部的执行过程是:

+
    +
  • this.key = ‘new val,触发依赖通知更新,将负责更新的 watcher 放入 watcher 队列
  • +
  • 将刷新 watcher 队列的函数放到 callbacks 数组中
  • +
  • 在浏览器的异步任务队列中放入一个刷新 callbacks 数组的函数
  • +
  • Vue.nextTick(cb) 来插队,将 cb 函数放入 callbacks 数组
  • +
  • 待将来的某个时刻执行刷新 callbacks 数组的函数
  • +
  • 然后执行 callbacks 数组中的众多函数,触发 watcher.run 的执行,更新 DOM
  • +
  • 由于 cb 函数是在后面放到 callbacks 数组,所以这就保证了先完成的 DOM 更新,再执行 cb 函数
  • +
+

(6)实例方法

阅读原文

+

面试官 问:vm.$set(obj, key, val) 做了什么?

vm.$set 用于向响应式对象添加一个新的 property,并确保这个新的 property 同样是响应式的,并触发视图更新。由于 Vue 无法探测对象新增属性或者通过索引为数组新增一个元素,比如:this.obj.newProperty = 'val'this.arr[3] = 'val'。所以这才有了 vm.$set,它是 Vue.set 的别名。

+
    +
  • 为对象添加一个新的响应式数据:调用 defineReactive 方法为对象增加响应式数据,然后执行 dep.notify 进行依赖通知,更新视图
  • +
  • 为数组添加一个新的响应式数据:通过 splice 方法实现
  • +
+

vm.$delete(obj, key) 做了什么?

vm.$delete 用于删除对象上的属性。如果对象是响应式的,且能确保能触发视图更新。该方法主要用于避开 Vue 不能检测属性被删除的情况。它是 Vue.delete 的别名。

+
    +
  • 删除数组指定下标的元素,内部通过 splice 方法来完成
  • +
  • 删除对象上的指定属性,则是先通过 delete 运算符删除该属性,然后执行 dep.notify 进行依赖通知,更新视图
  • +
+

vm.$watch(expOrFn, callback, [options]) 做了什么?

vm.$watch 负责观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。当其发生变化时,回调函数就会被执行,并为回调函数传递两个参数,第一个为更新后的新值,第二个为老值。

+

这里需要 注意 一点的是:如果观察的是一个对象,比如:数组,当你用数组方法,比如 push 为数组新增一个元素时,回调函数被触发时传递的新值和老值相同,因为它们指向同一个引用,所以在观察一个对象并且在回调函数中有新老值是否相等的判断时需要注意。

+

vm.$watch 的第一个参数只接收简单的响应式数据的键路径,对于更复杂的表达式建议使用函数作为第一个参数。

+

至于 vm.$watch 的内部原理是:

+
    +
  • 设置 options.user = true,标志是一个用户 watcher
  • +
  • 实例化一个 Watcher 实例,当检测到数据更新时,通过 watcher 去触发回调函数的执行,并传递新老值作为回调函数的参数
  • +
  • 返回一个 unwatch 函数,用于取消观察
  • +
+

vm.$on(event, callback) 做了什么?

监听当前实例上的自定义事件,事件可由 vm.$emit 触发,回调函数会接收所有传入事件触发函数vm.$emit的额外参数。

+

vm.$on 的原理很简单,就是处理传递的 event 和 callback 两个参数,将注册的事件和回调函数以键值对的形式存储到 vm._event 对象中,vm._events = { eventName: [cb1, cb2, ...], ... }

+

vm.$emit(eventName, […args]) 做了什么?

触发当前实例上的指定事件,附加参数都会传递给事件的回调函数。

+

其内部原理就是执行 vm._events[eventName] 中所有的回调函数。

+
+

备注:从 on和on 和 on和emit 的实现原理也能看出,组件的自定义事件其实是谁触发谁监听,所以在这会儿再回头看 Vue 源码解读(2)—— Vue 初始化过程 中关于 initEvent 的解释就会明白在说什么,因为组件自定义事件的处理内部用的就是 vm.on、vm.on、vm.on、vm.emit。

+
+

vm.$off([event, callback]) 做了什么?

移除自定义事件监听器,即移除 vm._events 对象上相关数据。

+
    +
  • 如果没有提供参数,则移除实例的所有事件监听
  • +
  • 如果只提供了 event 参数,则移除实例上该事件的所有监听器
  • +
  • 如果两个参数都提供了,则移除实例上该事件对应的监听器
  • +
+

vm.$once(event, callback) 做了什么?

监听一个自定义事件,但是该事件只会被触发一次。一旦触发以后监听器就会被移除。

+

其内部的实现原理是:

+
    +
  • 包装用户传递的回调函数,当包装函数执行的时候,除了会执行用户回调函数之外还会执行 vm.$off(event, 包装函数) 移除该事件
  • +
  • 用 vm.$on(event, 包装函数) 注册事件
  • +
+

vm._update(vnode, hydrating) 做了什么?

官方文档没有说明该 API,这是一个用于源码内部的实例方法,负责更新页面,是页面渲染的入口,其内部根据是否存在 prevVnode 来决定是首次渲染,还是页面更新,从而在调用 patch 函数时传递不同的参数。该方法在业务开发中不会用到。

+

vm.$forceUpdate() 做了什么?

迫使 Vue 实例重新渲染,它仅仅影响组件实例本身和插入插槽内容的子组件,而不是所有子组件。其内部原理到也简单,就是直接调用 vm._watcher.update(),它就是 watcher.update() 方法,执行该方法触发组件更新。

+

vm.$destroy() 做了什么?

负责完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令和事件监听器。在执行过程中会调用 beforeDestroy 和 destroy 两个钩子函数。在大多数业务开发场景下用不到该方法,一般都通过 v-if 指令来操作。其内部原理是:

+
    +
  • 调用 beforeDestroy 钩子函数
  • +
  • 将自己从老爹肚子里($parent)移除,从而销毁和老爹的关系
  • +
  • 通过 watcher.teardown() 来移除依赖监听
  • +
  • 通过 vm._ _ patch _ _(vnode, null) 方法来销毁节点
  • +
  • 调用 destroyed 钩子函数
  • +
  • 通过 vm.$off 方法移除所有的事件监听
  • +
+

vm.$nextTick(cb) 做了什么?

vm.$nextTick 是 Vue.nextTick 的别名,其作用是延迟回调函数 cb 的执行,一般用于 this.key = newVal 更改数据后,想立即获取更改过后的 DOM 数据:

+
1
2
3
4
5
this.key = 'new val'

Vue.nextTick(function() {
// DOM 更新了
})
+ +

其内部的执行过程是:

+
    +
  • this.key = ‘new val’,触发依赖通知更新,将负责更新的 watcher 放入 watcher 队列
  • +
  • 将刷新 watcher 队列的函数放到 callbacks 数组中
  • +
  • 在浏览器的异步任务队列中放入一个刷新 callbacks 数组的函数
  • +
  • vm.$nextTick(cb) 来插队,直接将 cb 函数放入 callbacks 数组
  • +
  • 待将来的某个时刻执行刷新 callbacks 数组的函数
  • +
  • 然后执行 callbacks 数组中的众多函数,触发 watcher.run 的执行,更新 DOM
  • +
  • 由于 cb 函数是在后面放到 callbacks 数组,所以这就保证了先完成的 DOM 更新,再执行 cb 函数
  • +
+

vm._render 做了什么?

官方文档没有提供该方法,它是一个用于源码内部的实例方法,负责生成 vnode。其关键代码就一行,执行 render 函数生成 vnode。不过其中加了大量的异常处理代码。

+

(7)Hook Event

阅读原文

+

什么是 Hook Event?

Hook Event 是 Vue 的自定义事件结合生命周期钩子实现的一种从组件外部为组件注入额外生命周期方法的功能。

+

Hook Event 是如果实现的?

1
<comp @hook:lifecycleMethod="method" />
+ +
    +
  • 处理组件自定义事件的时候(vm.$on) 如果发现组件有 hook:xx 格式的事件(xx 为 Vue 的生命周期函数),则将 vm._hasHookEvent 置为 true,表示该组件有 Hook Event

    +
  • +
  • 在组件生命周期方法被触发的时候,内部会通过 callHook 方法来执行这些生命周期函数,在生命周期函数执行之后,如果发现 vm._hasHookEvent 为 true,则表示当前组件有 Hook Event,通过 vm.$emit(‘hook:xx’) 触发 Hook Event 的执行

    +
  • +
+

(8)编译器 之 解析

阅读原文(上篇)

+

阅读原文(下篇)

+

面试官 问:简单说一下 Vue 的编译器都做了什么?

Vue 的编译器做了三件事情:

+
    +
  • 将组件的 html 模版解析成 AST 对象
  • +
  • 优化,遍历 AST,为每个节点做静态标记,标记其是否为静态节点,然后进一步标记出静态根节点,这样在后续更新的过程中就可以跳过这些静态节点了;标记静态根用于生成渲染函数阶段,生成静态根节点的渲染函数
  • +
  • 从 AST 生成运行时的渲染函数,即大家说的 render,其实还有一个,就是 staticRenderFns 数组,里面存放了所有的静态节点的渲染函数
  • +
+

详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?

    +
  • 遍历 HTML 模版字符串,通过正则表达式匹配 “<”
  • +
  • 跳过某些不需要处理的标签,比如:注释标签、条件注释标签、Doctype。
      +
    • 备注:整个解析过程的核心是处理开始标签和结束标签
    • +
    +
  • +
  • 解析开始标签
      +
    • 得到一个对象,包括 标签名(tagName)、所有的属性(attrs)、标签在 html 模版字符串中的索引位置
    • +
    • 进一步处理上一步得到的 attrs 属性,将其变成 [{ name: attrName, value: attrVal, start: xx, end: xx }, …] 的形式
    • +
    • 通过标签名、属性对象和当前元素的父元素生成 AST 对象,其实就是一个 普通的 JS 对象,通过 key、value 的形式记录了该元素的一些信息
    • +
    • 接下来进一步处理开始标签上的一些指令,比如 v-pre、v-for、v-if、v-once,并将处理结果放到 AST 对象上
    • +
    • 处理结束将 ast 对象存放到 stack 数组
    • +
    • 处理完成后会截断 html 字符串,将已经处理掉的字符串截掉
    • +
    +
  • +
  • 解析闭合标签
      +
    • 如果匹配到结束标签,就从 stack 数组中拿出最后一个元素,它和当前匹配到的结束标签是一对。
    • +
    • 再次处理开始标签上的属性,这些属性和前面处理的不一样,比如:key、ref、scopedSlot、样式等,并将处理结果放到元素的 AST 对象上
        +
      • 备注:视频中说这块儿有误,回头看了下,没有问题,不需要改,确实是这样
      • +
      +
    • +
    • 然后将当前元素和父元素产生联系,给当前元素的 ast 对象设置 parent 属性,然后将自己放到父元素的 ast 对象的 children 数组中
    • +
    +
  • +
  • 最后遍历完整个 html 模版字符串以后,返回 ast 对象
  • +
+

(9)编译器 之 优化

阅读原文

+

简单说一下 Vue 的编译器都做了什么?

Vue 的编译器做了三件事情:

+
    +
  • 将组件的 html 模版解析成 AST 对象
  • +
  • 优化,遍历 AST,为每个节点做静态标记,标记其是否为静态节点,然后进一步标记出静态根节点,这样在后续更新的过程中就可以跳过这些静态节点了;标记静态根用于生成渲染函数阶段,生成静态根节点的渲染函数
  • +
  • 从 AST 生成运行渲染函数,即大家说的 render,其实还有一个,就是 staticRenderFns 数组,里面存放了所有的静态节点的渲染函数
  • +
+

详细说一下静态标记的过程

    +
  • 标记静态节点
      +
    • 通过递归的方式标记所有的元素节点
    • +
    • 如果节点本身是静态节点,但是存在非静态的子节点,则将节点修改为非静态节点
    • +
    +
  • +
  • 标记静态根节点,基于静态节点,进一步标记静态根节点
      +
    • 如果节点本身是静态节点 && 而且有子节点 && 子节点不全是文本节点,则标记为静态根节点
    • +
    • 如果节点本身不是静态根节点,则递归的遍历所有子节点,在子节点中标记静态根
    • +
    +
  • +
+

什么样的节点才可以被标记为静态节点?

    +
  • 文本节点
  • +
  • 节点上没有 v-bind、v-for、v-if 等指令
  • +
  • 非组件
  • +
+

(10)编译器 之 生成渲染函数

阅读原文

+

简单说一下 Vue 的编译器都做了什么?

Vue 的编译器做了三件事情:

+
    +
  • 将组件的 html 模版解析成 AST 对象
  • +
  • 优化,遍历 AST,为每个节点做静态标记,标记其是否为静态节点,然后进一步标记出静态根节点,这样在后续更新的过程中就可以跳过这些静态节点了;标记静态根用于生成渲染函数阶段,生成静态根节点的渲染函数
  • +
  • 从 AST 生成运行渲染函数,即大家说的 render,其实还有一个,就是 staticRenderFns 数组,里面存放了所有的静态节点的渲染函数
  • +
+

详细说一下渲染函数的生成过程

大家一说到渲染函数,基本上说的就是 render 函数,其实编译器生成的渲染有两类:

+
    +
  • 第一类就是一个 render 函数,负责生成动态节点的 vnode
  • +
  • 第二类是放在一个叫 staticRenderFns 数组中的静态渲染函数,这些函数负责生成静态节点的 vnode
    渲染函数生成的过程,其实就是在遍历 AST 节点,通过递归的方式,处理每个节点,最后生成形如:_c(tag, attr, children, normalizationType) 的结果。tag 是标签名,attr 是属性对象,children 是子节点组成的数组,其中每个元素的格式都是 _c(tag, attr, children, normalizationTYpe) 的形式,normalization 表示节点的规范化类型,是一个数字 0、1、2,不重要。
  • +
+

在处理 AST 节点过程中需要大家重点关注也是面试中常见的问题有:

+
    +
  • 静态节点是怎么处理的(静态节点的处理分为两步)?
      +
    • 将生成静态节点 vnode 函数放到 staticRenderFns 数组中
    • +
    • 返回一个 _m(idx) 的可执行函数,意思是执行 staticRenderFns 数组中下标为 idx 的函数,生成静态节点的 vnode
    • +
    +
  • +
  • v-once、v-if、v-for、组件 等都是怎么处理的?
      +
    • 单纯的 v-once 节点处理方式和静态节点一致
    • +
    • v-if 节点的处理结果是一个三元表达式
    • +
    • v-for 节点的处理结果是可执行的 _l 函数,该函数负责生成 v-for 节点的 vnode
    • +
    • 组件的处理结果和普通元素一样,得到的是形如 _c(compName) 的可执行代码,生成组件的 vnode
    • +
    +
  • +
+

碎碎念

到这里,Vue 编译器 的源码解读就结束了。相信大家在阅读的过程中不免会产生云里雾里的感觉。这个没什么,编译器这块儿确实是比较复杂,可以说是整个框架最难理解也是代码量最大的一部分了。一定要静下心来多读几遍,遇到无法理解的地方,一定要勤动手,通过示例代码加断点调试的方式帮助自己理解。

+

当你读完几遍以后,这时候情况可能就会好一些,但是有些地方可能还会有些晕,这没事,正常。毕竟这是一个框架的编译器,要处理的东西太多太多了,你只需要理解其核心思想(模版解析、静态标记、代码生成)就可以了。后面会有 手写 Vue 系列,编译器这部分会有一个简版的实现,帮助加深对这部分知识的理解。

+

编译器读完以后,会发现有个不明白的地方:编译器最后生成的代码都是经过 with 包裹的,比如:

+
1
2
3
<div id="app">
<div v-for="item in arr" :key="item">{{ item }}</div>
</div>
+ +

经过编译后生成:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
with (this) {
return _c(
'div',
{
attrs:
{
"id": "app"
}
},
_l(
(arr),
function (item) {
return _c(
'div',
{
key: item
},
[_v(_s(item))]
)
}
),
0
)
}
+ +

都知道,with 语句可以扩展作用域链,所以生成的代码中的 _c_l_v_s 都是 this 上一些方法,也就是说在运行时执行这些方法可以生成各个节点的 vnode。

+

所以联系前面的知识,响应式数据更新的整个执行过程就是:

+
    +
  • 响应式拦截到数据的更新
  • +
  • dep 通知 watcher 进行异步更新
  • +
  • watcher 更新时执行组件更新函数 updateComponent
  • +
  • 首先执行 vm._render 生成组件的 vnode,这时就会执行编译器生成的函数
  • +
+

问题:

+
    +
  • 渲染函数中的 _c、_l、、_v、_s 等方法是什么?
  • +
  • 它们是如何生成 vnode 的?
  • +
+

下一篇文章 Vue 源码解读(11)—— render helper 将会带来这部分知识的详细解读,也是面试经常被问题的:比如:v-for 的原理是什么?

+

(11)render helper

阅读原文

+

一个组件是如何变成 VNode?

    +
  • 组件实例初始化,最后执行 $mount 进入挂载阶段
  • +
  • 如果是只包含运行时的 vue.js,只直接进入挂载阶段,因为这时候的组件已经变成了渲染函数,编译过程通过模块打包器 + vue-loader + vue-template-compiler 完成的
  • +
  • 如果没有使用预编译,则必须使用全量的 vue.js
  • +
  • 挂载时如果发现组件配置项上没有 render 选项,则进入编译阶段
  • +
  • 将模版字符串编译成 AST 语法树,其实就是一个普通的 JS 对象
  • +
  • 然后优化 AST,遍历 AST 对象,标记每一个节点是否为静态静态;然后再进一步标记出静态根节点,在组件后续更新时会跳过这些静态节点的更新,以提高性能
  • +
  • 接下来从 AST 生成渲染函数,生成的渲染函数有两部分组成:
      +
    • 负责生成动态节点 VNode 的 render 函数
    • +
    • 还有一个 staticRenderFns 数组,里面每一个元素都是一个生成静态节点 VNode 的函数,这些函数会作为 render 函数的组成部分,负责生成静态节点的 VNode
    • +
    +
  • +
  • 接下来将渲染函数放到组件的配置对象上,进入挂载阶段,即执行 mountComponent 方法
  • +
  • 最终负责渲染组件和更新组件的是一个叫 updateComponent 方法,该方法每次执行前首先需要执行 vm._render 函数,该函数负责执行编译器生成的 render,得到组件的 VNode
  • +
  • 将一个组件生成 VNode 的具体工作是由 render 函数中的 _c_o_l_m 等方法完成的,这些方法都被挂载到 Vue 实例上面,负责在运行时生成组件 VNode
  • +
+
+

提示:到这里首先要明白什么是 VNode,一句话描述就是 —— 组件模版的 JS 对象表现形式,它就是一个普通的 JS 对象,详细描述了组件中各节点的信息

+
+
+

下面说的有点多,其实记住一句就可以了,设置组件配置信息,然后通过 new VNode(组件信息) 生成组件的 VNode

+
+
    +
  • _c,负责生成组件或 HTML 元素的 VNode,_c 是所有 render helper 方法中最复杂,也是最核心的一个方法,其它的 _xx 都是它的组成部分
      +
    • 接收标签、属性 JSON 字符串、子节点数组、节点规范化类型作为参数
    • +
    • 如果标签是平台保留标签或者一个未知的元素,则直接 new VNode(标签信息) 得到 VNode
    • +
    • 如果标签是一个组件,则执行 createComponent 方法生成 VNode
        +
      • 函数式组件执行自己的 render 函数生成 VNode
      • +
      • 普通组件则实例化一个 VNode,并且在在 data.hook 对象上设置 4 个方法,在组件的 patch 阶段会被调用,从而进入子组件的实例化、挂载阶段,然后进行编译生成渲染函数,直至完成渲染
      • +
      • 当然生成 VNode 之前会进行一些配置处理比如:
          +
        • 子组件选项合并,合并全局配置项到组件配置项上
        • +
        • 处理自定义组件的 v-model
        • +
        • 处理组件的 props,提取组件的 props 数据,以组件的 props 配置中的属性为 key,父组件中对应的数据为 value 生成一个 propsData 对象;当组件更新时生成新的 VNode,又会进行这一步,这就是 props 响应式的原理
        • +
        • 处理其它数据,比如监听器
        • +
        • 安装内置的 init、prepatch、insert、destroy 钩子到 data.hooks 对象上,组件 patch 阶段会用到这些钩子方法
        • +
        +
      • +
      +
    • +
    +
  • +
  • _l,运行时渲染 v-for 列表的帮助函数,循环遍历 val 值,依次为每一项执行 render 方法生成 VNode,最终返回一个 VNode 数组
  • +
  • _m,负责生成静态节点的 VNode,即执行 staticRenderFns 数组中指定下标的函数
  • +
+

简单总结 render helper 的作用就是:在 Vue 实例上挂载一些运行时的工具方法,这些方法用在编译器生成的渲染函数中,用于生成组件的 VNode。

+

好了,到这里,一个组件从初始化开始到最终怎么变成 VNode 就讲完了,最后剩下的就是 patch 阶段了,下一篇文章将讲述如何将组件的 VNode 渲染到页面上。

+

(12)patch

阅读原文

+

你能说一说 Vue 的 patch 算法吗?

Vue 的 patch 算法有三个作用:负责首次渲染和后续更新或者销毁组件

+
    +
  • 如果老的 VNode 是真实元素,则表示首次渲染,创建整棵 DOM 树,并插入 body,然后移除老的模版节点
  • +
  • 如果老的 VNode 不是真实元素,并且新的 VNode 也存在,则表示更新阶段,执行 patchVnode
      +
    • 首先是全量更新所有的属性
    • +
    • 如果新老 VNode 都有孩子,则递归执行 updateChildren,进行 diff 过程
        +
      • 针对前端操作 DOM 节点的特点进行如下优化:
      • +
      • 同层比较(降低时间复杂度)深度优先(递归)
      • +
      • 而且前端很少有完全打乱节点顺序的情况,所以做了四种假设,假设新老 VNode 的开头结尾存在相同节点,一旦命中假设,就避免了一次循环,降低了 diff 的时间复杂度,提高执行效率。如果不幸没有命中假设,则执行遍历,从老的 VNode 中找到新的 VNode 的开始节点
      • +
      • 找到相同节点,则执行 patchVnode,然后将老节点移动到正确的位置
      • +
      • 如果老的 VNode 先于新的 VNode 遍历结束,则剩余的新的 VNode 执行新增节点操作
      • +
      • 如果新的 VNode 先于老的 VNode 遍历结束,则剩余的老的 VNode 执行删除操纵,移除这些老节点
      • +
      +
    • +
    • 如果新的 VNode 有孩子,老的 VNode 没孩子,则新增这些新孩子节点
    • +
    • 如果老的 VNode 有孩子,新的 VNode 没孩子,则删除这些老孩子节点
    • +
    • 剩下一种就是更新文本节点
    • +
    +
  • +
  • 如果新的 VNode 不存在,老的 VNode 存在,则调用 destroy,销毁老节点
  • +
+

碎碎念

好了,到这里,Vue 源码解读系列就结束了,如果你认认真真的读完整个系列的文章,相信你对 Vue 源码已经相当熟悉了,不论是从宏观层面理解,还是某些细节方面的详解,应该都没问题。即使有些细节现在不清楚,但是当遇到问题时,你也能一眼看出来该去源码的什么位置去找答案。

+

到这里你可以试着在自己的脑海中复述一下 Vue 的整个执行流程。过程很重要,但 总结 才是最后的升华时刻。如果在哪个环节卡住了,可再回去读相应的部分就可以了。

+

还记得系列的第一篇文章中提到的目标吗?相信阅读几遍下来,你一定可以在自己的简历中写到:精通 Vue 框架的源码原理

+

接下来会开始 Vue 的手写系列。

+
+

作者:李永宁

+

链接:https://juejin.cn/user/1028798616461326

+

来源:掘金

+

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

+
+

作者介绍

+

祝君无Bug~

Author: 淳淳同学
Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Announcement
This is my Blog
Contents
  1. 1. (1)前言
  2. 2. (2)Vue 初始化过程
    1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file diff --git a/2024/12/30/hello-world/index.html b/2024/12/30/hello-world/index.html new file mode 100644 index 000000000..735a963be --- /dev/null +++ b/2024/12/30/hello-world/index.html @@ -0,0 +1,174 @@ +Hello World | 淳淳同学的个人博客 + + + + + + + + + + + +

    Hello World

    Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    +

    Quick Start

    Create a new post

    1
    $ hexo new "My New Post"
    + +

    More info: Writing

    +

    Run server

    1
    $ hexo server
    + +

    More info: Server

    +

    Generate static files

    1
    $ hexo generate
    + +

    More info: Generating

    +

    Deploy to remote sites

    1
    $ hexo deploy
    + +

    More info: Deployment

    +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2024/12/30/hello-world/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..3844da8d7 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +blog.leedebug.cn \ No newline at end of file diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html new file mode 100644 index 000000000..33f775bf1 --- /dev/null +++ b/archives/2020/06/index.html @@ -0,0 +1,237 @@ +June 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html new file mode 100644 index 000000000..398f07109 --- /dev/null +++ b/archives/2020/07/index.html @@ -0,0 +1,237 @@ +July 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html new file mode 100644 index 000000000..61541ad77 --- /dev/null +++ b/archives/2020/08/index.html @@ -0,0 +1,237 @@ +August 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 1
    2020
    2020前端面试
    2020前端面试
    \ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html new file mode 100644 index 000000000..e75bbf348 --- /dev/null +++ b/archives/2020/10/index.html @@ -0,0 +1,237 @@ +October 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 1
    2020
    qiankun 2.0.24 爬坑记录
    qiankun 2.0.24 爬坑记录
    \ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html new file mode 100644 index 000000000..839273680 --- /dev/null +++ b/archives/2020/11/index.html @@ -0,0 +1,237 @@ +November 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 2
    2020
    jsdelivr
    jsdelivr
    中央事件总线插件vue-bus-ts
    中央事件总线插件vue-bus-ts
    \ No newline at end of file diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html new file mode 100644 index 000000000..fa66283f9 --- /dev/null +++ b/archives/2020/12/index.html @@ -0,0 +1,237 @@ +December 2020 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html new file mode 100644 index 000000000..f2b086735 --- /dev/null +++ b/archives/2020/index.html @@ -0,0 +1,237 @@ +2020 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html new file mode 100644 index 000000000..21415e984 --- /dev/null +++ b/archives/2020/page/2/index.html @@ -0,0 +1,237 @@ +2020 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html new file mode 100644 index 000000000..24e6f383e --- /dev/null +++ b/archives/2021/01/index.html @@ -0,0 +1,237 @@ +January 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html new file mode 100644 index 000000000..bdaf0f422 --- /dev/null +++ b/archives/2021/02/index.html @@ -0,0 +1,237 @@ +February 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html new file mode 100644 index 000000000..3f5776dd9 --- /dev/null +++ b/archives/2021/03/index.html @@ -0,0 +1,237 @@ +March 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html new file mode 100644 index 000000000..386889a95 --- /dev/null +++ b/archives/2021/04/index.html @@ -0,0 +1,237 @@ +April 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 2
    2021
    JavaScript运算符优先级
    JavaScript运算符优先级
    预防XSS攻击插件 js-xss
    预防XSS攻击插件 js-xss
    \ No newline at end of file diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html new file mode 100644 index 000000000..994dfcd8d --- /dev/null +++ b/archives/2021/05/index.html @@ -0,0 +1,237 @@ +May 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html new file mode 100644 index 000000000..fdf71151c --- /dev/null +++ b/archives/2021/07/index.html @@ -0,0 +1,237 @@ +July 2021 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 1
    2021
    Vue源码解读(知识点总结)
    Vue源码解读(知识点总结)
    \ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 000000000..1435f5343 --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,237 @@ +2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html new file mode 100644 index 000000000..3b1f1eae0 --- /dev/null +++ b/archives/2021/page/2/index.html @@ -0,0 +1,237 @@ +2021 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/2024/12/index.html b/archives/2024/12/index.html new file mode 100644 index 000000000..9b9bea3f2 --- /dev/null +++ b/archives/2024/12/index.html @@ -0,0 +1,237 @@ +December 2024 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 1
    2024
    Hello World
    Hello World
    \ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html new file mode 100644 index 000000000..52005d44e --- /dev/null +++ b/archives/2024/index.html @@ -0,0 +1,237 @@ +2024 | 淳淳同学的个人博客 + + + + + + + + + +
    All Articles - 1
    2024
    Hello World
    Hello World
    \ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 000000000..ee0cdabe4 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,237 @@ +时间轴 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 000000000..b1ccd5bb3 --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,237 @@ +时间轴 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 000000000..de10a8fb1 --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,237 @@ +时间轴 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html new file mode 100644 index 000000000..d81678edf --- /dev/null +++ b/archives/page/4/index.html @@ -0,0 +1,237 @@ +时间轴 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/assets/images/avator.jpg b/assets/images/avator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfde83b971cf1ba8d0e2cc9e86e1db0f8e605c35 GIT binary patch literal 86046 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 literal 0 HcmV?d00001 diff --git a/categories/CSS/index.html b/categories/CSS/index.html new file mode 100644 index 000000000..9699310ea --- /dev/null +++ b/categories/CSS/index.html @@ -0,0 +1,237 @@ +Category: CSS | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/Git/index.html b/categories/Git/index.html new file mode 100644 index 000000000..53f2566bc --- /dev/null +++ b/categories/Git/index.html @@ -0,0 +1,237 @@ +Category: Git | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/JavaScript/index.html b/categories/JavaScript/index.html new file mode 100644 index 000000000..048f8ed2f --- /dev/null +++ b/categories/JavaScript/index.html @@ -0,0 +1,237 @@ +Category: JavaScript | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/LeetCode/index.html b/categories/LeetCode/index.html new file mode 100644 index 000000000..e774ec2c2 --- /dev/null +++ b/categories/LeetCode/index.html @@ -0,0 +1,237 @@ +Category: LeetCode | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/Socket/index.html b/categories/Socket/index.html new file mode 100644 index 000000000..d681f4d35 --- /dev/null +++ b/categories/Socket/index.html @@ -0,0 +1,237 @@ +Category: Socket | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/VSCode/index.html b/categories/VSCode/index.html new file mode 100644 index 000000000..fa48d6e18 --- /dev/null +++ b/categories/VSCode/index.html @@ -0,0 +1,237 @@ +Category: VSCode | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/Vue/index.html b/categories/Vue/index.html new file mode 100644 index 000000000..5812f515e --- /dev/null +++ b/categories/Vue/index.html @@ -0,0 +1,237 @@ +Category: Vue | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/Webpack/index.html b/categories/Webpack/index.html new file mode 100644 index 000000000..e2bf13919 --- /dev/null +++ b/categories/Webpack/index.html @@ -0,0 +1,237 @@ +Category: Webpack | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..ce769a429 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,239 @@ +分类 | 淳淳同学的个人博客 + + + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/npm/index.html b/categories/npm/index.html new file mode 100644 index 000000000..43a4c8559 --- /dev/null +++ b/categories/npm/index.html @@ -0,0 +1,237 @@ +Category: npm | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" new file mode 100644 index 000000000..fcc095393 --- /dev/null +++ "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -0,0 +1,237 @@ +Category: 个人文档 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\345\276\256\345\211\215\347\253\257/index.html" "b/categories/\345\276\256\345\211\215\347\253\257/index.html" new file mode 100644 index 000000000..ea15430f1 --- /dev/null +++ "b/categories/\345\276\256\345\211\215\347\253\257/index.html" @@ -0,0 +1,237 @@ +Category: 微前端 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\346\234\215\345\212\241\345\231\250/index.html" "b/categories/\346\234\215\345\212\241\345\231\250/index.html" new file mode 100644 index 000000000..172dbe1ed --- /dev/null +++ "b/categories/\346\234\215\345\212\241\345\231\250/index.html" @@ -0,0 +1,237 @@ +Category: 服务器 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\347\247\273\345\212\250\347\253\257/index.html" "b/categories/\347\247\273\345\212\250\347\253\257/index.html" new file mode 100644 index 000000000..9bf0a7af2 --- /dev/null +++ "b/categories/\347\247\273\345\212\250\347\253\257/index.html" @@ -0,0 +1,237 @@ +Category: 移动端 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..79f3ecf7b --- /dev/null +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,237 @@ +Category: 读书笔记 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\351\235\242\350\257\225/index.html" "b/categories/\351\235\242\350\257\225/index.html" new file mode 100644 index 000000000..d26adea58 --- /dev/null +++ "b/categories/\351\235\242\350\257\225/index.html" @@ -0,0 +1,237 @@ +Category: 面试 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/css/calendar.css b/css/calendar.css new file mode 100644 index 000000000..750b2857c --- /dev/null +++ b/css/calendar.css @@ -0,0 +1,165 @@ +.calendar { + font-family: Helvetica, arial; + border: 1px solid #DDDDDD; + border-radius: 3px; + min-height: 120px; + text-align: center; + margin: 0 auto; + border-width:0px; + width:100%; + display: flex; + display: -webkit-flex; + justify-content: center; + align-items:center; + flex-wrap:wrap; +} + +.calendar-graph text.wday, +.calendar-graph text.month { + font-size: 10px; + fill: #aaa; +} + +.contrib-legend { + text-align: right; + padding: 0 14px 10px 0; + display: inline-block; + float: right; +} + +.contrib-legend .legend { + display: inline-block; + list-style: none; + margin: 0 5px; + position: relative; + bottom: -1px; + padding: 0; +} + +.contrib-legend .legend li { + display: inline-block; + width: 10px; + height: 10px; +} + +.text-small { + font-size: 12px; + color: #767676; +} + +.calendar-graph { + padding: 5px 0 0; + text-align: center; +} + +.contrib-column { + + text-align: center; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + font-size: 11px; +} + +.contrib-column-first { + border-left: 0; +} + +.table-column { + padding:10px; + display: table-cell; + width:33%; + vertical-align: top; +} + +.contrib-number { + font-weight: 300; + line-height: 1.3em; + font-size: 24px; + display: block; + color: #333; +} + +.calendar img.spinner { + width: 70px; + margin-top: 50px; + min-height: 70px; +} + +.monospace { + text-align: center; + color: #000; + font-family: monospace; +} + +.monospace a { + color: #1D75AB; + text-decoration: none; +} + +.contrib-footer { + font-size: 11px; + padding: 0 10px 12px; + text-align: left; + width: 100%; + box-sizing: border-box; + height: 26px; +} + +.left.text-muted { + float: left; + margin-left: 9px; + color: #767676; +} +.left.text-muted a { + color: #4078c0; + text-decoration: none; +} +.left.text-muted a:hover, +.monospace a:hover { + text-decoration: underline; +} + +h2.f4.text-normal.mb-3 { + display: none; +} + +.float-left.text-gray { + float: left; +} +#user-activity-overview{ + display:none; +} + +.day-tooltip { + white-space: nowrap; + position: absolute; + z-index: 99999; + padding: 10px; + font-size: 12px; + color: #959da5; + text-align: center; + background: rgba(0,0,0,.85); + border-radius: 3px; + display: none; + pointer-events: none; +} +.day-tooltip strong { + color: #dfe2e5; +} +.day-tooltip.is-visible { + display: block; +} +.day-tooltip:after { + position: absolute; + bottom: -10px; + left: 50%; + width: 5px; + height: 5px; + box-sizing: border-box; + margin: 0 0 0 -5px; + content: " "; + border: 5px solid transparent; + border-top-color: rgba(0,0,0,.85) +} +.position-relative {width:100%;margin-left:20px;margin-right:20px;} +@media screen and (max-width: 650px){.contrib-column{display:none}} \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 000000000..727fc47d1 --- /dev/null +++ b/css/index.css @@ -0,0 +1,6239 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +main { + display: block +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none +} +.limit-one-line, +.container .flink .flink-item-name, +.container .flink .flink-item-desc, +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span, +.site-data > a .headline, +#nav #blog-info, +#sidebar #sidebar-menus .menus_items .site-page { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.limit-more-line, +.article-sort-item-title, +#recent-posts .recent-post-item >.recent-post-info > .article-title, +#recent-posts .recent-post-item >.recent-post-info > .content, +#aside-content .aside-list > .aside-list-item .content > .name, +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment, +#post-info .post-title, +.pagination-related .info .info-1 .info-item-2, +.pagination-related .info .info-2 .info-item-1, +.container figure.gallery-group p, +.container figure.gallery-group .gallery-group-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; +} +.fontawesomeIcon, +.custom-hr:before, +#post .post-copyright:before, +#post #post-outdate-notice:before, +.note:not(.no-icon)::before, +.search-dialog hr:before { + display: inline-block; + font-weight: 600; + font-family: 'Font Awesome 6 Free'; + text-rendering: auto; + -webkit-font-smoothing: antialiased; +} +.cardHover, +.layout > div:first-child:not(.nc), +#recent-posts .recent-post-item, +#article-container .shuoshuo-item, +#aside-content .card-widget, +.layout .pagination > *:not(.space) { + background: var(--card-bg); + -webkit-box-shadow: var(--card-box-shadow); + box-shadow: var(--card-box-shadow); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + border-radius: 8px; +} +.cardHover:hover, +.layout > div:first-child:not(.nc):hover, +#recent-posts .recent-post-item:hover, +#article-container .shuoshuo-item:hover, +#aside-content .card-widget:hover, +.layout .pagination > *:not(.space):hover { + -webkit-box-shadow: var(--card-hover-box-shadow); + box-shadow: var(--card-hover-box-shadow); +} +.imgHover, +.article-sort-item-img :first-child, +#recent-posts .recent-post-item .post_cover .post-bg, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.6s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.6s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.6s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.6s; + transition: filter 375ms ease-in 0.2s, transform 0.6s; + object-fit: cover; +} +.imgHover:hover, +.article-sort-item-img :first-child:hover, +#recent-posts .recent-post-item .post_cover .post-bg:hover, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child:hover { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover:hover .cover, +.pagination-related:hover .cover { + opacity: 0.5; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter: alpha(opacity=50); + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover .cover, +.pagination-related .cover { + width: 100%; + height: 100%; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transition: all 0.6s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.6s, filter 375ms ease-in 0.2s; + -o-transition: all 0.6s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.6s, filter 375ms ease-in 0.2s; + transition: all 0.6s, filter 375ms ease-in 0.2s; + object-fit: cover; +} +.list-beauty, +.category-lists ul { + list-style: none; +} +.list-beauty li, +.category-lists ul li { + position: relative; + padding: 0.12em 0.4em 0.12em 1.4em; +} +.list-beauty li:hover:before, +.category-lists ul li:hover:before { + border-color: var(--pseudo-hover); +} +.list-beauty li:before, +.category-lists ul li:before { + position: absolute; + top: 0.67em; + left: 0; + width: 0.43em; + height: 0.43em; + border: 0.215em solid #49b1f5; + border-radius: 0.43em; + background: transparent; + content: ''; + cursor: pointer; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +.custom-hr, +.search-dialog hr { + position: relative; + margin: 40px auto; + border: 2px dashed var(--hr-border); + width: calc(100% - 4px); +} +.custom-hr:hover:before, +.search-dialog hr:hover:before { + left: calc(95% - 20px); +} +.custom-hr:before, +.search-dialog hr:before { + position: absolute; + top: -10px; + left: 5%; + z-index: 1; + color: var(--hr-before-color); + content: '\f0c4'; + font-size: 20px; + line-height: 1; + -webkit-transition: all 1s ease-in-out; + -moz-transition: all 1s ease-in-out; + -o-transition: all 1s ease-in-out; + -ms-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; +} +.verticalCenter, +.pagination-related .info .info-1, +.pagination-related .info .info-2 { + position: absolute; + top: 50%; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#content-inner, +#footer { + -webkit-animation: bottom-top 1s; + -moz-animation: bottom-top 1s; + -o-animation: bottom-top 1s; + -ms-animation: bottom-top 1s; + animation: bottom-top 1s; +} +#page-header:not(.full_page), +#nav.show { + -webkit-animation: header-effect 1s; + -moz-animation: header-effect 1s; + -o-animation: header-effect 1s; + -ms-animation: header-effect 1s; + animation: header-effect 1s; +} +#site-title, +#site-subtitle { + -webkit-animation: titleScale 1s; + -moz-animation: titleScale 1s; + -o-animation: titleScale 1s; + -ms-animation: titleScale 1s; + animation: titleScale 1s; +} +canvas:not(#ribbon-canvas), +#web_bg { + -webkit-animation: to_show 4s; + -moz-animation: to_show 4s; + -o-animation: to_show 4s; + -ms-animation: to_show 4s; + animation: to_show 4s; +} +#ribbon-canvas { + -webkit-animation: ribbon_to_show 4s; + -moz-animation: ribbon_to_show 4s; + -o-animation: ribbon_to_show 4s; + -ms-animation: ribbon_to_show 4s; + animation: ribbon_to_show 4s; +} +#sidebar-menus.open > :nth-child(1) { + -webkit-animation: sidebarItem 0.2s; + -moz-animation: sidebarItem 0.2s; + -o-animation: sidebarItem 0.2s; + -ms-animation: sidebarItem 0.2s; + animation: sidebarItem 0.2s; +} +#sidebar-menus.open > :nth-child(2) { + -webkit-animation: sidebarItem 0.4s; + -moz-animation: sidebarItem 0.4s; + -o-animation: sidebarItem 0.4s; + -ms-animation: sidebarItem 0.4s; + animation: sidebarItem 0.4s; +} +#sidebar-menus.open > :nth-child(3) { + -webkit-animation: sidebarItem 0.6s; + -moz-animation: sidebarItem 0.6s; + -o-animation: sidebarItem 0.6s; + -ms-animation: sidebarItem 0.6s; + animation: sidebarItem 0.6s; +} +#sidebar-menus.open > :nth-child(4) { + -webkit-animation: sidebarItem 0.8s; + -moz-animation: sidebarItem 0.8s; + -o-animation: sidebarItem 0.8s; + -ms-animation: sidebarItem 0.8s; + animation: sidebarItem 0.8s; +} +.scroll-down-effects { + -webkit-animation: scroll-down-effect 1.5s infinite; + -moz-animation: scroll-down-effect 1.5s infinite; + -o-animation: scroll-down-effect 1.5s infinite; + -ms-animation: scroll-down-effect 1.5s infinite; + animation: scroll-down-effect 1.5s infinite; +} +.reward-main { + -webkit-animation: donate_effcet 0.3s 0.1s ease both; + -moz-animation: donate_effcet 0.3s 0.1s ease both; + -o-animation: donate_effcet 0.3s 0.1s ease both; + -ms-animation: donate_effcet 0.3s 0.1s ease both; + animation: donate_effcet 0.3s 0.1s ease both; +} +@-moz-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-webkit-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-o-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-moz-keyframes header-effect { + 0% { + -webkit-transform: translateY(-35px); + -moz-transform: translateY(-35px); + -o-transform: translateY(-35px); + -ms-transform: translateY(-35px); + transform: translateY(-35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes header-effect { + 0% { + -webkit-transform: translateY(-35px); + -moz-transform: translateY(-35px); + -o-transform: translateY(-35px); + -ms-transform: translateY(-35px); + transform: translateY(-35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes header-effect { + 0% { + -webkit-transform: translateY(-35px); + -moz-transform: translateY(-35px); + -o-transform: translateY(-35px); + -ms-transform: translateY(-35px); + transform: translateY(-35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes header-effect { + 0% { + -webkit-transform: translateY(-35px); + -moz-transform: translateY(-35px); + -o-transform: translateY(-35px); + -ms-transform: translateY(-35px); + transform: translateY(-35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes bottom-top { + 0% { + -webkit-transform: translateY(35px); + -moz-transform: translateY(35px); + -o-transform: translateY(35px); + -ms-transform: translateY(35px); + transform: translateY(35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes bottom-top { + 0% { + -webkit-transform: translateY(35px); + -moz-transform: translateY(35px); + -o-transform: translateY(35px); + -ms-transform: translateY(35px); + transform: translateY(35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes bottom-top { + 0% { + -webkit-transform: translateY(35px); + -moz-transform: translateY(35px); + -o-transform: translateY(35px); + -ms-transform: translateY(35px); + transform: translateY(35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes bottom-top { + 0% { + -webkit-transform: translateY(35px); + -moz-transform: translateY(35px); + -o-transform: translateY(35px); + -ms-transform: translateY(35px); + transform: translateY(35px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-moz-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-webkit-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-o-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-moz-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-moz-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-o-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-moz-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-o-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +:root { + --global-font-size: 14px; + --global-bg: #fff; + --font-color: #4c4948; + --hr-border: #a4d8fa; + --hr-before-color: #80c8f8; + --search-bg: #f6f8fa; + --search-input-color: #4c4948; + --search-a-color: #4c4948; + --preloader-bg: #37474f; + --preloader-color: #fff; + --tab-border-color: #f0f0f0; + --tab-botton-bg: #f0f0f0; + --tab-botton-color: #1f2d3d; + --tab-button-hover-bg: #dcdcdc; + --tab-button-active-bg: #fff; + --card-bg: #fff; + --card-meta: #858585; + --sidebar-bg: #f6f8fa; + --sidebar-menu-bg: #fff; + --btn-hover-color: #ff7242; + --btn-color: #fff; + --btn-bg: #49b1f5; + --text-bg-hover: rgba(73,177,245,0.7); + --light-grey: #eee; + --dark-grey: #cacaca; + --white: #fff; + --text-highlight-color: #1f2d3d; + --blockquote-color: #6a737d; + --blockquote-bg: rgba(73,177,245,0.1); + --reward-pop: #f5f5f5; + --toc-link-color: #666261; + --card-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); + --card-hover-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.09); + --pseudo-hover: #ff7242; + --headline-presudo: #a0a0a0; + --scrollbar-color: #49b1f5; + --default-bg-color: #49b1f5; + --zoom-bg: #fff; + --mark-bg: rgba(0,0,0,0.3); +} +body { + position: relative; + overflow-y: scroll; + min-height: 100%; + background: var(--global-bg); + color: var(--font-color); + font-size: var(--global-font-size); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft JhengHei', sans-serif; + line-height: 2; + -webkit-tap-highlight-color: rgba(0,0,0,0); + scroll-behavior: smooth; +} +@-moz-document url-prefix() { + * { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-color) transparent; + } +} +*::-webkit-scrollbar { + width: 5px; + height: 5px; +} +*::-webkit-scrollbar-thumb { + background: var(--scrollbar-color); +} +*::-webkit-scrollbar-track { + background-color: transparent; +} +input::placeholder { + color: var(--font-color); +} +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + margin: 20px 0 14px; + color: var(--text-highlight-color); + font-weight: bold; +} +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit !important; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.table-wrap { + overflow-x: scroll; + margin: 0 0 20px; + border-radius: 5px; +} +.table-wrap table { + border-radius: 5px; +} +.table-wrap table thead > tr:first-child th:first-child { + border-top-left-radius: 5px; +} +.table-wrap table thead > tr:first-child th:last-child { + border-top-right-radius: 5px; +} +.table-wrap table tbody > tr:last-child td:first-child { + border-bottom-left-radius: 5px; +} +.table-wrap table tbody > tr:last-child td:last-child { + border-bottom-right-radius: 5px; +} +table { + display: table; + width: 100%; + border-spacing: 0; + border-collapse: separate; + border-top: 1px solid var(--light-grey); + border-left: 1px solid var(--light-grey); + empty-cells: show; +} +table thead { + background: rgba(153,169,191,0.1); +} +table th, +table td { + padding: 6px 12px; + border: 1px solid var(--light-grey); + border-top: none; + border-left: none; + vertical-align: middle; +} +*::selection { + background: #00c4b6; + color: #f7f7f7; +} +button { + padding: 0; + outline: 0; + border: none; + background: none; + cursor: pointer; + touch-action: manipulation; +} +a { + color: #99a9bf; + text-decoration: none; + word-wrap: break-word; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -o-transition: all 0.2s; + -ms-transition: all 0.2s; + transition: all 0.2s; + overflow-wrap: break-word; +} +a:hover { + color: #49b1f5; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +img[src=''], +img:not([src]) { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.img-alt { + margin: -10px 0 10px; + color: #858585; +} +.img-alt:hover { + text-decoration: none !important; +} +blockquote { + margin: 0 0 20px; + padding: 7px 15px; + border-left: 4px solid #49b1f5; + background-color: var(--blockquote-bg); + color: var(--blockquote-color); + border-radius: 6px; +} +blockquote footer cite:before { + padding: 0 5px; + content: '—'; +} +blockquote > :last-child { + margin-bottom: 0 !important; +} +:root { + --hl-color: #90a4ae; + --hl-bg: #f6f8fa; + --hltools-bg: #e6ebf1; + --hltools-color: #90a4ae; + --hlnumber-bg: #f6f8fa; + --hlnumber-color: rgba(144,164,174,0.5); + --hlscrollbar-bg: #dce4eb; + --hlexpand-bg: linear-gradient(180deg, rgba(246,248,250,0.6), rgba(246,248,250,0.9)); +} +[data-theme='dark'] { + --hl-color: rgba(255,255,255,0.7); + --hl-bg: #171717; + --hltools-bg: #1a1a1a; + --hltools-color: #90a4ae; + --hlnumber-bg: #171717; + --hlnumber-color: rgba(255,255,255,0.4); + --hlscrollbar-bg: #1f1f1f; + --hlexpand-bg: linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9)); +} +@-moz-document url-prefix() { + scrollbar-color: var(--hlscrollbar-bg) transparent; +} +figure.highlight table::-webkit-scrollbar-thumb { + background: var(--hlscrollbar-bg); +} +figure.highlight pre .deletion { + color: #bf42bf; +} +figure.highlight pre .addition { + color: #105ede; +} +figure.highlight pre .meta { + color: #7c4dff; +} +figure.highlight pre .comment { + color: rgba(149,165,166,0.8); +} +figure.highlight pre .variable, +figure.highlight pre .attribute, +figure.highlight pre .regexp, +figure.highlight pre .ruby .constant, +figure.highlight pre .xml .tag .title, +figure.highlight pre .xml .pi, +figure.highlight pre .xml .doctype, +figure.highlight pre .html .doctype, +figure.highlight pre .css .id, +figure.highlight pre .tag .name, +figure.highlight pre .css .class, +figure.highlight pre .css .pseudo { + color: #e53935; +} +figure.highlight pre .tag { + color: #39adb5; +} +figure.highlight pre .number, +figure.highlight pre .preprocessor, +figure.highlight pre .literal, +figure.highlight pre .params, +figure.highlight pre .constant, +figure.highlight pre .command { + color: #f76d47; +} +figure.highlight pre .built_in { + color: #ffb62c; +} +figure.highlight pre .ruby .class .title, +figure.highlight pre .css .rules .attribute, +figure.highlight pre .string, +figure.highlight pre .value, +figure.highlight pre .inheritance, +figure.highlight pre .header, +figure.highlight pre .ruby .symbol, +figure.highlight pre .xml .cdata, +figure.highlight pre .special, +figure.highlight pre .number, +figure.highlight pre .formula { + color: #91b859; +} +figure.highlight pre .keyword, +figure.highlight pre .title, +figure.highlight pre .css .hexcolor { + color: #39adb5; +} +figure.highlight pre .function, +figure.highlight pre .python .decorator, +figure.highlight pre .python .title, +figure.highlight pre .ruby .function .title, +figure.highlight pre .ruby .title .keyword, +figure.highlight pre .perl .sub, +figure.highlight pre .javascript .title, +figure.highlight pre .coffeescript .title { + color: #6182b8; +} +figure.highlight pre .tag .attr, +figure.highlight pre .javascript .function { + color: #7c4dff; +} +.container figure.highlight .line.marked { + background-color: rgba(128,203,196,0.251); +} +.container figure.highlight table { + display: block; + overflow: auto; + border: none; +} +.container figure.highlight table td { + padding: 0; + border: none; +} +.container figure.highlight .gutter pre { + padding-right: 10px; + padding-left: 10px; + background-color: var(--hlnumber-bg); + color: var(--hlnumber-color); + text-align: right; +} +.container figure.highlight .code pre { + padding-right: 10px; + padding-left: 10px; + width: 100%; +} +.container pre, +.container figure.highlight { + overflow: auto; + margin: 0 0 20px; + padding: 0; + background: var(--hl-bg); + color: var(--hl-color); + line-height: 1.6; +} +.container pre, +.container code { + font-size: var(--global-font-size); + font-family: consolas, Menlo, monospace, 'PingFang SC', 'Microsoft JhengHei', sans-serif !important; + border-radius: 6px; +} +.container code { + padding: 2px 5px; + background: rgba(27,31,35,0.05); + color: #f47466; +} +.container pre { + padding: 10px 20px; +} +.container pre code { + padding: 0; + background: none; + color: var(--hl-color); + text-shadow: none; +} +.container figure.highlight { + position: relative; + border-radius: 6px; +} +.container figure.highlight pre { + margin: 0; + padding: 8px 0; + border: none; +} +.container figure.highlight figcaption, +.container figure.highlight .caption { + padding: 6px 0 2px 14px; + font-size: var(--global-font-size); + line-height: 1em; +} +.container figure.highlight figcaption a, +.container figure.highlight .caption a { + float: right; + padding-right: 10px; + color: var(--hl-color); +} +.container figure.highlight figcaption a:hover, +.container figure.highlight .caption a:hover { + border-bottom-color: var(--hl-color); +} +.container figure.highlight.copy-true { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + -webkit-user-select: all; +} +.container figure.highlight.copy-true > table, +.container figure.highlight.copy-true > pre { + display: block !important; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.container .highlight-tools { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 0 8px; + min-height: 24px; + height: 2.15em; + background: var(--hltools-bg); + color: var(--hltools-color); + font-size: var(--global-font-size); + overflow: hidden; +} +.container .highlight-tools > * { + padding: 5px; +} +.container .highlight-tools i { + cursor: pointer; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.container .highlight-tools i:hover { + color: #49b1f5; +} +.container .highlight-tools.closed ~ * { + display: none; +} +.container .highlight-tools.closed .expand { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.container .highlight-tools .code-lang { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + text-transform: uppercase; + font-weight: bold; + font-size: 1.15em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; + padding: 2px; +} +.container .highlight-tools .copy-notice { + padding-right: 2px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s; + -moz-transition: opacity 0.4s; + -o-transition: opacity 0.4s; + -ms-transition: opacity 0.4s; + transition: opacity 0.4s; +} +.container .highlight-tools .code-lang { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +.container .gutter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +.container .gist table { + width: auto; +} +.container .gist table td { + border: none; +} +.container figure.highlight { + margin: 0 0 24px; + border-radius: 7px; + -webkit-box-shadow: 0 5px 10px 0 rgba(144,164,174,0.4); + box-shadow: 0 5px 10px 0 rgba(144,164,174,0.4); + -webkit-transform: translateZ(0); +} +.container figure.highlight .highlight-tools .macStyle { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; +} +.container figure.highlight .highlight-tools .macStyle > * { + margin-right: 8px; + width: 12px; + height: 12px; + border-radius: 50%; +} +.container figure.highlight .highlight-tools .macStyle > :last-child { + margin-right: 5px; +} +.container figure.highlight .highlight-tools .macStyle .mac-close { + background: #fc625d; +} +.container figure.highlight .highlight-tools .macStyle .mac-minimize { + background: #fdbc40; +} +.container figure.highlight .highlight-tools .macStyle .mac-maximize { + background: #35cd4b; +} +.container figure.highlight .highlight-tools > :nth-child(2) { + -webkit-box-ordinal-group: 8; + -moz-box-ordinal-group: 8; + -o-box-ordinal-group: 8; + -ms-flex-order: 8; + -webkit-order: 8; + order: 8; +} +.container figure.highlight .highlight-tools.closed .expand { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.article-sort { + margin-left: 10px; + padding-left: 20px; + border-left: 2px solid #aadafa; +} +.article-sort-title { + position: relative; + margin-left: 10px; + padding-bottom: 20px; + padding-left: 20px; + font-size: 1.72em; +} +.article-sort-title:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-title:before { + position: absolute; + top: calc(((100% - 36px) / 2)); + left: -9px; + z-index: 1; + width: 10px; + height: 10px; + border: 5px solid #49b1f5; + border-radius: 10px; + background: var(--card-bg); + content: ''; + line-height: 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-title:after { + position: absolute; + bottom: 0; + left: 0; + z-index: 0; + width: 2px; + height: 1.5em; + background: #aadafa; + content: ''; +} +.article-sort-item { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + margin: 0 0 20px 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-item:before { + position: absolute; + left: calc(-20px - 17px); + width: 6px; + height: 6px; + border: 3px solid #49b1f5; + border-radius: 6px; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item.no-article-cover { + height: 80px; +} +.article-sort-item.no-article-cover .article-sort-item-info { + padding: 0; +} +.article-sort-item.year { + font-size: 1.43em; + margin-bottom: 10px; +} +.article-sort-item.year:hover:before { + border-color: #49b1f5; +} +.article-sort-item.year:before { + border-color: var(--pseudo-hover); +} +.article-sort-item-time { + color: var(--card-meta); + font-size: 0.85em; +} +.article-sort-item-time time { + padding-left: 6px; + cursor: default; +} +.article-sort-item-title { + color: var(--font-color); + font-size: 1.05em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-line-clamp: 2; +} +.article-sort-item-title:hover { + color: #49b1f5; + -webkit-transform: translateX(10px); + -moz-transform: translateX(10px); + -o-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); +} +.article-sort-item-img { + overflow: hidden; + width: 100px; + height: 70px; + border-radius: 6px; +} +@media screen and (max-width: 768px) { + .article-sort-item-img { + width: 70px; + height: 70px; + } +} +.article-sort-item-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 16px; +} +.category-lists .category-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .category-lists .category-title { + font-size: 2em; + } +} +.category-lists .category-list { + margin-bottom: 0; +} +.category-lists .category-list a { + color: var(--font-color); +} +.category-lists .category-list a:hover { + color: #49b1f5; +} +.category-lists .category-list .category-list-count { + margin-left: 8px; + color: var(--card-meta); +} +.category-lists .category-list .category-list-count:before { + content: '('; +} +.category-lists .category-list .category-list-count:after { + content: ')'; +} +.category-lists ul { + padding: 0 0 0 20px; +} +.category-lists ul ul { + padding-left: 4px; +} +.category-lists ul li { + position: relative; + margin: 6px 0; + padding: 0.12em 0.4em 0.12em 1.4em; +} +#body-wrap { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100vh; +} +.layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + margin: 0 auto; + padding: 40px 15px; + max-width: 1200px; + width: 100%; +} +@media screen and (max-width: 900px) { + .layout { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } +} +@media screen and (max-width: 768px) { + .layout { + padding: 20px 5px; + } +} +@media screen and (min-width: 2000px) { + .layout { + max-width: 70%; + } +} +.layout > div:first-child:not(.nc) { + -webkit-align-self: flex-start; + align-self: flex-start; + -ms-flex-item-align: start; + padding: 50px 40px; +} +@media screen and (max-width: 768px) { + .layout > div:first-child:not(.nc) { + padding: 36px 14px; + } +} +.layout > div:first-child { + width: 74%; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +@media screen and (max-width: 900px) { + .layout > div:first-child { + width: 100% !important; + } +} +.layout.hide-aside { + max-width: 1000px; +} +@media screen and (min-width: 2000px) { + .layout.hide-aside { + max-width: 1300px; + } +} +.layout.hide-aside > div { + width: 100% !important; +} +.apple #page-header.full_page { + background-attachment: scroll !important; +} +.apple .recent-post-item, +.apple .avatar-img, +.apple .flink-item-icon { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +.container .flink { + margin-bottom: 20px; +} +.container .flink .flink-list { + overflow: auto; + padding: 10px 10px 0; + text-align: center; +} +.container .flink .flink-list > .flink-list-item { + position: relative; + float: left; + overflow: hidden; + margin: 15px 7px; + width: calc(100% / 3 - 15px); + height: 90px; + line-height: 17px; + -webkit-transform: translateZ(0); + border-radius: 8px; +} +@media screen and (max-width: 1024px) { + .container .flink .flink-list > .flink-list-item { + width: calc(50% - 15px) !important; + } +} +@media screen and (max-width: 600px) { + .container .flink .flink-list > .flink-list-item { + width: calc(100% - 15px) !important; + } +} +.container .flink .flink-list > .flink-list-item:hover .flink-item-icon { + margin-left: -10px; + width: 0; +} +.container .flink .flink-list > .flink-list-item:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: var(--text-bg-hover); + content: ''; + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + -ms-transition: -ms-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); +} +.container .flink .flink-list > .flink-list-item:hover:before, +.container .flink .flink-list > .flink-list-item:focus:before, +.container .flink .flink-list > .flink-list-item:active:before { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +.container .flink .flink-list > .flink-list-item a { + color: var(--font-color); + text-decoration: none; +} +.container .flink .flink-list > .flink-list-item a .flink-item-icon { + float: left; + overflow: hidden; + margin: 15px 10px; + width: 60px; + height: 60px; + border-radius: 7px; + -webkit-transition: width 0.3s ease-out; + -moz-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + -ms-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +.container .flink .flink-list > .flink-list-item a .flink-item-icon img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +.container .flink .flink-list > .flink-list-item a .img-alt { + display: none; +} +.container .flink .flink-item-name { + padding: 16px 10px 0 0; + height: 40px; + font-weight: bold; + font-size: 1.43em; +} +.container .flink .flink-item-desc { + padding: 16px 10px 16px 0; + height: 50px; + font-size: 0.93em; +} +.container .flink .flink-name { + margin-bottom: 5px; + font-weight: bold; + font-size: 1.5em; +} +#recent-posts .recent-post-item { + position: relative; + overflow: hidden; + margin-bottom: 20px; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + height: 16.8em; +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + } +} +@media screen and (min-width: 2000px) { + #recent-posts .recent-post-item { + height: 18.8em; + } +} +#recent-posts .recent-post-item:hover .post-bg { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +#recent-posts .recent-post-item.ads-wrap { + display: block !important; + height: auto !important; +} +#recent-posts .recent-post-item .post_cover { + overflow: hidden; + width: 42%; + height: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item .post_cover { + width: 100%; + height: 230px; + } +} +#recent-posts .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 1; + -moz-box-ordinal-group: 1; + -o-box-ordinal-group: 1; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 0; + -moz-box-ordinal-group: 0; + -o-box-ordinal-group: 0; + -ms-flex-order: 0; + -webkit-order: 0; + order: 0; + } +} +#recent-posts .recent-post-item .post_cover .post-bg { + z-index: -4; +} +#recent-posts .recent-post-item >.recent-post-info { + padding: 0 40px; + width: 58%; +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item >.recent-post-info { + padding: 20px 20px 30px; + width: 100%; + } +} +#recent-posts .recent-post-item >.recent-post-info.no-cover { + width: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item >.recent-post-info.no-cover { + padding: 30px 20px; + } +} +#recent-posts .recent-post-item >.recent-post-info > .article-title { + color: var(--text-highlight-color); + font-size: 1.55em; + line-height: 1.4; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-line-clamp: 2; +} +#recent-posts .recent-post-item >.recent-post-info > .article-title .sticky { + margin-right: 10px; + color: #ff7242; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +@media screen and (max-width: 768px) { + #recent-posts .recent-post-item >.recent-post-info > .article-title { + font-size: 1.43em; + } +} +#recent-posts .recent-post-item >.recent-post-info > .article-title:hover { + color: #49b1f5; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap { + margin: 6px 0; + color: var(--card-meta); + font-size: 0.9em; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap > .post-meta-date { + cursor: default; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap i { + margin: 0 4px 0 0; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap .fa-spinner { + margin: 0; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-label { + padding-right: 4px; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-separator { + margin: 0 6px; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-link { + margin: 0 4px; +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap a { + color: var(--card-meta); +} +#recent-posts .recent-post-item >.recent-post-info > .article-meta-wrap a:hover { + color: #49b1f5; + text-decoration: underline; +} +#recent-posts .recent-post-item >.recent-post-info > .content { + -webkit-line-clamp: 2; +} +#article-container .shuoshuo-item { + margin-bottom: 20px; + padding: 35px 30px 30px; +} +@media screen and (max-width: 768px) { + #article-container .shuoshuo-item { + padding: 25px 20px 20px; + } +} +#article-container .shuoshuo-item-header { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + cursor: default; +} +#article-container .shuoshuo-avatar { + overflow: hidden; + width: 40px; + height: 40px; + border-radius: 40px; +} +#article-container .shuoshuo-avatar img { + margin: 0; + width: 100%; + height: 100%; +} +#article-container .shuoshuo-info { + margin-left: 10px; + line-height: 1.5; +} +#article-container .shuoshuo-date { + color: #858585; + font-size: 0.8em; +} +#article-container .shuoshuo-content { + padding: 15px 0 10px; +} +#article-container .shuoshuo-content > *:last-child { + margin-bottom: 0; +} +#article-container .shuoshuo-footer { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; +} +#article-container .shuoshuo-footer.flex-between { + -webkit-box-pack: justify; + -moz-box-pack: justify; + -o-box-pack: justify; + -ms-flex-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; +} +#article-container .shuoshuo-footer.flex-end { + -webkit-box-pack: end; + -moz-box-pack: end; + -o-box-pack: end; + -ms-flex-pack: end; + -webkit-justify-content: flex-end; + justify-content: flex-end; +} +#article-container .shuoshuo-footer .shuoshuo-tag { + display: inline-block; + margin-right: 8px; + padding: 0 8px; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + cursor: default; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#article-container .shuoshuo-footer .shuoshuo-tag:hover { + background: #49b1f5; + color: var(--white); +} +#article-container .shuoshuo-footer .shuoshuo-comment-btn { + padding: 2px; + color: #90a4ae; + cursor: pointer; +} +#article-container .shuoshuo-footer .shuoshuo-comment-btn:hover { + color: #49b1f5; +} +#article-container .shuoshuo-comment { + padding-top: 10px; +} +#article-container .shuoshuo-comment.no-comment { + display: none; +} +.tag-cloud-list a { + display: inline-block; + margin: 2px; + padding: 2px 7px; + line-height: 1.7; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + border-radius: 5px; +} +.tag-cloud-list a:hover { + background: var(--btn-bg) !important; + -webkit-box-shadow: 2px 2px 6px rgba(0,0,0,0.2); + box-shadow: 2px 2px 6px rgba(0,0,0,0.2); + color: var(--btn-color) !important; +} +@media screen and (max-width: 768px) { + .tag-cloud-list a { + zoom: 0.85; + } +} +.tag-cloud-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .tag-cloud-title { + font-size: 2em; + } +} +.page-title + .tag-cloud-list { + text-align: left; +} +#aside-content { + width: 26%; +} +@media screen and (min-width: 900px) { + #aside-content { + padding-left: 15px; + } +} +@media screen and (max-width: 900px) { + #aside-content { + margin-top: 20px; + width: 100%; + } +} +#aside-content .card-widget { + position: relative; + overflow: hidden; + margin-bottom: 20px; + padding: 20px 24px; +} +#aside-content .card-widget:last-child { + margin-bottom: 0; +} +#aside-content .card-info .author-info-name { + font-weight: 500; + font-size: 1.57em; +} +#aside-content .card-info .author-info-description { + margin-top: -0.42em; +} +#aside-content .card-info .site-data { + margin: 14px 0 4px; +} +#aside-content .card-info .card-info-social-icons { + margin: 6px 0 -6px; +} +#aside-content .card-info .card-info-social-icons .social-icon { + margin: 0 10px; + color: var(--font-color); + font-size: 1.4em; +} +#aside-content .card-info .card-info-social-icons i { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#aside-content .card-info .card-info-social-icons i:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#aside-content .card-info #card-info-btn { + display: block; + margin-top: 14px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + line-height: 2.4; + border-radius: 7px; +} +#aside-content .card-info #card-info-btn:hover { + background-color: var(--btn-hover-color); +} +#aside-content .card-info #card-info-btn span { + padding-left: 10px; +} +#aside-content .item-headline { + padding-bottom: 6px; + font-size: 1.2em; +} +#aside-content .item-headline span { + margin-left: 6px; +} +@media screen and (min-width: 900px) { + #aside-content .sticky_layout { + position: sticky; + position: -webkit-sticky; + top: 20px; + -webkit-transition: top 0.3s; + -moz-transition: top 0.3s; + -o-transition: top 0.3s; + -ms-transition: top 0.3s; + transition: top 0.3s; + } +} +#aside-content .card-tag-cloud a { + display: inline-block; + padding: 0 4px; + line-height: 1.8; +} +#aside-content .card-tag-cloud a:hover { + color: #49b1f5 !important; +} +#aside-content .aside-list > span { + display: block; + margin-bottom: 10px; + text-align: center; +} +#aside-content .aside-list > .aside-list-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 6px 0; +} +#aside-content .aside-list > .aside-list-item:first-child { + padding-top: 0; +} +#aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed #f5f5f5; +} +#aside-content .aside-list > .aside-list-item:last-child { + padding-bottom: 0; +} +#aside-content .aside-list > .aside-list-item .thumbnail { + overflow: hidden; + width: 4em; + height: 4em; + border-radius: 6px; +} +#aside-content .aside-list > .aside-list-item .content { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-left: 10px; + word-break: break-all; +} +#aside-content .aside-list > .aside-list-item .content > .name { + -webkit-line-clamp: 1; +} +#aside-content .aside-list > .aside-list-item .content > time, +#aside-content .aside-list > .aside-list-item .content > .name { + display: block; + color: var(--card-meta); + font-size: 0.85em; +} +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment { + color: var(--font-color); + line-height: 1.5; + -webkit-line-clamp: 2; +} +#aside-content .aside-list > .aside-list-item .content > .title:hover, +#aside-content .aside-list > .aside-list-item .content > .comment:hover { + color: #49b1f5; +} +#aside-content .aside-list > .aside-list-item.no-cover { + min-height: 4.4em; +} +#aside-content .card-archives ul.card-archive-list, +#aside-content .card-categories ul.card-category-list { + margin: 0; + padding: 0; + list-style: none; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + margin: 2px 0; + padding: 2px 8px; + color: var(--font-color); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + border-radius: 6px; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover { + padding: 2px 12px; + background-color: var(--text-bg-hover); + color: var(--white); +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +#aside-content .card-categories .card-category-list.child { + padding: 0 0 0 16px; +} +#aside-content .card-categories .card-category-list > .parent > a.expand i { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +#aside-content .card-categories .card-category-list > .parent > a.expand + .child { + display: block; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-name { + width: 70% !important; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-count { + width: calc(100% - 70% - 20px); + text-align: right; +} +#aside-content .card-categories .card-category-list > .parent > a i { + float: right; + margin-right: -0.5em; + padding: 0.5em; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); +} +#aside-content .card-webinfo .webinfo .webinfo-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 2px 10px 0; +} +#aside-content .card-webinfo .webinfo .webinfo-item div:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 20px; +} +@media screen and (min-width: 901px) { + #aside-content #card-toc { + right: 0 !important; + } +} +@media screen and (max-width: 900px) { + #aside-content #card-toc { + position: fixed; + right: 55px; + bottom: 30px; + z-index: 100; + max-width: 380px; + max-height: calc(100% - 60px); + width: calc(100% - 80px); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + -ms-transition: none; + transition: none; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -o-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + } + #aside-content #card-toc.open { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +#aside-content #card-toc .toc-percentage { + float: right; + margin-top: -9px; + color: #a9a9a9; + font-style: italic; + font-size: 140%; +} +#aside-content #card-toc .toc-content { + overflow-y: scroll; + overflow-y: overlay; + margin: 0 -24px; + max-height: calc(100vh - 120px); + width: calc(100% + 48px); +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content { + max-height: calc(100vh - 140px); + } +} +#aside-content #card-toc .toc-content > * { + margin: 0 20px !important; +} +#aside-content #card-toc .toc-content > * > .toc-item > .toc-child { + margin-left: 10px; + padding-left: 10px; + border-left: 1px solid var(--dark-grey); +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: none; +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: block !important; + } +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child { + display: block; +} +#aside-content #card-toc .toc-content ol, +#aside-content #card-toc .toc-content li { + list-style: none; +} +#aside-content #card-toc .toc-content > ol { + padding: 0 !important; +} +#aside-content #card-toc .toc-content ol { + margin: 0; + padding-left: 18px; +} +#aside-content #card-toc .toc-content .toc-link { + display: block; + margin: 4px 0; + padding: 1px 8px; + color: var(--toc-link-color); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + border-radius: 6px; +} +#aside-content #card-toc .toc-content .toc-link:hover { + color: #49b1f5; +} +#aside-content #card-toc .toc-content .toc-link.active { + background: #00c4b6; + color: #fff; +} +#aside-content .sticky_layout:only-child > :first-child { + margin-top: 0; +} +#aside-content .card-more-btn { + float: right; + color: inherit; +} +#aside-content .card-more-btn:hover { + -webkit-animation: more-btn-move 1s infinite; + -moz-animation: more-btn-move 1s infinite; + -o-animation: more-btn-move 1s infinite; + -ms-animation: more-btn-move 1s infinite; + animation: more-btn-move 1s infinite; +} +#aside-content .card-announcement .item-headline i { + color: #f00; +} +.avatar-img { + overflow: hidden; + margin: 0 auto; + width: 110px; + height: 110px; + border-radius: 70px; +} +.avatar-img img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +.avatar-img img:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +.site-data { + display: table; + width: 100%; + table-layout: fixed; +} +.site-data > a { + display: table-cell; +} +.site-data > a div { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.site-data > a:hover div { + color: #49b1f5 !important; +} +.site-data > a .headline { + color: var(--font-color); + font-size: 0.95em; +} +.site-data > a .length-num { + margin-top: -0.45em; + color: var(--text-highlight-color); + font-size: 1.2em; +} +@media screen and (min-width: 900px) { + html.hide-aside .layout { + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + } + html.hide-aside .layout > .aside-content { + display: none; + } + html.hide-aside .layout > div:first-child { + width: 80%; + } +} +.page .sticky_layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +@-moz-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-webkit-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-o-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-moz-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +#post-comment .comment-head { + margin-bottom: 20px; +} +#post-comment .comment-head:after { + display: block; + clear: both; + content: ''; +} +#post-comment .comment-head .comment-headline { + display: inline-block; + vertical-align: middle; + font-weight: 700; + font-size: 1.43em; +} +#post-comment .comment-head .comment-switch { + display: inline-block; + float: right; + margin: 2px auto 0; + padding: 4px 16px; + width: max-content; + border-radius: 8px; + background: #f6f8fa; +} +#post-comment .comment-head .comment-switch .first-comment { + color: #49b1f5; +} +#post-comment .comment-head .comment-switch .second-comment { + color: #ff7242; +} +#post-comment .comment-head .comment-switch #switch-btn { + position: relative; + display: inline-block; + margin: -4px 8px 0; + width: 42px; + height: 22px; + border-radius: 34px; + background-color: #49b1f5; + vertical-align: middle; + cursor: pointer; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head .comment-switch #switch-btn:before { + position: absolute; + bottom: 4px; + left: 4px; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: #fff; + content: ''; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-wrap > div { + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +#post-comment .comment-wrap > div:nth-child(2) { + display: none; +} +#post-comment.move #switch-btn { + background-color: #ff7242; +} +#post-comment.move #switch-btn:before { + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -o-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} +#post-comment.move .comment-wrap > div:first-child { + display: none; +} +#post-comment.move .comment-wrap > div:last-child { + display: block; +} +#footer { + position: relative; + background-color: #49b1f5; + background-attachment: scroll; + background-position: bottom; + background-size: cover; +} +#footer-wrap { + position: relative; + padding: 40px 20px; + color: var(--light-grey); + text-align: center; +} +#footer-wrap a { + color: var(--light-grey); +} +#footer-wrap a:hover { + text-decoration: underline; +} +#footer-wrap .footer-separator { + margin: 0 4px; +} +#footer-wrap .icp-icon { + padding: 0 4px; + max-height: 1.4em; + width: auto; + vertical-align: text-bottom; +} +#page-header { + position: relative; + width: 100%; + background-color: #49b1f5; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header:not(.not-top-img):before { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--mark-bg); + content: ''; +} +#page-header.full_page { + height: 100vh; + background-attachment: fixed; +} +#page-header.full_page #site-info { + position: absolute; + top: 43%; + padding: 0 10px; + width: 100%; +} +#page-header #site-title, +#page-header #site-subtitle, +#page-header #scroll-down .scroll-down-effects { + text-align: center; + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + line-height: 1.5; +} +#page-header #site-title { + margin: 0; + color: var(--white); + font-size: 1.85em; +} +@media screen and (min-width: 768px) { + #page-header #site-title { + font-size: 2.85em; + } +} +#page-header #site-subtitle { + color: var(--light-grey); + font-size: 1.15em; +} +@media screen and (min-width: 768px) { + #page-header #site-subtitle { + font-size: 1.72em; + } +} +#page-header #site_social_icons { + display: none; + margin: 0 auto; + text-align: center; +} +@media screen and (max-width: 768px) { + #page-header #site_social_icons { + display: block; + } +} +#page-header #site_social_icons .social-icon { + margin: 0 10px; + color: var(--light-grey); + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-size: 1.43em; +} +#page-header #scroll-down { + position: absolute; + bottom: 10px; + width: 100%; + cursor: pointer; +} +#page-header #scroll-down .scroll-down-effects { + position: relative; + width: 100%; + color: var(--light-grey); + font-size: 20px; +} +#page-header.not-home-page { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.not-home-page { + height: 280px; + } +} +#page-header #page-site-info { + position: absolute; + top: 200px; + padding: 0 10px; + width: 100%; +} +@media screen and (max-width: 768px) { + #page-header #page-site-info { + top: 140px; + } +} +#page-header.post-bg { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.post-bg { + height: 360px; + } +} +#page-header #post-info { + position: absolute; + width: 100%; + bottom: 30px; +} +#page-header #post-info > * { + margin: 0 auto; + padding: 0 15px; + max-width: 1200px; +} +@media screen and (min-width: 768px) and (max-width: 1300px) { + #page-header #post-info > * { + padding: 0 30px; + } +} +@media screen and (min-width: 2000px) { + #page-header #post-info > * { + max-width: 70%; + } +} +#page-header.not-top-img { + margin-bottom: 10px; + height: 60px; + background: 0; +} +#page-header.not-top-img .title-seo { + display: none; +} +#page-header.not-top-img #nav { + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); +} +#page-header.not-top-img #nav a, +#page-header.not-top-img #nav span.site-page, +#page-header.not-top-img #nav .site-name { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav { + position: fixed; + top: -60px; + z-index: 91; + background: rgba(255,255,255,0.7); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + -webkit-transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -moz-transition: -moz-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -o-transition: -o-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -ms-transition: -ms-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + will-change: transform; + backdrop-filter: blur(7px); +} +#page-header.nav-fixed #nav #blog-info { + color: var(--font-color); +} +#page-header.nav-fixed #nav #blog-info:hover { + color: #49b1f5; +} +#page-header.nav-fixed #nav #blog-info .site-name { + text-shadow: none; +} +#page-header.nav-fixed #nav #blog-info > a:first-child { + display: none; +} +#page-header.nav-fixed #nav #blog-info > a:last-child { + display: inline; +} +#page-header.nav-fixed #nav a, +#page-header.nav-fixed #nav span.site-page, +#page-header.nav-fixed #nav #toggle-menu { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav a:hover, +#page-header.nav-fixed #nav span.site-page:hover, +#page-header.nav-fixed #nav #toggle-menu:hover { + color: #49b1f5; +} +#page-header.nav-fixed.fixed #nav { + top: 0; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header.nav-visible:not(.fixed) #nav { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); +} +#page-header.nav-visible:not(.fixed) + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed #nav { + position: fixed; +} +#page-header.fixed + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed + .layout #card-toc .toc-content { + max-height: calc(100vh - 170px); +} +#page .page-title { + margin: 0 0 10px; + font-weight: bold; + font-size: 2em; +} +#post > #post-info { + margin-bottom: 30px; +} +#post > #post-info .post-title { + padding-bottom: 4px; + border-bottom: 1px solid var(--light-grey); + color: var(--text-highlight-color); +} +#post > #post-info .post-title .post-edit-link { + float: right; +} +#post > #post-info #post-meta, +#post > #post-info #post-meta a { + color: #78818a; +} +#post-info .post-title { + margin-bottom: 8px; + color: var(--white); + font-weight: normal; + font-size: 2.5em; + line-height: 1.5; + -webkit-line-clamp: 3; +} +@media screen and (max-width: 768px) { + #post-info .post-title { + font-size: 2.1em; + } +} +#post-info .post-title .post-edit-link { + padding-left: 10px; +} +#post-info #post-meta { + color: var(--light-grey); + font-size: 95%; +} +@media screen and (min-width: 768px) { + #post-info #post-meta > .meta-secondline > span:first-child { + display: none; + } +} +@media screen and (max-width: 768px) { + #post-info #post-meta { + font-size: 90%; + } + #post-info #post-meta > .meta-firstline, + #post-info #post-meta > .meta-secondline { + display: inline; + } +} +#post-info #post-meta .post-meta-separator { + margin: 0 5px; +} +#post-info #post-meta .post-meta-icon { + margin-right: 4px; +} +#post-info #post-meta .post-meta-label { + margin-right: 4px; +} +#post-info #post-meta a { + color: var(--light-grey); + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#post-info #post-meta a:hover { + color: #49b1f5; + text-decoration: underline; +} +#nav { + position: absolute; + top: 0; + z-index: 90; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 0 36px; + width: 100%; + height: 60px; + font-size: 1.3em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +@media screen and (max-width: 768px) { + #nav { + padding: 0 16px; + } +} +#nav.show { + opacity: 1; + -ms-filter: none; + filter: none; +} +#nav #blog-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + color: var(--light-grey); +} +#nav #blog-info .site-icon { + margin-right: 6px; + height: 36px; + vertical-align: middle; +} +#nav #blog-info .nav-page-title { + display: none; +} +#nav #toggle-menu { + display: none; + padding: 2px 0 0 6px; + vertical-align: top; +} +#nav #toggle-menu:hover { + color: var(--white); +} +#nav a, +#nav span.site-page { + color: var(--light-grey); +} +#nav a:hover, +#nav span.site-page:hover { + color: var(--white); +} +#nav .site-name { + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-weight: bold; +} +#nav .menus_items { + display: inline; +} +#nav .menus_items .menus_item { + position: relative; + display: inline-block; + padding: 0 0 0 14px; +} +#nav .menus_items .menus_item:hover .menus_item_child { + display: block; +} +#nav .menus_items .menus_item:hover > span > i:last-child { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +#nav .menus_items .menus_item > span > i:last-child { + padding: 4px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#nav .menus_items .menus_item .menus_item_child { + position: absolute; + right: 0; + display: none; + margin-top: 8px; + padding: 0; + width: max-content; + background-color: var(--sidebar-bg); + -webkit-box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + -webkit-animation: sub_menus 0.3s 0.1s ease both; + -moz-animation: sub_menus 0.3s 0.1s ease both; + -o-animation: sub_menus 0.3s 0.1s ease both; + -ms-animation: sub_menus 0.3s 0.1s ease both; + animation: sub_menus 0.3s 0.1s ease both; + border-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child:before { + position: absolute; + top: -8px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +#nav .menus_items .menus_item .menus_item_child li { + list-style: none; +} +#nav .menus_items .menus_item .menus_item_child li:hover { + background: var(--text-bg-hover); +} +#nav .menus_items .menus_item .menus_item_child li:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li a { + display: inline-block; + padding: 8px 16px; + width: 100%; + color: var(--font-color) !important; + text-shadow: none !important; +} +#nav.hide-menu #toggle-menu { + display: inline-block !important; +} +#nav.hide-menu #toggle-menu .site-page { + font-size: inherit; +} +#nav.hide-menu .menus_items { + display: none; +} +#nav.hide-menu #search-button span:not(.site-page) { + display: none; +} +#nav #search-button { + display: inline; + padding: 0 0 0 14px; +} +#nav .site-page { + position: relative; + padding-bottom: 6px; + text-shadow: 1px 1px 2px rgba(0,0,0,0.3); + font-size: 0.78em; + cursor: pointer; +} +#nav .site-page:not(.child):after { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + width: 0; + height: 3px; + background-color: #80c8f8; + content: ''; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + border-radius: 6px; +} +#nav .site-page:not(.child):hover:after { + width: 100%; +} +#pagination .pagination { + margin-top: 20px; + text-align: center; +} +#pagination .page-number.current { + background: #00c4b6; + color: var(--white); +} +#pagination .full-width { + width: 100% !important; +} +#pagination .pagination-related { + width: 50%; + height: 150px; +} +@media screen and (max-width: 768px) { + #pagination .pagination-related { + width: 100%; + } +} +#pagination .pagination-related .info-1 .info-item-2 { + -webkit-line-clamp: 1; +} +#pagination .pagination-related .info-2 .info-item-1 { + -webkit-line-clamp: 2; +} +#pagination.pagination-post { + overflow: hidden; + margin-top: 40px; + width: 100%; + border-radius: 6px; +} +.layout .pagination > * { + display: inline-block; + margin: 0 6px; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; +} +.layout .pagination > *:not(.space):hover { + background: var(--btn-hover-color); + color: var(--btn-color); +} +#archive .pagination { + margin-top: 30px; +} +#archive .pagination > *:not(.space) { + -webkit-box-shadow: none; + box-shadow: none; +} +.pagination-related { + position: relative; + display: inline-block; + overflow: hidden; + background: #000; + vertical-align: bottom; +} +.pagination-related.next-post .info { + text-align: right; +} +.pagination-related .info .info-1, +.pagination-related .info .info-2 { + padding: 20px 40px; + color: var(--white); + -webkit-transition: -webkit-transform 0.3s, opacity 0.3s; + -moz-transition: -moz-transform 0.3s, opacity 0.3s; + -o-transition: -o-transform 0.3s, opacity 0.3s; + -ms-transition: -ms-transform 0.3s, opacity 0.3s; + transition: transform 0.3s, opacity 0.3s; +} +.pagination-related .info .info-1 .info-item-1 { + color: var(--light-grey); + text-transform: uppercase; + font-size: 90%; +} +.pagination-related .info .info-1 .info-item-2 { + color: var(--white); + font-weight: 500; +} +.pagination-related .info .info-2 { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.pagination-related:not(.no-desc):hover .info-1 { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translate(0, -100%); + -moz-transform: translate(0, -100%); + -o-transform: translate(0, -100%); + -ms-transform: translate(0, -100%); + transform: translate(0, -100%); +} +.pagination-related:not(.no-desc):hover .info-2 { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.container { + word-wrap: break-word; + overflow-wrap: break-word; +} +.container a { + color: #49b1f5; +} +.container a:hover { + text-decoration: underline; +} +.container img { + display: block; + margin: 0 auto 20px; + max-width: 100%; + -webkit-transition: filter 375ms ease-in 0.2s; + -moz-transition: filter 375ms ease-in 0.2s; + -o-transition: filter 375ms ease-in 0.2s; + -ms-transition: filter 375ms ease-in 0.2s; + transition: filter 375ms ease-in 0.2s; + border-radius: 6px; +} +.container p { + margin: 0 0 16px; +} +.container iframe { + margin: 0 0 20px; +} +.container kbd { + margin: 0 3px; + padding: 3px 5px; + border: 1px solid #b4b4b4; + background-color: #f8f8f8; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + color: #34495e; + white-space: nowrap; + font-weight: 600; + font-size: 0.9em; + font-family: Monaco, 'Ubuntu Mono', monospace; + line-height: 1em; + border-radius: 3px; +} +.container ol ol, +.container ul ol, +.container ol ul, +.container ul ul { + padding-left: 20px; +} +.container ol li, +.container ul li { + margin: 4px 0; +} +.container ol p, +.container ul p { + margin: 0 0 8px; +} +.container > :last-child { + margin-bottom: 0 !important; +} +.container hr { + margin: 20px 0; +} +#post .tag_share:after { + display: block; + clear: both; + content: ''; +} +#post .tag_share .post-meta__tag-list { + display: inline-block; +} +#post .tag_share .post-meta__tags { + display: inline-block; + margin: 8px 8px 8px 0; + padding: 0 12px; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#post .tag_share .post-meta__tags:hover { + background: #49b1f5; + color: var(--white); +} +#post .tag_share .post-share { + display: inline-block; + float: right; + margin: 8px 0 0; + width: fit-content; +} +#post .tag_share .post-share .social-share { + font-size: 0.85em; +} +#post .tag_share .post-share .social-share .social-share-icon { + margin: 0 4px; + width: 1.85em; + height: 1.85em; + font-size: 1.2em; + line-height: 1.85em; +} +#post .post-copyright { + position: relative; + margin: 40px 0 10px; + padding: 10px 16px; + border: 1px solid var(--light-grey); + -webkit-transition: box-shadow 0.3s ease-in-out; + -moz-transition: box-shadow 0.3s ease-in-out; + -o-transition: box-shadow 0.3s ease-in-out; + -ms-transition: box-shadow 0.3s ease-in-out; + transition: box-shadow 0.3s ease-in-out; + border-radius: 6px; +} +#post .post-copyright:before { + position: absolute; + top: 2px; + right: 12px; + color: #49b1f5; + content: '\f1f9'; + font-size: 1.3em; +} +#post .post-copyright:hover { + -webkit-box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); + box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); +} +#post .post-copyright .post-copyright-meta { + color: #49b1f5; + font-weight: bold; +} +#post .post-copyright .post-copyright-meta i { + margin-right: 3px; +} +#post .post-copyright .post-copyright-info { + padding-left: 6px; +} +#post .post-copyright .post-copyright-info a { + text-decoration: underline; + word-break: break-word; +} +#post .post-copyright .post-copyright-info a:hover { + text-decoration: none; +} +#post #post-outdate-notice { + position: relative; + margin: 0 0 20px; + padding: 0.5em 1.2em; + background-color: #ffe6e6; + color: #f66; + border-radius: 3px; + padding: 0.5em 1em 0.5em 2.6em; + border-left: 5px solid #ff8080; +} +#post #post-outdate-notice .num { + padding: 0 4px; +} +#post #post-outdate-notice:before { + position: absolute; + top: 50%; + left: 0.9em; + color: #ff8080; + content: '\f071'; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +#post .ads-wrap { + margin: 40px 0; +} +.relatedPosts { + margin-top: 40px; +} +.relatedPosts > .headline { + margin-bottom: 5px; + font-weight: 700; + font-size: 1.43em; +} +.relatedPosts > .relatedPosts-list > a { + margin: 3px; + width: calc(33.333% - 6px); + height: 200px; + border-radius: 6px; +} +@media screen and (max-width: 768px) { + .relatedPosts > .relatedPosts-list > a { + margin: 2px; + width: calc(50% - 4px); + height: 150px; + } +} +@media screen and (max-width: 600px) { + .relatedPosts > .relatedPosts-list > a { + width: calc(100% - 4px); + } +} +.relatedPosts > .relatedPosts-list .info .info-1 .info-item-2 { + -webkit-line-clamp: 2; +} +.relatedPosts > .relatedPosts-list .info .info-2 .info-item-1 { + -webkit-line-clamp: 3; +} +.post-reward { + position: relative; + margin-top: 80px; + width: 100%; + text-align: center; + pointer-events: none; +} +.post-reward > * { + pointer-events: auto; +} +.post-reward .reward-button { + display: inline-block; + padding: 4px 24px; + background: var(--btn-bg); + color: var(--btn-color); + cursor: pointer; + border-radius: 6px; +} +.post-reward .reward-button i { + margin-right: 5px; +} +.post-reward:hover .reward-button { + background: var(--btn-hover-color); +} +.post-reward:hover > .reward-main { + display: block; +} +.post-reward .reward-main { + position: absolute; + bottom: 40px; + left: 0; + z-index: 100; + display: none; + padding: 0 0 15px; + width: 100%; + border-radius: 6px; +} +.post-reward .reward-main .reward-all { + display: inline-block; + margin: 0; + padding: 20px 10px; + background: var(--reward-pop); +} +.post-reward .reward-main .reward-all:before { + position: absolute; + bottom: -10px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +.post-reward .reward-main .reward-all:after { + position: absolute; + right: 0; + bottom: 2px; + left: 0; + margin: 0 auto; + width: 0; + height: 0; + border-top: 13px solid var(--reward-pop); + border-right: 13px solid transparent; + border-left: 13px solid transparent; + content: ''; +} +.post-reward .reward-main .reward-all .reward-item { + display: inline-block; + padding: 0 8px; + list-style-type: none; + vertical-align: top; +} +.post-reward .reward-main .reward-all .reward-item img { + width: 130px; + height: 130px; +} +.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc { + width: 130px; + color: #858585; +} +#rightside { + position: fixed; + right: -48px; + bottom: 40px; + z-index: 100; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#rightside.rightside-show { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transform: translate(-58px, 0); + -moz-transform: translate(-58px, 0); + -o-transform: translate(-58px, 0); + -ms-transform: translate(-58px, 0); + transform: translate(-58px, 0); +} +#rightside #rightside-config-hide { + height: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: -webkit-transform 0.4s; + -moz-transition: -moz-transform 0.4s; + -o-transition: -o-transform 0.4s; + -ms-transition: -ms-transform 0.4s; + transition: transform 0.4s; + -webkit-transform: translate(45px, 0); + -moz-transform: translate(45px, 0); + -o-transform: translate(45px, 0); + -ms-transform: translate(45px, 0); + transform: translate(45px, 0); +} +#rightside #rightside-config-hide.show { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +#rightside #rightside-config-hide.status { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; +} +#rightside > div > button, +#rightside > div > a { + display: block; + margin-bottom: 5px; + width: 35px; + height: 35px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + font-size: 16px; + line-height: 35px; + border-radius: 5px; +} +#rightside > div > button:hover, +#rightside > div > a:hover { + background-color: var(--btn-hover-color); +} +#rightside #mobile-toc-button { + display: none; +} +@media screen and (max-width: 900px) { + #rightside #mobile-toc-button { + display: block; + } +} +@media screen and (max-width: 900px) { + #rightside #hide-aside-btn { + display: none; + } +} +#sidebar #menu-mask { + position: fixed; + z-index: 102; + display: none; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.8); +} +#sidebar #sidebar-menus { + position: fixed; + top: 0; + right: -330px; + z-index: 103; + overflow-x: hidden; + overflow-y: scroll; + padding-left: 5px; + width: 330px; + height: 100%; + background: var(--sidebar-bg); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#sidebar #sidebar-menus.open { + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#sidebar #sidebar-menus > .avatar-img { + margin: 20px auto; +} +#sidebar #sidebar-menus .site-data { + padding: 0 10px; +} +#sidebar #sidebar-menus hr { + margin: 20px auto; +} +#sidebar #sidebar-menus .menus_items { + margin: 20px; + padding: 15px; + background: var(--sidebar-menu-bg); + -webkit-box-shadow: 0 0 1px 1px rgba(7,17,27,0.05); + box-shadow: 0 0 1px 1px rgba(7,17,27,0.05); + border-radius: 10px; +} +#sidebar #sidebar-menus .menus_items .site-page { + position: relative; + display: block; + margin: 4px 0; + padding: 2px 23px 2px 15px; + color: var(--font-color); + font-size: 1.15em; + cursor: pointer; + border-radius: 6px; +} +#sidebar #sidebar-menus .menus_items .site-page:hover { + background: var(--text-bg-hover); + color: var(--white); +} +#sidebar #sidebar-menus .menus_items .site-page i:first-child { + width: 15%; + text-align: left; +} +#sidebar #sidebar-menus .menus_items .site-page.group > i:last-child { + position: absolute; + top: 0.6em; + right: 10px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide > i:last-child { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide + .menus_item_child { + display: none; +} +#sidebar #sidebar-menus .menus_items .menus_item_child { + margin: 0; + padding-left: 25px; + list-style: none; +} +#vcomment { + font-size: 1.1em; +} +#vcomment .vbtn { + border: none; + background: var(--btn-bg); + color: var(--btn-color); +} +#vcomment .vbtn:hover { + background: var(--btn-hover-color); +} +#vcomment .vimg { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#vcomment .vimg:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#vcomment .vcards .vcard .vcontent.expand:before, +#vcomment .vcards .vcard .vcontent.expand:after { + z-index: 22; +} +#waline-wrap { + --waline-font-size: 1.1em; + --waline-theme-color: #49b1f5; + --waline-active-color: #ff7242; +} +#waline-wrap .wl-comment-actions > button:not(last-child) { + padding-right: 4px; +} +.twikoo .tk-content p { + margin: 3px 0; +} +.fireworks { + position: fixed; + top: 0; + left: 0; + z-index: 9999; + pointer-events: none; +} +.medium-zoom-image--opened { + z-index: 99999 !important; + margin: 0 !important; +} +.medium-zoom-overlay { + z-index: 99999 !important; +} +.utterances, +.fb-comments iframe { + width: 100% !important; +} +#gitalk-container .gt-meta { + margin: 0 0 0.8em; + padding: 6px 0 16px; +} +.aplayer { + color: #4c4948; +} +.container .aplayer { + margin: 0 0 20px; +} +.snackbar-container.snackbar-css { + border-radius: 5px; + opacity: 0.85 !important; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)" !important; + filter: alpha(opacity=85) !important; +} +.abc-music-sheet { + margin: 0 0 20px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.3s; + -moz-transition: opacity 0.3s; + -o-transition: opacity 0.3s; + -ms-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.abc-music-sheet.abcjs-container { + opacity: 1; + -ms-filter: none; + filter: none; +} +@media screen and (max-width: 768px) { + .fancybox__toolbar__column.is-middle { + display: none; + } +} +.container .btn-center { + margin: 0 0 20px; + text-align: center; +} +.container .btn-beautify { + display: inline-block; + margin: 0 4px 6px; + padding: 0 15px; + background-color: var(--btn-beautify-color, #777); + color: #fff; + line-height: 2; + border-radius: 6px; +} +.container .btn-beautify.blue { + --btn-beautify-color: #428bca; +} +.container .btn-beautify.pink { + --btn-beautify-color: #ff69b4; +} +.container .btn-beautify.red { + --btn-beautify-color: #f00; +} +.container .btn-beautify.purple { + --btn-beautify-color: #6f42c1; +} +.container .btn-beautify.orange { + --btn-beautify-color: #ff8c00; +} +.container .btn-beautify.green { + --btn-beautify-color: #5cb85c; +} +.container .btn-beautify:hover { + background-color: var(--btn-hover-color); +} +.container .btn-beautify i + span { + margin-left: 6px; +} +.container .btn-beautify:not(.block) + .btn-beautify:not(.block) { + margin: 0 4px 20px; +} +.container .btn-beautify.block { + display: block; + margin: 0 0 20px; + width: fit-content; + width: -moz-fit-content; +} +.container .btn-beautify.block.center { + margin: 0 auto 20px; +} +.container .btn-beautify.block.right { + margin: 0 0 20px auto; +} +.container .btn-beautify.larger { + padding: 6px 15px; +} +.container .btn-beautify:hover { + text-decoration: none; +} +.container .btn-beautify.outline { + border: 1px solid transparent; + border-color: var(--btn-beautify-color, #777); + background-color: transparent; + color: var(--btn-beautify-color, #777); +} +.container .btn-beautify.outline:hover { + background-color: var(--btn-beautify-color, #777); +} +.container .btn-beautify.outline:hover { + color: #fff !important; +} +.container figure.gallery-group { + position: relative; + float: left; + overflow: hidden; + margin: 6px 4px; + width: calc(50% - 8px); + height: 250px; + border-radius: 10px; + background: #000; + -webkit-transform: translate3d(0, 0, 0); +} +@media screen and (max-width: 600px) { + .container figure.gallery-group { + width: calc(100% - 8px); + } +} +@media screen and (min-width: 1024px) { + .container figure.gallery-group { + width: calc(100% / 3 - 8px); + } +} +.container figure.gallery-group:hover img { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.container figure.gallery-group:hover .gallery-group-name::after { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.container figure.gallery-group:hover p { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.container figure.gallery-group img { + position: relative; + margin: 0; + max-width: none; + width: calc(100% + 20px); + height: 250px; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transition: all 0.3s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.3s, filter 375ms ease-in 0.2s; + -o-transition: all 0.3s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.3s, filter 375ms ease-in 0.2s; + transition: all 0.3s, filter 375ms ease-in 0.2s; + -webkit-transform: translate3d(-10px, 0, 0); + -moz-transform: translate3d(-10px, 0, 0); + -o-transform: translate3d(-10px, 0, 0); + -ms-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + object-fit: cover; +} +.container figure.gallery-group figcaption { + position: absolute; + top: 0; + left: 0; + padding: 30px; + width: 100%; + height: 100%; + color: #fff; + text-transform: uppercase; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} +.container figure.gallery-group figcaption > a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.container figure.gallery-group p { + margin: 0; + padding: 8px 0 0; + letter-spacing: 1px; + font-size: 1.1em; + line-height: 1.5; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.35s, -webkit-transform 0.35s; + -moz-transition: opacity 0.35s, -moz-transform 0.35s; + -o-transition: opacity 0.35s, -o-transform 0.35s; + -ms-transition: opacity 0.35s, -ms-transform 0.35s; + transition: opacity 0.35s, transform 0.35s; + -webkit-transform: translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0); + -o-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + -webkit-line-clamp: 4; +} +.container figure.gallery-group .gallery-group-name { + position: relative; + margin: 0; + padding: 8px 0; + font-weight: bold; + font-size: 1.65em; + line-height: 1.5; + -webkit-line-clamp: 2; +} +.container figure.gallery-group .gallery-group-name:after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: #fff; + content: ''; + -webkit-transition: -webkit-transform 0.35s; + -moz-transition: -moz-transform 0.35s; + -o-transition: -o-transform 0.35s; + -ms-transition: -ms-transform 0.35s; + transition: transform 0.35s; + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +.container .gallery-group-main { + overflow: auto; + padding: 0 0 16px; +} +.container .gallery-container { + margin: 0 0 20px; + text-align: center; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.container .gallery-container.loaded { + opacity: 1; + -ms-filter: none; + filter: none; +} +.container .gallery-container img { + display: initial; + margin: 0; + width: 100%; + height: 100%; +} +.container .gallery-container .gallery-data { + display: none; +} +.container .gallery-container button { + margin-top: 25px; + padding: 8px 14px; + background: var(--btn-bg); + color: var(--btn-color); + font-weight: bold; + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + border-radius: 5px; +} +.container .gallery-container button:hover { + background: var(--btn-hover-color); +} +.container .gallery-container button:hover i { + margin-left: 8px; +} +.container .gallery-container button i { + margin-left: 4px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.container .loading-container { + display: inline-block; + overflow: hidden; + width: 154px; + height: 154px; +} +.container .loading-container .loading-item { + position: relative; + width: 100%; + height: 100%; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateZ(0) scale(1); + -moz-transform: translateZ(0) scale(1); + -o-transform: translateZ(0) scale(1); + -ms-transform: translateZ(0) scale(1); + transform: translateZ(0) scale(1); + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -o-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +.container .loading-container .loading-item div { + position: absolute; + width: 30.8px; + height: 30.8px; + border-radius: 50%; + background: #e15b64; + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + -webkit-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -moz-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -o-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -ms-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); +} +.container .loading-container .loading-item div:nth-child(1) { + background: #f47e60; + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + -webkit-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -moz-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -o-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -ms-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; +} +.container .loading-container .loading-item div:nth-child(2) { + background: #e15b64; + -webkit-animation-delay: -0.48s; + -moz-animation-delay: -0.48s; + -o-animation-delay: -0.48s; + -ms-animation-delay: -0.48s; + animation-delay: -0.48s; +} +.container .loading-container .loading-item div:nth-child(3) { + background: #f47e60; + -webkit-animation-delay: -0.96s; + -moz-animation-delay: -0.96s; + -o-animation-delay: -0.96s; + -ms-animation-delay: -0.96s; + animation-delay: -0.96s; +} +.container .loading-container .loading-item div:nth-child(4) { + background: #f8b26a; + -webkit-animation-delay: -1.44s; + -moz-animation-delay: -1.44s; + -o-animation-delay: -1.44s; + -ms-animation-delay: -1.44s; + animation-delay: -1.44s; +} +.container .loading-container .loading-item div:nth-child(5) { + background: #abbd81; + -webkit-animation-delay: -1.92s; + -moz-animation-delay: -1.92s; + -o-animation-delay: -1.92s; + -ms-animation-delay: -1.92s; + animation-delay: -1.92s; +} +@-moz-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-webkit-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-o-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-moz-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-webkit-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-o-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-moz-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@-webkit-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@-o-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +blockquote.pullquote { + position: relative; + max-width: 45%; + font-size: 110%; +} +blockquote.pullquote.left { + float: left; + margin: 1em 0.5em 0 0; +} +blockquote.pullquote.right { + float: right; + margin: 1em 0 0 0.5em; +} +.video-container { + position: relative; + overflow: hidden; + margin-bottom: 16px; + padding-top: 56.25%; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +.hide-inline > .hide-button, +.hide-block > .hide-button { + display: inline-block; + padding: 5px 18px; + background: #49b1f5; + color: var(--white); + border-radius: 6px; +} +.hide-inline > .hide-button:hover, +.hide-block > .hide-button:hover { + background-color: var(--btn-hover-color); +} +.hide-inline > .hide-button.open, +.hide-block > .hide-button.open { + display: none; +} +.hide-inline > .hide-button.open + div, +.hide-block > .hide-button.open + div { + display: block; +} +.hide-inline > .hide-button.open + span, +.hide-block > .hide-button.open + span { + display: inline; +} +.hide-inline > .hide-content, +.hide-block > .hide-content { + display: none; +} +.hide-inline > .hide-button { + margin: 0 6px; +} +.hide-inline > .hide-content { + margin: 0 6px; +} +.hide-block { + margin: 0 0 16px; +} +.toggle { + margin-bottom: 20px; + border: 1px solid #f0f0f0; + border-radius: 5px; + overflow: hidden; +} +.toggle > .toggle-button { + padding: 6px 15px; + background: #f0f0f0; + color: #1f2d3d; + cursor: pointer; +} +.toggle > .toggle-content { + margin: 30px 24px; +} +.container .inline-img { + display: inline; + margin: 0 3px; + height: 1.1em; + vertical-align: text-bottom; +} +.hl-label { + padding: 2px 4px; + color: #fff; + border-radius: 3px; +} +.hl-label.default { + background-color: #777; +} +.hl-label.blue { + background-color: #428bca; +} +.hl-label.pink { + background-color: #ff69b4; +} +.hl-label.red { + background-color: #f00; +} +.hl-label.purple { + background-color: #6f42c1; +} +.hl-label.orange { + background-color: #ff8c00; +} +.hl-label.green { + background-color: #5cb85c; +} +.note { + position: relative; + margin: 0 0 20px; + padding: 15px; + border-radius: 3px; +} +.note.icon-padding { + padding-left: 3em; +} +.note > .note-icon { + position: absolute; + top: calc(50% - 0.5em); + left: 0.8em; + font-size: larger; +} +.note.blue:not(.disabled) { + border-left-color: #428bca !important; +} +.note.blue:not(.disabled).modern { + border-left-color: transparent !important; + color: #428bca; +} +.note.blue:not(.disabled):not(.simple) { + background: #e3eef7 !important; +} +.note.blue > .note-icon { + color: #428bca; +} +.note.pink:not(.disabled) { + border-left-color: #ff69b4 !important; +} +.note.pink:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff69b4; +} +.note.pink:not(.disabled):not(.simple) { + background: #ffe9f4 !important; +} +.note.pink > .note-icon { + color: #ff69b4; +} +.note.red:not(.disabled) { + border-left-color: #f00 !important; +} +.note.red:not(.disabled).modern { + border-left-color: transparent !important; + color: #f00; +} +.note.red:not(.disabled):not(.simple) { + background: #ffd9d9 !important; +} +.note.red > .note-icon { + color: #f00; +} +.note.purple:not(.disabled) { + border-left-color: #6f42c1 !important; +} +.note.purple:not(.disabled).modern { + border-left-color: transparent !important; + color: #6f42c1; +} +.note.purple:not(.disabled):not(.simple) { + background: #e9e3f6 !important; +} +.note.purple > .note-icon { + color: #6f42c1; +} +.note.orange:not(.disabled) { + border-left-color: #ff8c00 !important; +} +.note.orange:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff8c00; +} +.note.orange:not(.disabled):not(.simple) { + background: #ffeed9 !important; +} +.note.orange > .note-icon { + color: #ff8c00; +} +.note.green:not(.disabled) { + border-left-color: #5cb85c !important; +} +.note.green:not(.disabled).modern { + border-left-color: transparent !important; + color: #5cb85c; +} +.note.green:not(.disabled):not(.simple) { + background: #e7f4e7 !important; +} +.note.green > .note-icon { + color: #5cb85c; +} +.note.simple { + border: 1px solid #eee; + border-left-width: 5px; +} +.note.modern { + border: 1px solid transparent !important; + background-color: #f5f5f5; + color: #4c4948; +} +.note.flat { + border: initial; + border-left: 5px solid #eee; + background-color: #f9f9f9; + color: #4c4948; +} +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 3px; + margin-bottom: 0; + padding-top: 0 !important; + border-bottom: initial; +} +.note p:first-child, +.note ul:first-child, +.note ol:first-child, +.note table:first-child, +.note pre:first-child, +.note blockquote:first-child, +.note img:first-child { + margin-top: 0 !important; +} +.note p:last-child, +.note ul:last-child, +.note ol:last-child, +.note table:last-child, +.note pre:last-child, +.note blockquote:last-child, +.note img:last-child { + margin-bottom: 0 !important; +} +.note .img-alt { + margin: 5px 0 10px; +} +.note:not(.no-icon) { + padding-left: 3em; +} +.note:not(.no-icon)::before { + position: absolute; + top: calc(50% - 0.95em); + left: 0.8em; + font-size: larger; +} +.note.default.flat { + background: #f7f7f7; +} +.note.default.modern { + border-color: #e1e1e1; + background: #f3f3f3; + color: #666; +} +.note.default.modern a:not(.btn) { + color: #666; +} +.note.default.modern a:not(.btn):hover { + color: #454545; +} +.note.default:not(.modern) { + border-left-color: #777; +} +.note.default:not(.modern) h2, +.note.default:not(.modern) h3, +.note.default:not(.modern) h4, +.note.default:not(.modern) h5, +.note.default:not(.modern) h6 { + color: #777; +} +.note.default:not(.no-icon)::before { + content: '\f0a9'; +} +.note.default:not(.no-icon):not(.modern)::before { + color: #777; +} +.note.primary.flat { + background: #f5f0fa; +} +.note.primary.modern { + border-color: #e1c2ff; + background: #f3daff; + color: #6f42c1; +} +.note.primary.modern a:not(.btn) { + color: #6f42c1; +} +.note.primary.modern a:not(.btn):hover { + color: #453298; +} +.note.primary:not(.modern) { + border-left-color: #6f42c1; +} +.note.primary:not(.modern) h2, +.note.primary:not(.modern) h3, +.note.primary:not(.modern) h4, +.note.primary:not(.modern) h5, +.note.primary:not(.modern) h6 { + color: #6f42c1; +} +.note.primary:not(.no-icon)::before { + content: '\f055'; +} +.note.primary:not(.no-icon):not(.modern)::before { + color: #6f42c1; +} +.note.info.flat { + background: #eef7fa; +} +.note.info.modern { + border-color: #b3e5ef; + background: #d9edf7; + color: #31708f; +} +.note.info.modern a:not(.btn) { + color: #31708f; +} +.note.info.modern a:not(.btn):hover { + color: #215761; +} +.note.info:not(.modern) { + border-left-color: #428bca; +} +.note.info:not(.modern) h2, +.note.info:not(.modern) h3, +.note.info:not(.modern) h4, +.note.info:not(.modern) h5, +.note.info:not(.modern) h6 { + color: #428bca; +} +.note.info:not(.no-icon)::before { + content: '\f05a'; +} +.note.info:not(.no-icon):not(.modern)::before { + color: #428bca; +} +.note.success.flat { + background: #eff8f0; +} +.note.success.modern { + border-color: #d0e6be; + background: #dff0d8; + color: #3c763d; +} +.note.success.modern a:not(.btn) { + color: #3c763d; +} +.note.success.modern a:not(.btn):hover { + color: #32562c; +} +.note.success:not(.modern) { + border-left-color: #5cb85c; +} +.note.success:not(.modern) h2, +.note.success:not(.modern) h3, +.note.success:not(.modern) h4, +.note.success:not(.modern) h5, +.note.success:not(.modern) h6 { + color: #5cb85c; +} +.note.success:not(.no-icon)::before { + content: '\f058'; +} +.note.success:not(.no-icon):not(.modern)::before { + color: #5cb85c; +} +.note.warning.flat { + background: #fdf8ea; +} +.note.warning.modern { + border-color: #fae4cd; + background: #fcf4e3; + color: #8a6d3b; +} +.note.warning.modern a:not(.btn) { + color: #8a6d3b; +} +.note.warning.modern a:not(.btn):hover { + color: #714f30; +} +.note.warning:not(.modern) { + border-left-color: #f0ad4e; +} +.note.warning:not(.modern) h2, +.note.warning:not(.modern) h3, +.note.warning:not(.modern) h4, +.note.warning:not(.modern) h5, +.note.warning:not(.modern) h6 { + color: #f0ad4e; +} +.note.warning:not(.no-icon)::before { + content: '\f06a'; +} +.note.warning:not(.no-icon):not(.modern)::before { + color: #f0ad4e; +} +.note.danger.flat { + background: #fcf1f2; +} +.note.danger.modern { + border-color: #ebcdd2; + background: #f2dfdf; + color: #a94442; +} +.note.danger.modern a:not(.btn) { + color: #a94442; +} +.note.danger.modern a:not(.btn):hover { + color: #84333f; +} +.note.danger:not(.modern) { + border-left-color: #d9534f; +} +.note.danger:not(.modern) h2, +.note.danger:not(.modern) h3, +.note.danger:not(.modern) h4, +.note.danger:not(.modern) h5, +.note.danger:not(.modern) h6 { + color: #d9534f; +} +.note.danger:not(.no-icon)::before { + content: '\f056'; +} +.note.danger:not(.no-icon):not(.modern)::before { + color: #d9534f; +} +.container .series-items a:hover { + color: var(--pseudo-hover); +} +.container .tabs { + position: relative; + margin: 0 0 20px; + border-right: 1px solid var(--tab-border-color); + border-bottom: 1px solid var(--tab-border-color); + border-left: 1px solid var(--tab-border-color); + border-radius: 6px; + overflow: hidden; +} +.container .tabs > .nav-tabs { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -o-box-lines: multiple; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; + background: var(--tab-botton-bg); +} +.container .tabs > .nav-tabs > .tab { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + -ms-box-flex: 1; + box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + padding: 8px 18px; + border-top: 2px solid var(--tab-border-color); + background: var(--tab-botton-bg); + color: var(--tab-botton-color); + line-height: 2; + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +.container .tabs > .nav-tabs > .tab i { + width: 1.5em; +} +.container .tabs > .nav-tabs > .tab.active { + border-top: 2px solid #49b1f5; + background: var(--tab-button-active-bg); + cursor: default; +} +.container .tabs > .nav-tabs > .tab:not(.active):hover { + border-top: 2px solid var(--tab-button-hover-bg); + background: var(--tab-button-hover-bg); +} +.container .tabs > .nav-tabs.no-default ~ .tab-to-top { + display: none; +} +.container .tabs > .tab-contents .tab-item-content { + position: relative; + display: none; + padding: 36px 24px 10px; +} +@media screen and (max-width: 768px) { + .container .tabs > .tab-contents .tab-item-content { + padding: 24px 14px; + } +} +.container .tabs > .tab-contents .tab-item-content.active { + display: block; + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +.container .tabs > .tab-contents .tab-item-content > :last-child { + margin-bottom: 0; +} +.container .tabs > .tab-to-top { + padding: 0 16px 10px 0; + width: 100%; + text-align: right; +} +.container .tabs > .tab-to-top button { + color: #99a9bf; +} +.container .tabs > .tab-to-top button:hover { + color: #49b1f5; +} +@-moz-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.container .timeline { + margin: 0 10px 20px; + padding: 14px 0 5px 20px; + border-left: 2px solid var(--timeline-color, #49b1f5); +} +.container .timeline.blue { + --timeline-color: #428bca; + --timeline-bg: rgba(66,139,202, 0.2); +} +.container .timeline.pink { + --timeline-color: #ff69b4; + --timeline-bg: rgba(255,105,180, 0.2); +} +.container .timeline.red { + --timeline-color: #f00; + --timeline-bg: rgba(255,0,0, 0.2); +} +.container .timeline.purple { + --timeline-color: #6f42c1; + --timeline-bg: rgba(111,66,193, 0.2); +} +.container .timeline.orange { + --timeline-color: #ff8c00; + --timeline-bg: rgba(255,140,0, 0.2); +} +.container .timeline.green { + --timeline-color: #5cb85c; + --timeline-bg: rgba(92,184,92, 0.2); +} +.container .timeline .timeline-item { + margin: 0 0 15px; +} +.container .timeline .timeline-item:hover .item-circle:before { + border-color: var(--timeline-color, #49b1f5); +} +.container .timeline .timeline-item.headline .timeline-item-title .item-circle > p { + font-weight: 600; + font-size: 1.2em; +} +.container .timeline .timeline-item.headline .timeline-item-title .item-circle:before { + left: -28px; + border: 4px solid var(--timeline-color, #49b1f5); +} +.container .timeline .timeline-item.headline:hover .item-circle:before { + border-color: var(--pseudo-hover); +} +.container .timeline .timeline-item .timeline-item-title { + position: relative; +} +.container .timeline .timeline-item .item-circle:before { + position: absolute; + top: 50%; + left: -27px; + width: 6px; + height: 6px; + border: 3px solid var(--pseudo-hover); + border-radius: 50%; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.container .timeline .timeline-item .item-circle > p { + margin: 0 0 8px; + font-weight: 500; +} +.container .timeline .timeline-item .timeline-item-content { + position: relative; + padding: 12px 15px; + border-radius: 8px; + background: var(--timeline-bg, #e4f3fd); + font-size: 0.93em; +} +.container .timeline .timeline-item .timeline-item-content > :last-child { + margin-bottom: 0; +} +.container .timeline + .timeline { + margin-top: -20px; +} +[data-theme='dark'] { + --global-bg: #0d0d0d; + --font-color: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.4); + --hr-before-color: rgba(255,255,255,0.7); + --search-bg: #121212; + --search-input-color: rgba(255,255,255,0.7); + --search-a-color: rgba(255,255,255,0.7); + --preloader-bg: #0d0d0d; + --preloader-color: rgba(255,255,255,0.7); + --tab-border-color: #2c2c2c; + --tab-botton-bg: #2c2c2c; + --tab-botton-color: rgba(255,255,255,0.7); + --tab-button-hover-bg: #383838; + --tab-button-active-bg: #121212; + --card-bg: #121212; + --sidebar-bg: #121212; + --sidebar-menu-bg: #1f1f1f; + --btn-hover-color: #787878; + --btn-color: rgba(255,255,255,0.7); + --btn-bg: #1f1f1f; + --text-bg-hover: #383838; + --light-grey: rgba(255,255,255,0.7); + --dark-grey: rgba(255,255,255,0.2); + --white: rgba(255,255,255,0.9); + --text-highlight-color: rgba(255,255,255,0.9); + --blockquote-color: rgba(255,255,255,0.7); + --blockquote-bg: #2c2c2c; + --reward-pop: #2c2c2c; + --toc-link-color: rgba(255,255,255,0.6); + --scrollbar-color: #525252; + --timeline-bg: #1f1f1f; + --zoom-bg: #121212; + --mark-bg: rgba(0,0,0,0.6); +} +[data-theme='dark'] #web_bg:before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.7); + content: ''; +} +[data-theme='dark'] .container code { + background: #2c2c2c; +} +[data-theme='dark'] .container pre > code { + background: #171717; +} +[data-theme='dark'] .container figure.highlight { + -webkit-box-shadow: none; + box-shadow: none; +} +[data-theme='dark'] .container .note code { + background: rgba(27,31,35,0.05); +} +[data-theme='dark'] .container .aplayer { + filter: brightness(0.8); +} +[data-theme='dark'] .container kbd { + border-color: #696969; + background-color: #525252; + color: #e2f1ff; +} +[data-theme='dark'] #page-header.nav-fixed > #nav, +[data-theme='dark'] #page-header.not-top-img > #nav { + background: rgba(18,18,18,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0); +} +[data-theme='dark'] #post-comment .comment-switch { + background: #2c2c2c !important; +} +[data-theme='dark'] #post-comment .comment-switch #switch-btn { + filter: brightness(0.8); +} +[data-theme='dark'] .note { + filter: brightness(0.8); +} +[data-theme='dark'] .hide-button, +[data-theme='dark'] .btn-beautify, +[data-theme='dark'] .hl-label, +[data-theme='dark'] #post-outdate-notice, +[data-theme='dark'] .error-img, +[data-theme='dark'] .container iframe, +[data-theme='dark'] .gist, +[data-theme='dark'] .ads-wrap { + filter: brightness(0.8); +} +[data-theme='dark'] img { + filter: brightness(0.8); +} +[data-theme='dark'] #aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed rgba(255,255,255,0.1); +} +[data-theme='dark'] #gitalk-container { + filter: brightness(0.8); +} +[data-theme='dark'] #gitalk-container svg { + fill: rgba(255,255,255,0.9) !important; +} +[data-theme='dark'] #disqusjs #dsqjs:hover, +[data-theme='dark'] #disqusjs #dsqjs:focus, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-tab-active, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-no-comment { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-order-label { + background-color: #1f1f1f; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body code, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body pre { + background: #2c2c2c; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body blockquote { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #artitalk_main #lazy { + background: #121212; +} +[data-theme='dark'] #operare_artitalk .c2 { + background: #121212; +} +@media screen and (max-width: 900px) { + [data-theme='dark'] #card-toc { + background: #1f1f1f; + } +} +[data-theme='dark'] .artalk.atk-dark-mode, +[data-theme='dark'] .atk-layer-wrap.atk-dark-mode { + --at-color-font: rgba(255,255,255,0.7); + --at-color-meta: rgba(255,255,255,0.7); + --at-color-grey: rgba(255,255,255,0.7); +} +[data-theme='dark'] .atk-send-btn, +[data-theme='dark'] .atk-badge { + color: rgba(255,255,255,0.7) !important; +} +[data-theme='dark'] #waline-wrap { + --waline-color: rgba(255,255,255,0.7); + --waline-dark-grey: rgba(255,255,255,0.7); + --waline-info-color: rgba(255,255,255,0.5); +} +.read-mode { + --font-color: #4c4948; + --readmode-light-color: #fff; + --white: #4c4948; + --light-grey: #4c4948; + --gray: #d6dbdf; + --hr-border: #d6dbdf; + --hr-before-color: #b9c2c9; + --highlight-bg: #f7f7f7; + --exit-btn-bg: #c0c0c0; + --exit-btn-color: #fff; + --exit-btn-hover: #8d8d8d; + --pseudo-hover: none; +} +[data-theme='dark'] .read-mode { + --font-color: rgba(255,255,255,0.7); + --readmode-light-color: #0d0d0d; + --white: rgba(255,255,255,0.9); + --light-grey: rgba(255,255,255,0.7); + --gray: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.5); + --hr-before-color: rgba(255,255,255,0.7); + --highlight-bg: #171717; + --exit-btn-bg: #1f1f1f; + --exit-btn-color: rgba(255,255,255,0.9); + --exit-btn-hover: #525252; +} +.read-mode { + background: var(--readmode-light-color); +} +.read-mode .exit-readmode { + position: fixed; + top: 30px; + right: 30px; + z-index: 100; + width: 40px; + height: 40px; + background: var(--exit-btn-bg); + color: var(--exit-btn-color); + font-size: 16px; + -webkit-transition: background 0.3s; + -moz-transition: background 0.3s; + -o-transition: background 0.3s; + -ms-transition: background 0.3s; + transition: background 0.3s; + border-radius: 8px; +} +@media screen and (max-width: 768px) { + .read-mode .exit-readmode { + top: initial; + bottom: 30px; + } +} +.read-mode .exit-readmode:hover { + background: var(--exit-btn-hover); +} +.read-mode #aside-content { + display: none; +} +.read-mode #page-header.post-bg { + background: none !important; +} +.read-mode #page-header.post-bg:before { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.read-mode #page-header.post-bg > #post-info { + text-align: center; +} +.read-mode #post { + margin: 0 auto; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode #post:hover { + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode > canvas { + display: none !important; +} +.read-mode .highlight-tools, +.read-mode #footer, +.read-mode #post > *:not(#post-info):not(.post-content), +.read-mode #nav, +.read-mode #post-outdate-notice, +.read-mode #web_bg, +.read-mode #rightside, +.read-mode .not-top-img { + display: none !important; +} +.read-mode .container a { + color: #99a9bf; +} +.read-mode .container pre, +.read-mode .container .highlight:not(.js-file-line-container) { + background: var(--highlight-bg) !important; +} +.read-mode .container pre *, +.read-mode .container .highlight:not(.js-file-line-container) * { + color: var(--font-color) !important; +} +.read-mode .container figure.highlight { + border-radius: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.read-mode .container figure.highlight > :not(.highlight-tools) { + display: block !important; +} +.read-mode .container figure.highlight .line:before { + color: var(--font-color) !important; +} +.read-mode .container figure.highlight .hljs { + background: var(--highlight-bg) !important; +} +.read-mode .container h1, +.read-mode .container h2, +.read-mode .container h3, +.read-mode .container h4, +.read-mode .container h5, +.read-mode .container h6 { + padding: 0; +} +.read-mode .container h1:before, +.read-mode .container h2:before, +.read-mode .container h3:before, +.read-mode .container h4:before, +.read-mode .container h5:before, +.read-mode .container h6:before { + content: ''; +} +.read-mode .container h1:hover, +.read-mode .container h2:hover, +.read-mode .container h3:hover, +.read-mode .container h4:hover, +.read-mode .container h5:hover, +.read-mode .container h6:hover { + padding: 0; +} +.read-mode .container ul:hover:before, +.read-mode .container li:hover:before, +.read-mode .container ol:hover:before { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.read-mode .container ol:before, +.read-mode .container li:before { + background: transparent !important; + color: var(--font-color) !important; +} +.read-mode .container ul >li:before { + border-color: var(--gray) !important; +} +.read-mode .container .tabs { + border: 2px solid var(--tab-border-color); +} +.read-mode .container .tabs > .nav-tabs { + background: transparent; +} +.read-mode .container .tabs > .nav-tabs > .tab { + border-top: none !important; +} +.read-mode .container .tabs > .tab-contents .tab-item-content.active { + -webkit-animation: none; + -moz-animation: none; + -o-animation: none; + -ms-animation: none; + animation: none; +} +.read-mode .container code { + color: var(--font-color); +} +.read-mode .container blockquote { + border-color: var(--gray); + background-color: var(--readmode-light-color); +} +.read-mode .container kbd { + border: 1px solid var(--gray); + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: var(--font-color); +} +.read-mode .container .hide-toggle { + border: 1px solid var(--gray) !important; +} +.read-mode .container .hide-button, +.read-mode .container .btn-beautify, +.read-mode .container .hl-label { + border: 1px solid var(--gray) !important; + background: var(--readmode-light-color) !important; + color: var(--font-color) !important; +} +.read-mode .container .note { + border: 2px solid var(--gray); + border-left-color: var(--gray) !important; + filter: none; + background-color: var(--readmode-light-color) !important; + color: var(--font-color); +} +.read-mode .container .note:before, +.read-mode .container .note .note-icon { + color: var(--font-color); +} +.search-dialog { + position: fixed; + top: 10%; + left: 50%; + z-index: 1001; + display: none; + margin-left: -300px; + padding: 20px; + width: 600px; + background: var(--search-bg); + --search-height: 100vh; + border-radius: 8px; +} +@media screen and (max-width: 768px) { + .search-dialog { + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +.search-dialog .search-nav { + margin: 0 0 14px; + color: #49b1f5; + font-size: 1.4em; + line-height: 1; +} +.search-dialog .search-nav .search-dialog-title { + margin-right: 10px; +} +.search-dialog .search-nav .search-close-button { + float: right; + color: #858585; + -webkit-transition: color 0.2s ease-in-out; + -moz-transition: color 0.2s ease-in-out; + -o-transition: color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out; + transition: color 0.2s ease-in-out; +} +.search-dialog .search-nav .search-close-button:hover { + color: #49b1f5; +} +.search-dialog hr { + margin: 15px auto; +} +#search-mask { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + display: none; + background: rgba(0,0,0,0.6); +} diff --git a/placeholder b/css/var.css similarity index 100% rename from placeholder rename to css/var.css diff --git a/img/404.jpg b/img/404.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bab3c3f20a1e04b7e611f1b8e1d28357009007d GIT binary patch literal 16393 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 literal 0 HcmV?d00001 diff --git a/img/butterfly-icon.png b/img/butterfly-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3992d7740488b06e1e1b2e268f3a6af72dc23110 GIT binary patch literal 275383 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 z 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%0DKg^36uq^-XBeg839qsa&^Ed6%fof>heHs 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%0A0(jhwyD;_b%)-E)}3Y7b1?VJ7k^0$Rr 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\VyKE(sbCH4xy^MF(yCFm!QFekL6|Fbx(pytL+ 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 TGK9|&00000NkvXXu0mjfIGrd$ literal 0 HcmV?d00001 diff --git a/img/error-page.png b/img/error-page.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1de96575394474a91f6b05b7e935245be3869c GIT binary patch literal 35850 zcmce-c|26_`!If=Gc%U4WEokjsmREhWJ?*MEZMS`Wke`st!A%4Gf9t7cm7ix$fjt@A4WL=}#H2)5ivT zsxs?dQ)}hr!++E@5BBu_4GIbkPXFNPX<^|!P|;*(W;WZwqAD@2jE1j(^r%ziPJm}B({^?B` zH8C`_;z>ekO4aqir`DF)4{uzrD0yRMVDN+9_A0l2u;;zbsq{;BwpkgqZ|j?8{ro<~ zQZKs||G0QD&(X2)(Zho9jM1|x;&plfi&ORnzy{b2R$eAi_ejeCKT9!;M=UDuyY96MrUXGDIp zXkRiIubTdI=#`tzRJ%cC!)&&`R8VT!<(S;+*}O9&Q5QM_XvHtCJv1|v1|WP`S4+dp zzkj+R7*zxi>Shjq4!nK)zx$&s)5-sEwlGS$&CLJTe|L^4bNwUdPml-pe=Wt_+@U;* z6<{I2QdGgESuOBp%S4JsYaPi@{*QYUhq`mGARscfbydw50OmsgkmUdGeOCMOG3cxV zfW}r&s10G4AOIr&??2?}evM0cWI~vUMl!DPUPP3X2A3FBZPKHA%W{Eu`#z73PSv>_ zUyFHf2Ac#rQO4}U0r3CpW=`z_|M*3f{%g(hZOn?{=XY|N z*F*-oRFZH=IB-*oil-zK4L)YHqkqeEX3PXK_YtNr=8b5DAe!SQVsS;o6h+@LlH zphW(4Pp&@LQC21^h^i8wdUoh|LpHS9F+7x4#-ZgPu#+YD5d7_dEf1;W4wY`0adx+M z#$z$*njOVcwM))N`w2=>Jf*KQ)&f!uF4M-=)m+8}fGb$IcV(-?soKF&4j@c&QAgKC z1}<0Z0DubBwC8Wk4&6e3wy4l)iL(W}C!P!r;s8C=RpLXDl)~nz#z>%mJhW+L*!_8G z0)WdM2hoVXoh_%6-#htcvvI%Pe}`#qpXEaR%D0qgb+B^#Q_UjPsaGaS=#uzeDov)Y`E_gFYXbKwSE7RAViaBo?)oZ zhB*Qt6CQcu)iBYsUkn2Ykvn3y$&W7pDSp0Yn_6p&FZ%!o?a9X1M+G9cph7FF-G{I2 z&2fJ(D})RzFzP+}c3^21-pRRO@xr^vy3oNx8t+GU6eDYs-|Y#HI9jXYHMZp zYAF$vu}13I>IM>S97==yA2RxvQT02m31@6g%?rg4rn%JfiGS?R4KV{sq_*Uj()aOQ zsKmq-M!T0FK*X5p7+p{b6}tbUW4(T_{c1L*kZh%Mgs)GYjS5wyGNf3r6x^q5iT5E3 zDBHqX!H~}$E~M|fj5%-Y1!Q>L-f?vRxF<1E`-gFWl2_Q)z4$rIqoHmzk&DxV+SiB z8l-!uoA&_ zsu(Mv0P*O(Hy`(006$=3HHO>AR3?yLkqQr*Up5H83@MK=c;`d0z$?xPbYC{OdkMOK zp@Y#M!~@7l?%?)Z_ChJS4W6rK$X@9G;bG3ThZ5N1h6T#Y=H-57172=^r$e04WUN({;jN z@u!Sa?qVts!Vzm3;?5U9XX-%AAqFee7)-4Powq>efzCvamS^kOIeRe8xTnf+2Az=x zf`7)3K{fp3L!%4^nv}gs=6kQT^U|(CUW|e}`cL_K!P%H0oRl(QvJ#9ZG4gF<0k8}A zgg>9<7%K<>!0wCcKb47tq4YAh^^4dZPsvJ0trJ)-;!9>t0eI7t_>Bp*X96*|3 z3d87H&;%1m{h`1(1nyw{&(GdE+s`x#qSRxse6Y2E!t-E_b1ag-Rr@QK6yDJ))vK%@ z#Zok;IPsW*!1=;a%H7)0CPUi>N^DuC(XF*xb{adL*L$X@1?(#T$_$si9B7ihs56_D zVq+{oeDj9=>GT{x;bWJm2D3HnkF|>M$Sgzp`Q8OQa}38_NPW!d1gmHc=w*~Aoz#bb z3zVr6n*e<9$U;zjnE?#wB&u0#v8`BC99(#8obks7_2$w2m4`a9#T|M=f;ie=Mnr`N z4t(_IW4&@kR0a|yfQ6tdNx?8Mgmt_t_e(<`>_HNv_)Jt5pg7F#t2Df}97nn!3#vb^ zGbB%<8nkI<{EpVF#xw9-bvujXxPKUoXxI4f)>T|PG#tCgZ2cXUJ9lE7;pkQM=#>{} z>btS){naZ9TcVRYib`;l9UPU6A@hQ-BL%#FctdN0Wu9o zR}&MkBu8k~F8K%JRL_10j5+BBG09yyK!Wrv!4{=uh5;{1<3K>ogO?PaI8h|#`U@XE zq-|BU)wqR^lkRYXizMnskiUf^xdFq}A$(%pg=d)#YJq|RSF1lp2Dx#s;=#+UV@P*Cn6JzK(74E4>$KYO z!310!Oe9VATu!5vZCz-1dCU8=WNkZ3BoP9H=2b59mL&^hRsSLn@#)sZbcIup(`dzm zYEngh$iP-SI_g5vhMuN6Uj-Zv@61|7$SwUQRB~nT+AWn%+|D z);)xiQ;8_}?V12i9u>GihKQKEsB{Slu=%d_9Rrs0>u2&eH-k>wv!0%wK3JPz=NQL| zL!{6#8e`jpC+Bv7NJ(T;p+^qNn_ftT0V|j^T!2?U4iA+oa%({XyL*|`xq1dm#OyLc ztnQ!BwJIQJxc!>&Ue?^n!zvw2&|B1-HVBF+-%PYP=a`{eRs1yR^tIs$qt=hp?JA{r z6^Riz%0Pn{(zRv;Q4{=f4z3ple-xjC{T)uES%bSnUD#el4KFo@1R%u8JOX4B6FxFU zKllh6ZMm2?x!ifnaEswfhUiK>fW^8OH`mIfT?(deDYJUH?B`P=fC#sTfULpIN87Ac zBvs+OdUqY5C0S0EPkoPokx*t)V63Bs;~F$155a|-(`GJ`hZc(a3D*d~CQn)b;2KTA ziU%c*jaG)yL4JhAX+X61Oss&wZ2*aOcu-2%=+wl`BUxCTo?mD1IG`ka1Vi69PoVJ% z3;l)*)r+3zpQI?{@6t1wVJ?wb4IJu}lu80IGE)B|o1Cg0P zamB;6n~gSewdncE2iC$)y$l6BXczj(MALdrAp69^%4JVB7wVh|`3g>W0vH_H2O(@| z3nEbk=cP)ZOeUX)^VH)n8Uxa|;Rr}hR}|+J3$Lc9CeP1=3CdDs!9D``;Q9#AL?04p zZAq~5r<41D;B9I*(lR$M= zGPw3k{sH!jlmuB zbl|SubsAYRQ>zfg%}MBt91q%BlTgE$ph4l?CU^m^_D8T5#zpKP0GzSi%^_gyWdrsU z+#Yw_I#<5u*`8)x=gNhz0rK?Dk59GF6_IWkgD;XuO1AD3cBHR5-tliVk2=;ttK z&Ii+WimFgZEkp$`Edl0JTp16Bs9JirC+lj;Y+t8{@=lt=iVf^8JhIbtJ`B#bgBG>; zS%KE%!wm4Qo<(G8)esSz58pcgZO+a=0%r{MY13G-s=W`dsMIxRZ9X|V$IwertLZcR3V)Xv6 z$-hj3%LKp}>O5--)@GR$W59!Z0%T~_66n7k?#L+Bp^Y!LPGBM!+50m)nqCOsoGB-w=??kHM)`gUpCu$D`>7~K2r4r z)V&9iFaIS@b|i)Uny#gOhWoWL=KucPwg-vA<7Hx=1D9jQx)F`X)rJFa;lnVAdLScJvR5 zgCuX;^p`HWuh%xok68|!k2{K^F_ED>o~EO3-!E6}k;j7`+>;{*uP4P-r0Xp|t&rOEbU$pM}$cy~T85b#j4)YFBb=!Zz8pxCLq?gOQDWZ280>%lfq)nDC_Vf8 zgRtwbj5puVLOpb^bvN0LD)T*!p6RxyL20u6Nmsc4MMd9nn{oXK#`OsGk+r&~XLcTi zYM214ngYu$t_rWBSMf(U{ru1p7ag|77K*)eeTeK=!2V_rRwhZ|%Oj6nsYx&e4YGgB zaybD>II9L%B=&0#%ZQULo5iz00&3l@zyWt0%=pGl^_fTyVfDHh)z{&7<6n{V+-6O{ z)nSUccKBTDd@_C+{2+kC=pxO2R>Kque|}|zHY6(h4BT9ben%E3{wr`VyQ%`$kdX8JyWRnmfL$-q zN__1XCOIq#2Ky-N;C5lVH1+O$%OR+4N`V9h{eDNmH1S|bh0-&;2uw35Z!U*`x-7d| z(mBhEJP1tYSX|X2(j6Zd!RuSQTTE^}=cNK;<{B(G{%jEbyXKmlp#$(>sj%4q(1gh5 zMpG*wGK^Y}hn7Jc+ z-k(N=TzTk`Cjr{8a@=Th7fk(r0N@bSK8HPA6b>q$S5khPr{y>+P`<8yPRw-wCx0_} zsBY39g?`*C4k799e*8RGsj$x=zY&X?D0z$rcy+1UN@%iC9u4^X@kh>Bx!4xlDaT*!Y(dY6&3{|hYe*iH^LP&5n+&h}j?U5-3IIVO_3 z6KyYrpo)n{h7tu4N+JQdqsx~H#Md;9fesfdxLrL?0_g)FaGU0s6pT=A;%Vysf@ zIVy1K0X^HMI0)CUV->7^n*g3@SbE>K{M5l5K_U9p>zLfLK)O=to+(-9M( z>4xOURtn;Y!?RzX+5KQ?x&x>UoH)v4SLZ(H_{2#P;y+^V`Zr-eAqxs-!r*CVewJo} zyY-qkHXn|%55fLV_6wkxrxvp&Abz>_4yIUw_U$7Vffi7Oqp?$yucRKntw3$)@D9&7hrYCDzbBIE@{*`sDwXSq#s3kM|C$+Gx{`8VcBzaM z)$D_xhrKc^^#Gn2bs3!^TxU58FqkW^MELYi)qvsahriVPmzBFr9`GNNjF0w*P9Mzp zugL<_5F#{?E;jb!fu3iU>iY?e|JZy;(Vw5C!u4x|O4~ZZ^nb*l&}{E3bh(UxJ#(p3 z3el(jLvPY^`2uL4S`^tTyw?2EM9Tz($!ck6S$!7JeQ6aQq7i;ROZ3jBSJo9V(FY;2 zln5)Vd;aIu5}s?Z)2&j@E7SLf#YR>L>Mk=XUFD!)Un~>{{wzwcYr2OvFzIc$=vy`V28voAUC?T z&d~cK4}<$d^rF=KoTAr@OFL{82n?{`Ul;KQWRkCV^!8u+i9w zt?IBtkB0Nhjl1B=F*{X=KsKwyQJ4xt9zFqHzvT{x7YBZ47@^?P+h8si77!0jNN(*V z6aR;l%Vigk!favee+4JWJVx{WauAloSOxC|HrFYFUZm7t$QBx;#+wJtoA4*2c_@N~ z>8p|8BkCTK+00tV-fOX10A0QxWEOb_bS{qD!5hLA=^K%NH;ZkXCZ3;l&XXSXM;4Y! zL|^c;WxVteTBvHyU4<=cX)TBx+C`K5Awu(NkD5a2P(|d}JLCi}PKt8#o?rh0243AE z>s%Z)cb2pN4@vVaSW%wC&4<_Z(nfC8V;Fcs4pFC`W*(_zE%Ap*V6ykdGkW{L$JVn2 zcLAFiYQ?L3?6s6ovWJ^5@8ky$Rw|&nHQSPvTT1fU45&Ht+Dn#rkc354I1fwz^5u1X zjWq`J6|!9O-P2vFL)fzjvs~%<@5UTM|xS;AdLj%LUH`P8_)CiRqp` z@gi%`gjQO%&BG3pN1Ao)E7Or2l!LM#D6{*WxNsTQioOfT{VeFX~e zg2Ba@ExRCws9$n;mSgL9VtQ{aZF8Gp;W)W8MFN?ZPP}Jx09Bea3cmP=_zU+t3;m8> zdxiquhJw;Se!-D6!M^RlwLCqBH_lah_~Ls##_lW{8*n{X13LX(|L|jjZFH3|)gpDD zZuOiX{UDlcr(-*eC2=uj`%@uB3w}KCiGsVQMCI$coX<$&z-5fa*9o2e%Qu)--ImbW zuRnAEI+y|e=+(1(wapgb!SCuA>|&O-s=!Hf?~FRo(G7h%i| zM-3$fWF6vP;O^Xhs5W}vPW6HRN|O1Fw#`}VYfKQ!uTxF;&qP66LaI10VYAMuV}++! z9BKx4wdzc|a6I5aiIRhg7U&?w;5`X{>i!03YFts1fGzD|f16Yk? zW>S>u982nN0;pM*(J)@&TZmZY@Ov>N0pfjFWeG6q!eCt{7${~0<02xu7?@Ph*uQRu(}yBqpkaj@09vV6<*01K3i z47Eyna#8dE4&aeF0@*@^5p0jXhX6%}<-9dETHuUKnIByD6 z#5m#m%e62_M6@!2PlO28Ul*0K1#>09EhIlKio)Wya&HObj#|De7o92?hy!&P-gp#y z^&c!UcbOM;qCL_Cv~@~?wDlw+2^V8IDcb3T2B%?2ltmA6dVG{sK`0PMcJ)*jW0|Tu zFBrX~%8?8ci+-(ahf)O>4ev(B2(hsGpU?_kh=vUnQT(fDOV*IU>=sfW!Rzx?JW_aE zG+Ymo`tkMef#3tb4WSL^*!Y{8PC6ZT>j?xZZ?&ePjXN9JtSAf zycTf4CQ7)MyyjQGd#84fE_cnC*nz{JII2@7EbIIJb|el>AZF!VeEo>Mg$x}w%__m#+& zHjcd^nr|_Yu_Xt1fauXgD7@4fsz`}uiI49-IHxwE^lZy;bS>Nj+F;y;Zlw?Z0BICX zfUPzfDBP8`6LI5cX35B?Hc>|lL?$2?E}WW& z$S@-HRUW*4)wMH>b`eLt8)cec(IsR!e*AR% zLDIKUO@n!ShY5~2uF%QC1DqY zLM8%Ix_&iY@u`S)e#4x<}Q#{YENDY0zS z6#sYELZj4$&0chX)}XNLQN&T!ZUQirS|P-Bh1B-9c8LCjjV#8o)iczXTD@owF%i%d zYrPQxEz2=mPuHx~5Bo*pD40E8%9lH|e)5fBt|;tJ&?DDa*fjM+{ai%1Ma2iKkC*P{;1y852e+H~dS2j*qLO zgXG0^GHcI{nU$z`Hu6fO`kei(#_CFSOH)ZrVLtNGD%cBgLU@V?WYY>nt4}cO&|!AQ zR131|aJ)qolM$_9^4hh>;h-i&ggAF?(TQ6*SkU6co->Q$J*R7& z(6s@?xf@Thg|-z}Yyaf2Z@U}(9Z#k2KN!(DpKvco>A8r96|gvVTt^3~y$f5N0~7M# zz09ZjAKi`Lwp!rHfV?aL={@t0Yp+{B6hhZxyScQryv5TbmD1SwYF^c-X{r^wa*BR7 z3psFti03&FAr?o~k+!Mi_Ws3Iv2f_dUQeop>bt3_UelZ#>dt+~4p(pazWk+ib{ICh zM?}|Gi?-}`C!mU*v<4PRdsJt3f2K?4Woxjn{Me^GTgzmJYl_b$(|+%y`MA7{0k=*- zXhYUq3L6q|RLAkdREkEm2c*-K8Sfq*W{~kE;(HB|05X9Cd7JDfhMSi6DLkSE6=(|t z6Mc#tUw59$JeC+%W($0(aD}mT4;t)Apc$^f)e}q|qiTy}GwRSq!Pa1XT6*#D9?v!O7 ziYv^rTtOG?HZ|c5M%$Jt3!|192!*;cG5wCm#VGGYM5K_H6Fle~$I3+@AdZm812F!( zJ)s=5>4V*^Kr78+TR;qO(10rVXo6^{Dyz5DFGEw0>IPP3p_YuZLq>)6IC7UPlFZ-X zIJW~&%Lj%Id%0SN?l8RAnKn6t5M9 zBPt{=w}edxoy!Sa=A|$pp$OM=V1oz008q5STX{eEoBP}{{@6X5L?5Yg_F;&8IitCo zCh67+EHV<{Ror&=nvG5Z-)n9)u$Sd$CH*W%B+Q^v4o^98#2F~F%_Lt}fDc zx9R-K^B}vC$RJg891ef;MGeTTkbE2(Wan$CJ-m}FcMZCwH_}AE%gsjrGO9hfyFNOo zN@SbVZJ2<#R_K2beA+s(<#+L?Cv^J=h79|U4ZGG!y(wQ`{27X#GvV}*ffLFw<+T!^ z-?T8S5tHmgVPfdez~>Nuj%%=0ILS4wr; zkNN%bhOlUTfMxkyTz%_riB(PguT&Pw_sf4xff;Egqw9rh#_DtF4;R`uc{Cw+J|3b1 z2{}Rql)tb1%|OW*batZBV&ht=7UbSHAP^D)TVe1Zb2h{XM|8WI#fGw2M_^gl@DvUb zNT^GnXt9p(?Q%DMzo%%V-lSO4{F7{&UfvP+OOHnMgdVUIp@SPOcJm+{uzy@7gI2 zyy`J0?8Y_ZTw;HLko9|!KfB&rLnC@j{YjULKZpG ze>@PgnB~ijr_`hzW+@E*m&w}1#~x(3Z@F@GdUllDh6RrD(3t+UW8zh0{5nj!(DpM( zn;eudCe1C2?$y}>QG|nlz&L>6tlXit40Bz)@L>5{B=q*GZ|44ebp$fc!1Bfwj^T7b zAOWj6^48tHcXqo}9_>r?Xg8V-;F#QzHK4oS=$y~K&+qJ>DnC3c3wUVoKPqw2FQ!zr zA36sdH~mmtLQ<8UHxx=d1+PZ`V{3zS1G@TP<=XczZ7jS}qzqVD=_>y|yA-f3rvn{? z%LJhNnoPN-Kgz?^Q8C3tsS5?AO@X=fjxk2U+y z#6l}OEQP7Cz*+*`KUW^Yq|NLnJL_+V!Y@aiu@vSfkd5RcW#tQK=g`!2NjleU&!y}z zNp57<3hr`-H}V1PWZmk%CUwg}$e5L1MjNd1ugVc-N8>ejcHg=8oY!4PN{7V?f1YBL z{3A@r{4~4MPbSSKK753fkalOAqrBGnkNV0*TA6BGw=EWBuHB0rPfEHzGRskPGh%j& z*(TRlkcKn|OD9Ba$RMX(A020guezxNq62^L?JP(-Vcd?NEOXiwNe<)zF*U5uzc~;k zGoLo&c5kw39p_5m0Svl?+h~#?a*u?fy5|zdp07UzUa+%?5ijh zKvh`cI-tfzY4ZDi5hA=Wl6T%i;YTHyO~b--QiybOEPf}sTDEweo2>M`kGc!3k?17) zc>>~b3dPW#kCi7!gQ{-K1`~&}k6wb?O+PzMNO1s~v!TN6L@@Q^?g{5}{;d`~r($C^;is=7t1fv+*_ye4YLZ z19#Y?EoUW^>;tcwfSih_POVu0En>m0MDpXg*Q^py4GB$&0E-Xo3y@dsqh#L%tkfxm zx#yr!>^M&Ot_mPqUgy(%Lo^Ox(&fWbigZz%_p1r#o#zB{6y9te0qhy=t`{(_@KX?| z>^=P^Hkbz$e^@d2ApHdIOO0FAXnG>&ENBnVvOdl&Iusln2OoG1nm65ciC@_vRBw&8gYS=y13&wE1(B6y<3F{}FO>$?cDT3%Inu1)%0dUf zc5m=&Spp!T;GAFo?U}Cfuz?a-F7Yv0{Icv83tHf0skv~m(1~P72GhPE1GVBPJ?hk4CQ|eIfrAO)EJV1t^y(myPn9V|1YM}mG!VEIaz8QV2T$UR-7TQk zft)etpvwUSAg99OeeWZ3@|GB40dl9V+WJGX_2{-;NoA%UuCYBqC`? zHU>xyt0}HVJCbu<_tBoDr+ZG+H>K{WO4l`!$FsEf;wY6z)i}JO9BD%HT1c*+%SF30 zT!j1A@gNd#Cc(YhypU6iGZNtv>N%DHQ|3P**v|T~0y~e3b}0Xw{W#kBC)yxjKNnQe zp8J~c3RV?9ZU)?4u~u{fE%Zw?_^IYdpbrd_p~3*qLYf33Y!97HL~Zsj)85NPS@}Tj zT|p0id3}5Fg4nWu3Ls~HNx?}D+?{tv>K8xgM_!V8;Y8>hX2a2DLW8C3aIOdM?S&`b zOQAyB4&#vPwBhM!nk6DBfLrymhYE!S!vCtm-1MrF>Vniz@v z=7OpcefT=KS-h;`~6#HdstSDUZBE%BP!}OXk1BJqd zBS-><2XNE07Y|Yowg8K3IT#>-=}zaCV=>W2ibIHXn87L!ROUNy#R|)=?eo%6zGIcs zYXCj4@Py+Pgu=*9+!T4?$oCa&R^$0Fy=b|e+-TGT!T|%F_j_JGM}MV)jlD=ZSA4ro zQt zH>D=|8Yx=dxuLf7YzM@sdIBmwAKoDYAEZb_RTzy?Ry9twyS{*S()m7WjakE4*pE5n zWJ$KvF>(3O_R%SKDzTHCSZ?Uh^q?UM ztl)}7{wC-nmkDx3+E#y*X}{gY(RkQ|?ZI5~9c#^bcEiuWqZZzs!HNb%bJ&Fl1^%?d zX%({Mf4fH;!U9L+qt_0dy`ij~yI3M#u>SV3jbGNITfmh4BDnJ$0MdcwQyyAD8p-$%gPUCu;^Y4Ril?~EL;*)w}UMuD-k7$&d8OU{yh2l61- z^YW0PJx*u6Ox=5A;iCUzpf?{$Zy0tK=ooZ@{nCL00pY@fh+~TaPcWP z0TA>BF@;Rjj~m5@b^Qrsh~+t;_WAC(#r7iN3pQpK&KPKtfNR-AgAgKf=L?oJV8f0h z-i8t9pO_sz!0*sHA8prN8DwVT_%(nykf+;HluYF);QRM;R6G3}Lwf(Sm1N z_}LG-;1-@5{S6x<_^l2zC>KeX?~1jfB8lnh?2M`YN=3J^33y59M_3WIDi; zS#aP-FK&9)Ak0*h*2sx90sBaRq%mR65(i3dNHPX#}U-aG#5 zf@icX&5qL=6W$RBR}?+?1V;I2S;fn;=>H$6W>oK1@2gJSK05*4T9e`~YuS+ear?HY zq!3b-m-?~d*B3IA4W&e5{H&d;1afee2B!nraOb@GGG>Y{@`n(nmJ-TLkFvg3P(Lg_ zqC4!8eABLdC0S(<7x#Xs%-MFgJ#)(|aEqaH}Hq9%CCFeBApLCEJ7J-{+leTX=9_;ifT# zg_yYhyDRyZHG zcIjaXwF}@W>}ZSU(;!>MDH~vDE#&F#ovy}poQWE3YIgGzsFkM<&meA^2rPiZAs3eo ze{%DaO>}uninTc2WC6eV4|RIn$!8}sKB=(<*M?rjFJ3~MZRiHH^V_zpgE$<`0BqKz zRWbbnIWHeL`(7)z$o*37eqpRxQ`18~HPHT=R)8&NojaL91^xn7N5#+V+Q@FR+@*N{ ziY+OQDRkHMDhK4ny~rmVy;@OWk{u~D^RDqV%pkm!05+vt=Pi;33 zTm9XULCEj1X3n!pVBKMjrKvB^jFjG!iyB?k;1j`rPotXhX-O=Vf6wHc`F1_FlFdd| z`T$Qv>|*>nbH6&()bf+I2!7XhKT|T7DuE&5D~iLsFYSmO`?h8`Qc!v4vsmhlpks5D zEL0^(j(L(SsU%S8dg0990X0h#c0hAfg2WSKPkRB{egvypbNX5!^3ztKumzc!| zra5{(4*{gS0OM)^TA?bgEN6}CSSY6K z6#GJp9t^l@k=jBK1><1XPrV$Mzig?AW$&7hn`g)#UOTzw%2}ui+rDTumkje*-iM!M zfN_jlh$5i;nu^;8SW#Oo`{m<=Hi~&AHeD^``grEX%Xa1EzvckFfs#y8ytLtX&*k>@ z^t#(#lq7IAla+qWS0mzlp{@kE@;U^Lezp7HQ+nK03-;O{`&>=I_%)~N2p8Qw#@Pr1 z;!{3~^3Xah!q-SSP|{v3>8j%qK>1mk9m7$d@G)dg6p9MbsaT94U(189hygud*gJw*-N_-nA4>?m`HJbKZ!$9sx#dP{ zLw8w;JHF`{=~ah$U{vm(jN<%2AS=;}t`orAid4)iY$w|{q^%m{f2sySX`hQU$%lF` zl4FGjaoCL^mhQ)(f@v&#a{&2tJK`2{^Dq_Cu3%$Xt>(^_gr>v1GWTahS@Y6e6ckPH zR_;ubo{H3WLTtfE>Eo5}wSBAz4|4wXC;j{0s)v{g2hWgG?U3D4Sa?}+clhi<9v}v4 z9}T`>>D(${r4zC239Q}U+aCiY|JwKJr`x=js+qc;*gkcIm02M1X{Lkoa)3T79DH`0 zv;5KGn+D1D3pK1>DNVnb3HPy6UWxmF@u&m&6f5zEP>kc~KJrl&B}pe!Jz$=Ju1=n? zY6IHv2jTg|bZjT?C+!rK`O6=eW=KqTI7)wI`u$udvr=_gr83Jf%Rm z<4{4xaBCz@>EJ#EN06qpI)fKH^jI$&MDy1?_iu2EEWu=O5=2-v8imacaV80|@_@{c-j_T3myr*qjeiiE92F>98I#0&aV9_5E*Fmm!P?DQp>(1F@use++R!p zP380Yyl1$H28P(WQsdmkc5}nD0CrDQL733CO8+=~hl?q0N3BPFszK1a5?kHrma?JN zvyd9A+2C$;uMDo{OUAs&IVoT)lt&pb(yE+%zxu`vdP;zHXNB;g+ju(Pkwd;Lm}d&P z{Ugh~`W3y8czN{LbT*D77ib&%L+QPvu?CXoC*ukMpry0E}P;2QzfOD3AJc zk5Ryk|Hs&i_$Zdsw{{m2sTHLk*?>P!MMEhhk1f3Z37G?3X)6taiGDp{{&u+aat zY_vt^AeOnR?5zytc;1LHIu>8{>EMWXdaCbD;eC9mt=dZUWv9w#;?A*oc{K0kAu{*m z9|S}`goG@ntcojL>k|1>IwVxf{G$IX;+D!|JiNOMg3dq*P-Az;l1F&l(BTuqk6#Vn zQYph5OB`P~Z zz1S#qgsUsd1Mv}V&`c7UlWPaN=xg&|6yh)>h2ORC@$;{h@xlp9{q$FvcDP1Y92a}i zj%r0d^d;-+DN|hCGG`&I(Z;XyFUQ*x z-wwy6*~~7%Hw5>-ZKZyM*9ud3K)C0fvOdHmviLo|Z1Xl;_w?=MEz0bSZ7S0nWrW#` zi@Q-<OCPX~*7*iOPhH2kV97XMr0VO%AbGc2FTA6&%kvu?edjw4Yb^ zY_3EyT7M{RcEy?cLw&e)G5Gd_b_3KEyf7a0S7hs0FcEBlyE4^{#9C@?y%*OhUQcm z;yAT(jlJOjB(N%^vC=N;Wid31#6ZfqYk1OaAcZqyJB|hPhtwSXXNr)5Lt}l>#2pQw zn;d8g26iGD$do1@AP-jYO5e0m&wa}DVAb+n0cH_Xgr9kP_{edo*5fQhDErccGaD$} zNzR=BLW6ES8HJ*zqEd%aeG3CKDG+XKQXGj#PH zq6K#8@9?X0BsyQ@CQCwV=Ly3`9L5aSgnf!4zc*nfGDDV6&%FjWC zy~!A%SEc7`PSLtPVFK40#ehT1#|CCJ1m=~+4vkW++(3F_=S}OV%)Dr)m-Mn`KlBWu z?mmxN3Cq|xa9+Hd1@>5K3!4DfSWq7d2v&f*7|?rB@TjS0=EkWRJB$l&T$x8SoW1Mwy1Fk@8DR4A?HU_^71Zequ(Q$e^Bqi z_TakDCoc$@O{ETZTgGa^oQKN1%XHw8Ak3H9xOw}rKv!VBB5D7m{Dg#f&sMe>6v~dj zxW8_KgOieb9gIA!fZsc<{Rdq__|JS->OY(^TiQJkUig91kw2qYh?wQcaBfX2T6#^VJIDW!vt1KA?cv-=u% z4RyYKu-&qwB8C7do_c^Ej9W~>94y!p%_iP4l7t=eAA`6LcTnsOMa*8Ck?^M2Tp{gB z7lPqo|I=*MQ|UAP&gx<#a^4KRr^_kH#9+=A{`@A6v+CT>vlSMd+8h}drIU>k35^u| zT<5exncAvO%2-_r{FM4y1VeSULFY~APo3Y|mtK5PJn?+GVY>gBGm%SS zv-T8{Kz3ecc7b)#%g3wqn#7q{R!LGVA<_>m&l z=_JPa&ivEHpx^7_yu5|IX|&D1QbX}JLA6n$^M5oxf?U6dXJxd?Og0Hb{ z_aS9!zRwJIg|B?tud#Zxb6HNTO&p*han(WyA8K9KM#(Y7LRgd1@!+ctVLTtsL0AlT>LNd51c!Oz>M z-$h-;;!K+>Yb)kKP#ot&0B-uC=9QV()dm0kicVyVW*oP_n2nNqw0OGA2D}~fB7<@5f+0F&N`c^k1dF2<^&Y! zQwtV&M^11e?=bCPvjroYY(|sn))dt9{5|5Mo^Ll2sPK&L$QdEg_R?t}=K0Vf7_^xV_Bo4Maf4Y()V-oaTx^gY*Uy_)1KX3Gp7ED=a zAjF?x$5#f3^kgVVxy+AMw(}<={O;GUeDaWM#c5|K4POju#+hmjUZEL&vVXod$I-XksA6Nt&1&4qof6T#zTfx z(9Cux$Y~E-8~=?izcsFWlMT;uSK>ez{(TNp#ZCL_Qd&E%;O+;+{Ola0)I8$Fp5orG zklZ8Yv&kWOc$TaaKh2IB+v;Ha#%GGYNpjRP)woOmVpDS-g)N_6`P(_N-Fe+jAai{` z%mdO}=r`IGCVrMyK6>-(BEDywQWPx#0cG0Dw6)eqwZ8J9d9gu5ejbh?`EvW#xcRGO zD2s;^7xfx012#9k0IYMixW+FGh|Q9mN27(FU|;It1o$}I%+Ax)>h8x+RDdKYW{aM3 zFPc)BTC3#;r!NsGE~)#FF*ti5}_=f)lktP3S{%=sNdDq_o1I^vWQW zF-c1D^3+1N$DGcM;Aoh zDfGnF+E<3ULD3XB!De&pj@w1C^=M#@K^rPO?9fzb=}aN@?{l3cjm5Klp1g<}*^q_; zd|~sNk#$Z}`OWBG)2$U_cowpC;!E6foU-_Za@^guiH|+!FKV;hvA%no;)2wJ z)GpWDZlmWU-BCR&A!EGZIs4Jd=_AXI>X-K4eS=Tr_kY`G&6@f0y>&KE4Ndy;RWN*) zZ{|~*%yL&g`EFkh}#UG4b05UR5`rp zI12x6*tv9|5NnJI;$*hmj^rZf8NCZTlY5e}@a_by3q|dKSQ|aXF!F%e<_y#3!{prO zy#39oUzkU-_cH!x{s~nuOdDwfZkR^VtqDt)GupNZs!bmizLJ1~)$Us2;c7g#;8Q5+ zTNDSw{TVl4KPpl;V?r4U^BsM(KLQ$18+{xoLwCi@r=ucszRn9*sNI; zU(tVbzR~DxeqP9Zy@vY^{`n~(F_nQ65G<{Fiwa-Aal|o~#$u!}&edjwa`ZvVqYqTHi4d2JV7z?whBkHWpc*;&bq5j2Si-76FK8u2`y!ma zc|!@E1Wm3zMT2n-8GKEDO6$I{Kouh{sr(6k{vv)q-wzOPlz||w-lN@ISh}2DIF0Lm zn4YO=i-9W_oLsFA2(4RZupUaAOh+QrTb>1)WX&J=RZ`yvKbGa5XCNA=tSd9Xe|#y1 zy`Ib0p1gBWUdlC_g-Uq>L_M+!w2W_sdHkrTA>bXdlLOi{9~wCe-?6n4Pl8q@zs2?m z75HGhI#c`S`wbH0!vA%{DeIn`XL z0?A8;s9hBms@Y7=K}V3LOxE#5?kLY+8oJN zeM$PR^YXB}`TK3Fh6y4Ba-G-;KHWN!mbxPMKy*DUljNL39K);|G_doMf!fb=N#MQa zRrZiqN{??bnwSEgRip|HR3d49+OPLvxC6$}-yKf@iiwv-= z3e?bo-s_s-sc1N1aFLsY3zlHH)8txeC2DB=%4*q%`%ZR<^~;7~-SV8&C$Ywc*@Y?= z-rPx-WCd7UStxJ6yv}grbaxL!a(Tg|;i34Uo%YuLG?r)fWr^9FaqWq?ycWD5&dCwVe zeud{V&sA-TGQR6bRbP+F0|nq7#0)Rc&0Xh5rxus)9vf3Vt!iUkh@r^!YEAwe@Jl>u zaxbuQht&Dtf2`cWsN%Igr|&Bm1_zz)f!&gY^z`)D1>yU5V6tTq(91*IqQR$Kc}m+N zal85)3okmTDp&O*X090>ngbb*2A*F1w*)_2p)9zxVsk8-AdOBfY}KTeEMU5EZ{DIa z_U_$sYg2Gf1MrfeM&IP(sRr9AhZ9a`{M6C^I94tKI(dkSXJTT6OgF>|;H%4CQoV0E zC3J2bG2oSS6%K)!U- zRfw1?9S?H81eo6N7To-3d~Hq1&86AhcornJxe@c-e z8b)#-^@HLi>2R1T{T*u~d@DI3nuks6cJ?_gi}faH+_* zQKo0Fs1Fl~Zt|9tb8;#%F)VVJ)HxAIwV6UwggFyjQ2;+$+$?H&^9b~{XH=kwru*Tk zkl|3CPE0Nx%#Tm;MR8mwCvt++vanc`3?cjYJjaQc_ zh!n>?esmOlH;-9OzH!#%G`?_4<{lJO$xQTJ`B+7Tr_*GHy~yV>fpbq;mSW2Immk|c zlNT||p(o)-8n72D%>6%kURcBTx}*DN^-Qux_bi*ga^OpgF}3e0kh3BR&@klv?Y-5g z`xN8%g`yWIE46e3tQxGuAESblSbNqjXOlEKY8Tl6y z&0F=Lxa2Jfab3{Vu_i;;4FHb)5hYAVK!-HW9I&TlRWK6f6j4G4Kjt2lvX^VCh=T|J zbFwW;HA``CN>4F%mJd5#v`(b35J5(B{TE(8WXqdINXt-0@YMCreV5BY9PvXaHqSdq zOymBG>8HT6e=Lo{<$m*G#|^GQC!m2hh$CMsK+VCxjB?Iy^mS~;qqZNsSY9K}<_KPx zvB1#byaZ_ZpX?7*ev&^_8(*G@smoBLrKc6d-wz(N1p$Z?mw{O@$*sN9NN7K;XN2>k zl@>jH61e=*0y>uL_Z#Ff;nnv7PByLvv&Xon%>>c_(ugwRJ;wjMr&OF*X}&xJ!Ufh}BKIJj3rk1gA zXd{P=qc|{t<>gSIbiAYr>A9ABRE?M=|W@<@a z*LsIfWU&cysvHNLAEwl8d3F9M>;CQt2zDaJ7R4Bb42Iq1i!6GuuilH=BbiBj0@CQ^ z4;{c>Yg~kXE`{&qdmGKRE>b5E@EAVp%MgY|G~Hnx`b1IObd~Lm?4}RH7=k3|NosUCanju_W4oxtG?L5MHY7i zWK)wJr+^&xkdvOGc<0*Mi@LPvL-dZ@o3qDfsmFuVFTbk?Yk~5T>YE3Fu;gw#D31)U zP>_V*KbY6W5cnCvX6wuU{y(wMrG{tI2xSIot?FYZ*occsjQpr!qA3)xe--*B|Au@B z^?dkGB$W1L0_h#+7SzQQ#2jX$gm$gm?SMnzT?$6HTMsP1+EsszntUktuwr}pUlaH= zeavi}W+aPZxFQl74KJ&Ys`*$m;G*Y-xI2>q@Ptm;j^-3fsi1a^Ffi{_hwUgwk<=0h z|KkiFRMTZD_ISL#4BBsq0KB27(TIQ)Y&&zC7)Q;D1u@Lk-?Mg4oHrV zKa>MqY_lj`y6h791Zh<5oimV?>QU9Zub+a)_2E1{(AVV#+j|Ru@I5IMo^5G>yJ=h! z#k^||3+15(U0I=cBvy>2aQ(6X&4i1EBy7TajUX(1l3&zFs5W;T}S6I29m)7odZ#tTREAuWT`}O^3w7mn5h* z_66!vfIo$7j4cL-I4VLCWm1p`-Z;@?4ZqjRzsyE#K-lz7fQ2u5U_Q$j3Q$wWaLin# zft$Uc=Pl>RUfcz5BH3|VuZczB!6EQ1sSfO|2;a=Qc7*(h9hYCU3&$Q0Jw=r|R3zVk zi1~GikwgAp8BNs-Eql!1j|xC}xXJ71VeSUrOjD;0kAxGS_y~ZDi4;IBUjpqANo_b; z1jJ5|@m^quD43wA$=2AhrWnzr1$1)A?KxAXhqg?zx8ihl3nn=Fa*IOQKEKnw(&YT! zpmf-1sUoxZcGG<~drte&gXru~`p9dip#Fb1isVcO!^}?r^;Uiiu=-ObXH~tJzZ=zB zANFEKu9Fc}P*0A&z6V-PZN3pp1#SgjQIJ;KsFO3lQRbA%#kRhk99q~$@=^SAKPp^x2%czF;M z9902?5?$wFngtZ;NQ~dWE#N7DXcGLVk};qDK^x~!Dk2Y|kOG2>EorzPNCZgmagK-q ze*D8MM8v4H(!9UENaOt)kO2v;d|}7pE=nBHbM($^Xg7Hg|77vt^s}k(18gklGhdrp zw!e4N5MDE-a_a)zb);$TbpD~a7gqKstqf{ZmjV>ubDit>=t2s=@?Lh_Aq&2xDF!@? zIGWAn7D?_dkSZn7GV44QeqNMp^*;T%!rCjy$P{$?x;13T(@kvOXvwtm_S~5l0#ytM ztnrFj5&Nm^G9!gz`BbuZUjmTRsH;f^@Tq28o$VFXlK4wlV`35`3V}gtZjJk^{gt&K zLq+W*RDZn&z^-$HR1&mLA7C;z@6hI9-i@ktVlf3{RR$-&m~fhID&U2q`>C?vzhO3@ zfTf$r6A=YeTU4OTgOf`_1YZQ4N%YU@1v_cG6Lz)_bBrYT>Lj81O%n=G5M1Lg^tfN= zDKpk)limz<6x~RmO;^ptw6ck&_yhWnav~e$(On^d1Xz zkHJVxSFxY-tJ1>yraP3PRAQp}LcWDj|e(?AfOLatQ#Z5{g zjl*ZVxTWhA#oKRN5pks5q5ewD*hs4x2yOUrYL2^FfEv7Juo&5J8Jl3T&~P{&Q1ScL zr?vwgxctW72suLP?kI_9g#Yc0fuFp-^(jx^k9G~kB0wuYS zj40wW_<^jM+Kn9yJZYXg2dNe}e%gS!+_a3=iJqXr8XX1UIlV?h3^ zWPfhZQ*|PegIy0B+j|86?wf6RxzC1|w}4Rh_Wjn2gjl3P>fwTU%<~6wu+*~oAycgm6$tH4 z0EVBFSTvabjU}gapjVA#U8}zL} zB|n$e;{ghY?{ttENuv7nXJJAs3rJPp<2BUGLBETWf_$t1ex4`?-)&JN=50r5PcjW7 z<)RtCHOMUF6v%UOkG99}z{;Ya;L!X-r*{rbikl zU?nktFuK6L2o$yzPOaR#)<#x&8UjQ2u=p-+!XuH5Pe1U}0dS}9bY4P&6)sPYmRIL2Q*SDQ42ca2jL1=RM&R=Rwif$uYJ_F%RtD*PaG?0+;o7JYBn5QgY z>>CF$gCCyC8hJesOQggC;mBI7=4A@p3;uuW=0s~MAbvvzJf(rYDI3T*NW4lxisOTR z{5R%X;YH2@YApEEOg1KqNuA>0sp^p4L(ojru3_;%6Jv?x`ft@O5bTp@{xk&_DR8ZF z>aDxH>-1RAO#wgPIt|LJ7PQx(eJfz`7BNO44g_!&b~-HJJH>!#w^BhCKm04Jj$XnY z#fC`9M5G`!)iVrI`*1!|;{N78g6*EkbT1dII4D~dK)9K zjsu%q3-?_hb!%XOyvZv(rhzW0yg8L=jsRdNIa0ynJq-9@w_oS~EWuR3$d86_#f<{j zK3V^B{ut!vW(W$=e2yY%Bo$~OTD@Xhp9-0UuDrO%o6v;Z9vuxTGCKObDd)SiSO78{Y0w&Deim zD2fH8zq{n%mVJ(DL*Mw=76+CR5LFk_+w6(d^T$y;mKt%1UB8#=peeUTqXt~5-NZk5 z8(-ABt!Es2s{z|Rz~Wbp!8#}_C`;D<{G>t(L4_PCwMEj)R&81P{nE+A#5+AXS$ksn z0t+BGEalEk+96FdR$OD|+sNh@sQpFW3Tvfzq=6BM2FoHvZKPfuyhds_b9c83{Nin& zmdeqF3L|t$Uigk~!~e$S?%*g3k$ZO#s<)-jTvEXacZ!85l;O6GEEd>xE8%ASo~;Er z2|lL{p%9El83uBuqCnC-2cBq>a;X~nbWRi&e|drN1DuV>s-S@3x*Lv%&#NdpQ8smB zGIGYgS_q#UB*t(ZS@X-wT=&2Bef7TWeAkmGE((Yu)ezQ1@zRfbV+=rkj>+=C98j8} zt&k6BA)T1sMXke|m_DPw?nJqHHchB(hbfn=7=Z9qRkAsUq;2%=ttnL?6r!5z9P3Hk zvP4EXqN(~ypV11#d_X?L;}tVL-~){Kif#gqh<$L?nsSaD_U8V)j!FHjh(pYKeQe&- z&vvLi2v<`7JM53g0wu1_6LF<%oEIK)(|Yprs>MKJe!Y)y?Dep8s=n=~leBx3hzF0m z&2LyOIz~c-DB(G?ow%@;m)Cx0!!e4*hNzOWd?K$x3jC_UO!Zg%6fdY?%n=C` z%RvFjubdXdwwfis7q$ajLxW9LGoQ}m7f&&6G2@N?Q<$O`px6Yp-ahXkC5*G9GUx5j z*T9C40Mo-`2WWHz(h#%FZMn>0?~~VP72LlV+}!yP^B{cW;Ym0s_*nc2L_Ehkn_P2v zdW7$5(wDw7aWPc!yT-(^|GHU29MPM!?iX|{%|YMi6E8B&xy1|g%|ZXKWB!8b$D_T3 z^`#)3gZtD4v%OB40wr@${-0&E`Ln2@^m8^y$ac=7ZeSUL%V4`*=%gyGA@YgTk5-g0 zI`QoJ7jpP86aI8zFmRG{?B+>W@jtng2xGhL#+R$_(YP2?UrAadRp##npdN#|P2KKA1iZBS5@DCfMFL>U2?sB?V!h68#NzhbsOL z<(y1-NYZBmhVF~pt`p^X0+FNNl<9{wPSfGOb+tNp=6c#1HZzsk))OYXZr{glwA|#! z+;s7_*U+eV@HZ-ZxL5vPCzCVcH~c?UGJ=QljY8=lS#dgmUBZW`5{lflQx)B#Ji+Bzmi~Py~Uo1y&Uql!9Klq{|Z`0^75wdh1 zdT{NS`+PImCHo(^NFop=F!{;oD9W%FED5jqAPHy4)e9tlw$OdJLk*)uAbKW~g`rB+ z^QdE|o^2HZG+!RjeI)?0~(J3X#N69%Fg`lgLTqnw7e zxxcj?kELATfJ!ttq7}3N-?S;0A6?dr zvVE~3QIPtdM&sS?PXTQs*=UO!kNDrtgOkv7eUg`o4whx(_#u$iEeGCO#s0X7!5^i= ztCj{6zs~vZqV9$si!Dbg`Z>;VS|Ix@n~yO;DNOpz*Okg{{l}MO0!A#28@o*b4}4!e zE0EB_ZqcQT%*WycFMQT-lh-SE$l=iJRu?AQ#^h0e^*(l88sfT*sU-pZ{y zE&8^bT-5r|to+I6Se>iV(G<=OKRndkKZmR7LPbPoR@mDiS?u+HA;~dDVlp1cW3GY& zR2*36gAC6-jbyRT|2nf0hi*tSKFP0QvdMa;jKZF{6h? z_ATck1+6`=M)K7_K1iTB{tL9*&uMKo=X>9`WWa-AE5QLDE+iIKo2KgzuU(HgET3)X zdoBaVns`>N%_|ioAYt0fmjPt6S7{E&K6&v{y>Fx4}>Art%m7)&ynd3@k~kIUl`_)3uwm7tpx*zWz*E zOR@kgvd7tT^`k*i|Bqukgy!$Mfw+>MvB(2zfL+gR-=8q$x;w8btrU4Hc-f--^y9*7 z{x&Wl&&H|(R~U*p%=u&4$?$e22Z^Z+REjI9FpHu1GDh??Z&~pZGum^qjgf10Tl-12 zy`o1w9ZQa4@A6Vb^h+V+)}4N&7%0L{jelY{A3b+M64|nS1HWN28S=!l0K5PWL`*92 zJ46|_s*jJ}(}z;i8Pkg0Rd7@QN4ew2H7wF9eo5hFgM`8#7eBfm$hsy)n)ZL_l)F|3Asm_71lOq)(LFe@EI|by2>&}Nuyuw=y2|nKLbaXe zb1nfqgjDAFqA##})6>L)P%;UqQB3aQIc(tH3nLe|k8#k5d?dfh)H)7B|@4Fv$cPF#JJ$@#E(gP(xgPi~;gEk1(|XRl!w!!+y_!KOrl$k8@>__0t4h-7b*eq;N2WmUIn(-rN+eHF zJvbxM?NME$(Na=+{S#6t_dV4}6nXJSoc?l7ChS2a+&bQ+@lhq>!=!4Hr~!54>BL7F z8Ta9mwzE`E0I&;>`2vr#>VqT%^=7WJJPB-*KG)?c(b4gyKq(`;}! zUFw=W(T=*HWS?VLIpG1-yP&ft5PmMkzHM8V3UKGT?_6$T0LI9DZVJ0Oh%C>ljW2L+S2 z#KH4)Io2FOeI!JV7nxJ<6t2BIaYy&xZ4?E+4J33$yjJ%rvV6+v5&$U$r@=22997&2 zqAb0;Si$3RV*O4xVcg{*E!FS1p_B(qh&hj(U1^Adb9{jZ2x%eErEmZPr6{i3I;4ov zFGIW$7u5PzQ#1~5)+zfIqL3h#w1;4-^G_`YeED=E{|Lo_aApT;C-}4Xmpe6UcBf8~ z9>yN_SMoa=WFv=ULGAXVIXm~}G#A}1M+4+jKDYoCmdEQ@T!?tB({A)6-=+HYjnJu|m$j~8dk*75EtJlxBMv^T zikY)y6u%_Sg59UUG8pZlQvWfQZ}oqV`tvw%SLU<(e2o7&4oA})zGU0~XfIP9PXLMv z_~;_5zN{n~j=S?i1{UiUNkgToG0BESZ11k*S9~w({2FaEH+pCx%gb?B8I2^+URbg% zzM6O%n4saO7gng}Qlp{1pM8lluZyA=!?yS3sLn5REmIRtWgysuv+bY3en1c(tDdt`G|QE`c0V0ifi3v61K zPziFJS;jcV&euSkuH_#0O%VV1I=j)$sf6!tJ=bIC_2(8>4}Rt_eYb$LNG%n(vZ5m+ z)!LLw#e>=y)#=igjgGmQVwBTRF5q5nW*`1-acV_t}>CO0W-8CCzoJ3SpIPXt~ziNL&QB30+ttd<-mVOzs zh`o%mt52W^n+@m`IDQ1ZbMi(XR9zK*qY9`V(}=>H$5iX>q8?up;MRT(2ysZ8?$YDq)hxYz z!xNR*2ZAto*lXO zF6OJM4&(Yvrc`gKBchz@D<*u|xkg3%-!uDf*Q?gxF&qdze&K%A?UT=UdSKKZzx=|DN9|Kp)O{?+8vS83Ry;w_cq?}7`XmA+ z{EZ*b&a?;wa%ohj)z{YHE)_LlFrJjX+IjghtpO z>UW{>AR1Jbb`$%DQ!F`Q(6)Y394ggO<{gX@o_HR5_xac~O3`$NiAwPP;w|q+M zTmlC#wwBoje~0d>rg=!_rOWEuhvy2!8g)C?=LuG~OQ^+D|3 zv?l(-9|Iqor3RtKy%UuH92gS&uGoie&ig0TpSDuOyCICPn*eGiz^0(x>bF7pxn-8* zN0~&z2+w^1B+=-qr%wttavLXZzG&%-J+#n)3}wPXcP^C6JV3q@v1>G#KjZYF{}Fn& zm!L*#g+*rYD^tNC)YV+HYHstqYnuUz41p@9#&7PZ;GfA@eHY2c*JFBJLp17n1)xD)}w)8hU7-zfD zabe_YK{8cmX>-1@iME8s4>MHubK2>kx^yp|zbh%J6`mfc5o~SA)vA=P{NQB%>=JhS z;hKs2qp$eh^D)Ke93w+1LlXm8@Co)1h1`WuUjoqp&!= ztD|h;JZ7{3SD(h;+~8TFj=0K*K(!gz@ujI;< zrjcY(*Ji*~)?>=0;%r$3o6vA^^&K?U!qpz^+-eFCeCr`8R#qo)@3|0VWhSn_&2!c2 zEfRSek6;Fi_Z$T&v)m(%UWiSXq4@h}zpy^I81%;ipZPORqT1XEd9sw1e$v4!xxvzA z`nxj)z(|vt&|5pL`st@LAsWeNoA81U_4p2V(e;ff#_2%k!ea_N%@4Cx-h9qCV_Zls zeB@0(HD&_s{nIb=yN$A2um^)TgC|QN&FmW}cjr*PSNdNmePlDQAUeun@Un+*) z`^dpRHY(yH3tHbxJbz-4HwXkX%8>f{nX2s&3cruERD|S<&?NJ--h2@Q!E=0c806t) z^I=}Tpk|(F?n_B(x4#f_xNr_D%W37~`=K?4mlS=xD8D-$ZO~h@$U&SL0-x6@v9&!_ zATP*3{y>vU#R$wJu-XNak+eO~7!P`Kjh|>cfdBwHV+p0yY3D+-_^%ngLzXiv;p_4D z@_r^KbKWD64L?;uNX)Q=p*tcKu`OguI^^=$L)PACJ>RCDv1+a)L z%N||FT3ncBa+~B?$L0P$}iM+INL9+f=PAFmDa8V(b=xI`~8@J56Z+sVGYf|5|)N<&=jdnAOAPqH520w(MOqwsaGO_b(BUICAGx6Q$-w zjV0q|k47B~xPS!v1r}mU8Nm{~@FLwlD;2m!^2P{FEuo4KTRbj+i<*D-qV})ZXRo*e zpS>sg$OVk71Jr~Jx;TaOmyD|~Ib{bEkk=@f`;dzGz9{L>i_VO9WP#3N;rcOxlUdF&i1a?+3|#7_QH?=|Dkt;Ct`mF~5c4#|R8I zNG&mjrlb!))f`0k>;8M~Xfn!t=I?!2<^~I~ylnX;@Lm$ir!lpvh<{eXT}z_=kFl0e z@PX_OQ;|xg*rAtlUh&rbE(X;|M2`qY)_hh3e|Re>Kv_^knG9>sxO*n%9C9Jfr`E@8 z!d>9rg2jmNip`yZc2*skCm|bnWY28!_Mds#BJ{mS=i*yJmkT7ljwmzU*t{V)U3Ow^ zJRP1qV>YC4)yB8MVe8$N=KHnNy}0Ggef3jY6a{&{owTCkvl&B2F_q>~6?xv==f;BY z61-SKor|FijMRP(jrYEum~VdUeBi2dE%5Kv{`kW)5D*R7KQ$5;x>@t~chp3N%zbU~ zlx}p)t?$n%{HWX@TwIdpBndGD7^K-(Ti7`Ub}U(e#ir*+gJM}=X&DP$UXLZ zv-fkqWZ}CmpC4T{!Xw15ivz0Y+xce?BPBaA2<;zdhK~n@%ALOgnaiU!d>V(W3;gZM zg(UCzi^839m*rK@6_O%Ap@qX5I*LmYN|mcDjf(ajQU`Q0J8 z-G01k?z&fm{K#5dOA#F#e5gjs=;*({etQxXYlmC`=NC*`zwVZ_wpSE~kgSPW3ZIu> zt|C3=d695wzJd6!8Gc=t8&Fy&3X8O=-3erN-KpC*`cJIk*!m1d$aeHw=`_*I-i4l* zWRer@SLlKkEJ5i6Z{$Q{Q$@Zw ztF7L?DFhwQD-yaxr0V|8Q$`D_NiS4H(jqc!TDNZL4Jw3^w*DQ=4@9+S(%mFDVKgZ# zeV8Oi>%_sCU+tL`Y>&;OhoYnnY^vE-_Yk*f_cHytihggkO|8?_9d~ARA>c80BEe?lX@FvQ74_ST4)?zN z9!b4So5y2`s{crkU6M*Q^RffEk=hRfw*E#CtD5^S$>+Y$dW!&&?H@spBZl&**N|O# z060TKQ}lY@T8TY;{qSwn<&R>e(>(aQ-!xZ=yJw2N2dL$ms-9{$Qn>m{t081SREYFQ-F(p_n zLl&Ktb;-Uze`R;~q5-HnPMO4SIQSMQ+ilukla|)7;cSgZ239FA<#I*OM2HOy1jhNd7&BKFa0wwZsUI%Jsp5lr%G zSD$80F@~XcND>df3KX!NgoZtRc1iD^w)&AXz?6uC)h7i5{yw4mQ__uMPutbLeI7u? z$NK7Q?!zr^oR4lKVqdmP>}t8y8%P-4g;cBW72DMve(H{YkM#MFCNa#^I4 zQqRd-;P@{wuv&~*jQ+mOR%n{x8Y1|`Z4)M~G0k$NEQNn`LxF~7Io2?vDy~mK&*Lxo zJovQIz>KV}dM5m<@m17^8w8fV3d<`Mqe*w#Na&_mN(8VZw;awDFUYn(nWpk; z;N0tL4WUQm-n7i1pyz&hmv!s*5vgA^HDrWvwPN^Qc-~Qrk1Gmnhsv_X`<(c6m7%|t zp!gtey#0#c*L8YtE@W75i+`03SMBWM>!)~+H0nF9OKpG1F((nT5kYul+IUtGfKUJO(tr8PlUm-s9@kZelU=5J+8g717IzR~#lhFO zuTG*wp0k;}9FGZ(9Xf(9ob2TVT7%}v3PT<5ud&4&Dh7{ip6=%>_$-Ww8EEtusr%cm zC&2X1^DneB>+~L7&^MCcFWlI2T?1+K)`<$_IXYM;{}mTb4~w&3U(l`7ovW)frHGzm za0~}F{^zJOCZ}FfGoHBabLy+e!Ka_}zaC!W1x|xMdlJSLo6;I>2ebJ8MaE1AeT6I* z2b$NX8p8e>GyVvojGn_y-2fT>{`3|eVis%(eUnjxvr~VWkBDX!kHbKNnugMMVdWPs z@p_-!4?BLYFAefdMxL}mp{Sg4Hb-5r!#t!;)@aFX@*V7LJZ#WNZhhg)BC9m%FN>_V z^#=K`2jujy?wRbT8M;2;$WZTGw8PI{-Dm>IF$^FjO?(87&us^Wdd`R?vg=5>$un;y z!rR4hTD@Wt+mWYkH(zaUC>8LqZB;H2Y8sZpXSByfr_3J4X!ZIM@Kp=p)&|~N4q67C zX}t7@F{g>nIDAb&G+No)?7iY@B*_z={WYy~wF@~bH>VSu%W&SGU$ohf;YMytO6hXp zuq_=@^but3QQ`kiApLKLaa(V=0;!0G7uA*2n47b@`ED;dbrXHNTnlqcEnJw(kHh7_ z^zeyhvK~ICk^Klmmy$>-jXkoc35q;+IzcuJ1vY11WqW)z5o7rUgkS_ zeBBI|u*l>9JCNgM*;C2DUn6fwx-+q}M0-w>;gZmADdPUne6;NW6bND(20M;Jp z)bySA9Dt+W6xgK=h=3eCJ3O_0hr%yK7T7(#>O})Ize(aGhX*-8sD3>aJ}U_VVX(#1 zbGo?HXB(^x0ps>qV1OXmUX|gakVU~vRrhWHA_XuiCI?BNz@(ym7r?oAi^69il7PcU zkQ!vUP5VlrVat_BkX5`wgMu09ega98kNHZF%dzW=@gQ!bC+oA~&cFpl(PoQV>Nj8H z?7Li%%vVm;7rB)7nhYZhhoxqt7&fru~erDq2l2fXwDRYDrtYv%wPwY%MJ%hDZk#5Cp zy+`h1U(f<`ctvtM%J%(alBL5H58g8<3gzIRD_`DsQc`z71U?8K!|1`5^G=Yy?; zW%pfQ1T^f*lV^Eaw?f9?m<5R~rS2TsxBA_RgPd6Oo^-l3OpMBCajA{>nZb%FP|r~t zh~WrpGcOJ59*4YY&%NTt>}ZRb0Pu$v--|`+caq1STVA-wet^=AgjDZKdE30X&i>Bo z$dSP2Crt*3D-T)y`&tQC*!;Y80f@F8b6EE?T6p~Y{ycx{A~hhgvpP(c{eHEygX?D{P=ujD`CeDP3AQrO2NB%7GdmPd3aOxt&Eh6 z@V7t7n0lBmI|#Yy-S{sJuP+qqX{6p4QEx`cK%k%LGVrJ7GA)|pcM0-Ba5!pR)V#KT zacaFbc>C&fJ)Cm;D~ibf-QS{j@1%DIJ?}%TDw@L2d7?0ijD7-s#i?wite&1Li0s4+ z6gmg%kV465x+;;jr^7DCbJp0mOO^#cBHol^_oIwPK-h{5CzM5$euTqT<=YM$N}s?iL~^*dVP8l zp}8?Sjs;+s)wMFE#7u}{ZeZ9mH)868hlTqdT)*AYdnxVdcX@_ypX?3+UEbYZ8Tj!k z7u(mew?M&job9$pH?7!ldp`FwX&awhbp{rO>l{nt3##G`x*t4T6kp9Gz_4j{TW?!y zi&4S`entOh5drVRKG`#T03HrMMVU{Pcg5xW%KMu7mY*Tc_m8lF#JrF@ zU;jQ&zrOa`Y5nW}7_b8SHwPQR5)=MsE3a5ZHsGo*Pyn0rXMwy1dur# kzy9x%ZR7$QNh)z5c3Z>q-1Rr29YH!hUHx3vIVCg!0J>)VO8@`> literal 0 HcmV?d00001 diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..56d07f553d8146f3ab6e7105dd1c53ba51082363 GIT binary patch literal 15406 zcmeHO_j_FBmDWDHKM-2XCWK@+VJX=FArROkuw;!f1Wa`(A+!*BO+vMejWKSxNOF^V zmz!)AtIJlmY{`;F)BB9NtS%Wtu=5AJ`=0a7of*k;fNXx-=y~pQXYSm4zxSN)^mCMw z@=q!MoHA)r3eQ)hyzwt7DYvAgq+D@@`F`ysDJhw}cGFF<-+z>n(tK%3%C)?QkMId| zou>)^{9YG)9w+1+@Ocmn_z?;P5%fCXIbI1*Q#HZ?pSi}f+~fDU_5QKXdJzf+;I1!6 z)#h2K&q{@}d>`y(nK-g*5vsS(gU{Ze_n3FM^c_BrSy!Gtp1%plbJt>c_!Lf_`pcN3 zujd46wtoa$We(pFjNy=H-3ap8=Ca+e6>pC{b7su5*1JYOJ*`-rb*1`@&=K^LCa)6} z>)(a^-d?i=zD?Jovtc75jYa6|Zb!J_RroeuhaP(tv3-ieYu-dS6hMH_3hraM>kv3z zfiBxFcvf7*^KL|ISHhJ&1Ky%}=ynyMwPGIJ=@(<5(+@}4PS`3AD28x2gwmC-VQ6R+ z;oN5sDS87vq2m}H8AZ$5pTU#$JO+ANaU$w~cjJ%I)wCULUK?t5%-21MM8YUq_IuKM z1}EJ42;@A2-bgb7WeX85eiyC8;V=FW?Z=35_cRO-_Mg-d@&+P^^P zz~cy)&O%S%2u4Ov!M*ntVjd=fS)72N>)Q zqO*B7y4@w{@Eu3HuMzDHTXDi$f*wy1Jn0u8bZ8+wjWsH(LBE&uG?KR$BCzw9h?c&K zZbuFVx+A1@5GNunIQi)rv{o)cr0_L(GrkA+ii^?J>P67!RXOSm)Wg5!r-H}eTednGf+?65L#s|IVV3WdKlMV%B1Qrl=vaTEx8ilWMQS8hWJf`vx`*f~93!~C2_J(?IuDKPH(w2lhOzbM3lu4c5V45<8{Q_{#smgyZ8^)@29xqa9HxQ-N|a@||VopmR&-n$*S zA3u!3CC{K>(QmPT=3O}O{_QB_=VSX||n&cC*H5Rq^g0Y@XsGyZ@B zGp3?y>xT%??hg))s9h1;B8S+Bjz|!;(o7V5@)UADxEn`_Bf`BBJE9o4hyHOsB0;<0 z5t~anR@-TwbI_*eeRwYpWxPebjL=rl_RBHO2PA(NEH2uO+_?{+Xz8=?JB|}WgmOXI z;JYn3Pv*a@E!WN30mUr)dSK?AXfDY#w0_CD$r$8wFa1*Ks@IVF(S!7rwTeOg=LEje zT3ci{OrG1z_mkguz*U{6_VLST9>2EreQ4wqZOgmFFkSai_Coj|{wY}}l<$;tku^VU zRqpI*sHeX*`y1moZGHUvIe9Vmo>B5)Xy_zLmj9l<xIvWhoN5*79X^-hxg!&^s zqiFea7&-ap*gl^@mm?Q}eGl`Pj&A3{*!91_SG@-VeSP|Uc%ToV{8!-J@(YCW=o>q| z@%y@>Aha4b7Rb=2&GpFEH~r_7P>!W&0T0rpe3LiS_&?C7b}2p9bcZu&1z+Ic*_ z0mpLsaXa^ga$mmSRs`y@Fna0>cy`_c=kg0;_nim#%FECjsET7~$X3t?M*Jw_P^9Gd+jxJ%da z`cAmEOhJDa<)>tZ`dh&(&kXhVsLu3tbs~G_RMh8WK=^Fwq~H*l3%FZU$D2!bD(2y# zVYpU)7v6NzvgUFO@ZFaF`Ey@J+tGEXntwgKhu5QJ-OcFs#b~8$L@MZqxxVl%T0URj zHzNF6^9FVDcW7;mB1BnG9>jRx$aVL>KLs6Ozuw>FF4pJWspp}sek+C;pICa(*WrVG z-A$-Z`#D-Ne-GD=2jbXz+g#`hG{Lj!r;5S1<4)zL$YS%swW?P^#&zO1WPOnZvD?+# zKStJ!J88>|+;!Tsx&C=@q)uX-@Hrw4yAi3|sK1YrMsLt#*K5(*Y05~*9hAu=fk_}Aq+AGb02&k!WZGu@bC~k8*hLs?PA6zhm@c4 zPVbR?UEg+SkFiJOz3f9P=`T)w5rwqfaUJLVebGjEcT9z2>r~2J0Xppm;VXO}&71FI z>=}hE?fVE7&p>O#cDVLF4g0qH;m&*ru8beTv+f$42vnMV;k(TG1zi6QG!^fN+r#+! zXY63{a+cri+a7?sU>^577tYK_4Q|CCIJkd(U2vvNq6~aP<88s_EZ_2Ipp9T*+u`zmv z7cT0p=wVQe z>1n5JDtKLSi~dCp&E{HP=zDttwXmjlxN@v5F zekt1NJ4X4e_)M|kB8RRuSEyalc!)88_&yVRc+uU{i)h6HwRz@#K12R_)?N+w#+!|f z#pF-+KG{x;#(lNH6RBQKyLB;yb~o3R_o*M@=PqZS=0sMGWyO8njF-YC?#w0#*7)+H$6pEWrW?n;k8*IrcUbeRlp{+KRI@~^n z&abj={2uO;E~~qd3twpfPoFI{hDCQUj!C_~8sAkV{t;^&uc#QGfeaQXreiSTz3WwLf zPkOh&?`kpY^8R>?71ML!Z}Qp`ub-R?#qxTI6U0}@J9%in8;hm&b1e52jJl@WtNfOH z${dNc6FHx?{@7f|$_=fY$a;sVA1F_VN9>nk;#qB(oMU@zt!eT5Tx-jopQ|qL|K+;W zNm!yyd4b1YtCO6ySF9NXVuvNSmTbv6uFGQMC8y@z$Pwl~Xsks!WyeXS#l=7TZeVcdNzSOfmvlfhEwc`q%IOam_JDlWoj^{ z4kIzXsl|-13z<4VLN3SCG2SLvI&m)D8Ov|2#nHx#ei+`y@Y2Ub!$Ejh3vbNdh`L=1 zQL|+xsyDoi>W%NH4XdZkch(jn67bR|8G5W5m-4~VGu@L!-Ol1);+(*o;Bf+fvdkoS zF7}3Ynrm2gM)(}|Gafv42z5I@M!~!X7$;8FST&nDb>5tNSfiPSgL9@K_k+7Mz7;zy zwy|QvdvH|cA;jF$>>2sM{gaqCEbAo6RRXuQ7iZ(QWXAFp^31ug>w2u!Iar&kWKCM? zNRnR`EP4XftYaNNxE^-a+C6n8@Nz#qM@#kI#)3_#-MN7I&{ua*ad<>6%X7CE;of`@V7gL}A6 zDtbEFh?o5RI+!P*Me1N8i&C@QPyINw_HB5ZkHl#Zebc(wU!lR$*|^*&c4K42?%B(B zQC=RvzW489URHpi;gkPo+;O=gP1*+wxKYTylGG=QDU(5$jWk3xpHv!X_ax4j<+Z zr!-J6j4Z|UAs(YAbk@W+BJU9ADCKh+TFUk?4vxvXg^I6jly97=bw#b~k(VMzqSI2}Ox_2P8}Z-ro9vZfmwIG*#-Fq|Uzz{$ueCN?pSMAMxnfdX5IGu~D=6<( zZen(la@SP2Re5l5@zb<>rp{yWag@2%0Bb|7HE9SH{gLOT7-)AgFXsNlun)6F9&SEN zT}giSwAMQ#m5brq_ZtKczRJ3D9)<^4OBGs^_R~?GMVoY|_F?=j^>JOW;wG_4vIl3$ z4fR!eM)~um)7DHwu(>vlNw5tM4X}2#h_$qpO-p{E0ulFeGjpQAnQo}ZuUuXwo3LUMUJEwFEPj1 zJxIh#LDowwxiK}(q#Jq3}C5Nl3W?aI_*E`W=5op8kxv^8a+ zW&N#iWj?~X@F{r9*5L50t5Ci2G39HdDitlM-{HNB(dDaVo%jj%0=}K#fz+0^-NBm1 zP~0{T4Gz=S&(YYaf<4_*G8l z&wYCzp-i+WKH2*=)()Ff|DCmogYX~DK>6$|iT_cRd8w;Ax8JLEBH53Tk&}p0e_SiS z6Q@CH($T7=e4pqy>m2ma?y3Xq8{Lh3+Cg8-F~unHfZC!lHixva2UfZ11C7VZH_ukT zA~r$nrqqDk+-FlSqTKBGmC-xP=I|`N0LRAL;M#T<0_CewHTOy!UH>#%>(-!g>80p$ zn|h_x=|vw#SWgYGPAz(%`zgA#@#m&DBJ1*K4>(XT|6%QYHF0Jn?$eUuZJ|eEvw*8v z`<(k(FLkk&FMJUEgMHobWl{zy?~0$g+Z#E~_0RUhtqqy5t+*VHJQf3^L|o-G#A5?e3+RL1`{w|JZ+`+!ok2xbk`x4`Oe;4<^JPpx?EF(uU`@;7s{#D=8nySc;@du~1&n*1` z=~;@5s6VrOfy9^83BljUo~+obtl9VRS=NRv{H*pMFfg=pUXIP0v{+&|78@%~On9_?2Q zf5w&CgR%5ZXNb0cNd8Yn33G>#$DuML`KRVNN%-rs(rGvE&^YSkXGyl0eTHz6^o?le zY3p0d=hDWQ+V=?UQm|$n`(015-*i-cnDm9*Tkn8<3Hy@i|Hj&Cf%=V5^%^*`US~bo z)WQY3*j4dkvaiCMVBSkOnN+tG{B@c06~FXhLhe{xCpxUTY=Zw)?3D@sOWChX_9em# z?HO&KZ1}Y07W77&l;1|CIg1oNPHZnCc=!|TkwnTDu#a{z`!%;gdUx*qFQRe9bqJTU z#%<4`jMt*aSB~hRS#YLa!kY4>+8-DmU>}I0hJ}vyupZ_RAF3HsxmlD6$sVGMx zKW)^B@=dc9f7$9c&%!UVG}PP1^*@Gf&5zNv`a1ZFW*}0t2EP3F(6oLsWu3O?0B4&x zU({NYj+Uk0gni8o=p%mV%SDc?hdcXKG_Ac2&FNRevGPBNeG*)&zK_nvttw*{ZtHCD zFCzXs7!y5=pyrxm@rz%!@XLMDFScY~-Xndgfld#)WUh?;j!@Yg*mpgS#+5gsW$XRq z`7-oG*uPLcCY|J=XV=4MT6_VTR$RlGt_3PrMt{Y&pN8m8>+xN1?|TyV)mOv0_Bw

    K7CuJ&%|?G?@*^}@_>b;isra+!+)w(A{tmG( z*|O{s6E}#Ct-Y2#6Stv{SjXd$UPDvHEt~~>3rEs!gKhVp5Gr4)^vDd$`1|!cZCz{C zVx4Id8|q5ENMk|Cl}3rbJmXE`nt~$cn9|P|{wMlu%vWOkZ|Y$;=~2KcAI& z#P-RB#x@hbbHguUwlao2N!O&G>Sn*!x&1)|tJb0VH+KzH&Vbu-j4L73G-w1o&eAtWEDvqf9 z#y+3eobmEDGBScl$=e#A82+D+fY?#4FSCyY3m8w5|CQT5GPPCmJ6#TLcqJDQDd_CYH)y{+FR z)^Y8Al(EEpjBmPm&G266c4xoFSTqsGi7$}8qWC}z+SCF4f;b6?S(@vz8I`4;xwx;fvQ zir!8$55iGbM*NI3 z#dk?AEcnO7pkemlv)FTAM1MKVxN&tnM%Q_p%{Nmv>Xo0uKe5d{v>nb(zkqA|J?NKN zP+srwABVSQm&$q@=TW^!I19vkMfTepGtsi*`=sF&%4TAAP39(iS-;WVzU;I1WmjLN zv%u{EC#o_((bz|LZ{?5%zp2eyHRaZ57z6#BV+|jpt+|@>uO{YnrhkhwA7yc#No=Lq z*ZlHrb1mi%6W3%OX@vG_GwhtH5#Q@czeweN4Bv=f za)S`(U4*w%6BK?+&C04_S#?jDACuVDv*9OWcps-h-p}7U>N&3^v3nAa|Mt&k&`p2h z+4ev5U*C-Hx9+*>actg=GZb1=qWmOdw`dTWgf^+ohDv6T$3}j{?l>hT*)bVyRSOca z!`}tF*k3thUO$R9%8x(uF3Qut>ORQYS|eJ^x=dRO`UXd|PiSFIK5Gq;xmj=T0Dbl# z{TAoq7@N1%twJAd(GX{IG`<|?cmH<2TiAIPTg*66Y?I_ZeUW4O{|nKw_nGT0;oOZK z!~DIYlQZ|^b24u0v*4FQdYip{gBTk5OlM7H-gIR2&+MD@z+SpT=Pp9c)w-8|5A35S zzd%ksE{Ir$q;GDyg>|IPnQR+*u zRpqN3TWhz{rbsV&yv|yDH~lZ^ftg-_g&)msY$l5mQ%FsS>&*9B(ot^I~MZ)jT+THTJ!Po7)`NIZjx+{ z!EZ2+?>~;ALF&>H$%4>_}@GUuPnd79_ZT(}ugR|9(5!i;&^ z*wgFKI*i2P9U=BwIlo@LZ7%D3)3i)a zjq^8@52Y1AVL$mmw+?Nzu z$L<4TJ*C6&MrcqvXtU&hXk4rh%Un{$mboZSdl?58Jg)Qcx$_?8?DaF;ueVW~wF35< zLjAwAAp4A3Lr`8M_^o}EuZZ2^_r&;3Z)pq-u~=2}X5C{$gYr*!XdN>56Z>pr!hF}y zyl%~RNKZ@TL}i8VHrP#EVDxWdnK?IJOMa5i=;{3AY%ILYJD{;PB{N*_w_f8<+6Jr*;p5Ud0 U+d9i{91r@(-#<9;H*?^B0n>H*u>b%7 literal 0 HcmV?d00001 diff --git a/img/friend_404.gif b/img/friend_404.gif new file mode 100644 index 0000000000000000000000000000000000000000..91dd56a289327b6d869daa157912ee1f94eeec67 GIT binary patch literal 65097 zcmdSBWn5Hm|E>)~hji!AjkF+&bcu)!2ue#!3Zmdp(yf#rt(0`>W z&l>O-ckKUj@BQrO#m(pZEEkIfj4yy=o!9ZbG_=%Z_s15xXVsC$X1^Fq|ULe#%T)O#Zud@yNzgJ|+aGzTD{fryqML`yIx z&>#f#Edm;Vx&Ax;h$cVG{lHhKd4Z^MK~y>+DxM=M95E^XBNy-f!$k)~IS~8bDYHjl zV)rkxMU?%O<1*X-iy5qTFRS+{XnPp(~j6eJuhv>_7q^q)ary#4xx{?`B>`rE}{=WoBSaQq_C zRl9#rMM+OhLR1U~8~AzPIKd^t#X@2UpZ|0KKPFg&Xslx*7R{3M7Jou&L8H!+jMg9u zF6|V}(#-ZS21(ng&eE)}QDBu&7Ok@Et~maC`9@u3IXwwt=G`e;<)8XK$hxjib(Meq zmZs=W%&J|HJD8;zCurPVkvIHVFH1XByE6ZKfquE|ba!RJSg}cKDC^Ct!ijS0;e6ws zsxOn(P7B?sH>-=L>pc(Fr+cc4XPY57By2i0C3CI8)Iv{sYf2ZsMswZ#s8d_E)RQP_ zH`7~NzVad~`Me-e68rEi>f zTHw*2o z8gLjXCXNf;xKP`M0wwdmw zlrCDA{EaC28>jZV9Y$z#_0t+Ybk#h+- z8Ie8ewQF;}Q&?K!-`3vp6_yF^f7}%vUYPGFl37;b-5|Z+Q<*&Vuv_Y&d*4uW#mKJL zzHd`9U#1}NV4!F_{NXpvEMhmqdKr;?B0E+A>Cb~7EqlKgZHL738)YSH8U_W3th3sj zSy$zdW?TOJ5&6SvbkOOBSGPgdh=Tw+&kC>LILpggHB9DaC89cuUSBGN**YUQ1UM%cd%K|&D%lspG3*a!EIf__J)pQrqRoa&N%(HwTTJuJHh2fY*N{=M9&k67 z`53|1l3qjf_D<}5Ro)o<^&DS!v87u-wyiRs-*S5ysk_4{LZx=boq+PDz|$APP~Z-U8pV5;tPL@=mtmwOJ$!r>Y?= z_$yA#o^b6(mak_5ogDGq8}2$itmL)qDusbj;r3C2VDXy5 zp?5_AVOREfZZh{i6V;K-;ah-_;&kr&xg^C4;5?(Z84rn*hb|j=GIm+~Xx9n950N^Y z4>g|?f8%8^&yiX~|D0GN#Ro0-iJ`BS{yO{)ZW8LIBxs_YdQ(|!OO>l0H;YhwK0~ao zjuV$qi@~yi;;jq?pYrXWEv%#z;`zHKc=X8(ciZ-To*I$zPuX14P*6`RUf?s&%&S*` zQc9##LLldAZ*|Pg^TBoG3PpmcGH0$m&cuPo}%q@zmsBj?` za3wYWC8^%sl>xC5-oyLS&-^rV;)GfyiqcbR)lbF)R{h9@)o56m^e2M2{VC}@M{r0f8~YVh z>4W&kQ%Na;AIOeY(E8?m6$F{~UCx1!XUQ_!%Vm-oyMZWJJ2&6*!wI%5+^aeE-U=zk z5ZX$i64D09A6&MLJ?UKz^5}u{1^da z=r4JDrFV|(6`~bPRvN6KGf(va(Z;X4X9WWN{=0Sd*Waxm;18JYHNlE-^NsqTqqZnS zM+}BXzP`ioNO$6CPx5I`%4y%n)4uf6{)}@H`Gg^n!OzH{Jmhcza-V>F%c^*#; zp8}MM$qNjzRs%W5*eX{O)q&2i~PfG-G~oWGunFJ5N5S7x_a?l4v9GFs(2RPA2=CyHJG>AyXmQ)*$OUtyDf zQS;j}Sa?-OY+YwUV^3;Je`d!}Uf)>Rz>k{Y$@+1CBA5CW*1oT7POWdxZtTu){*jHH zi}Que-G!~)#jU;H+1_8?Jy_j4Sld5XJ=&Q&1>kXQ6tz0?2Um`qZH%97PM&SgobABR zb{Ed}mH=8rAFN>@@n{=;ymNNEdxqFYog5-hf1)tKK;Ib>fd+y)IYXVEp^#^1K+X~G zH{bn+yZ`W?UjXi%2jDj3eW+6>%h3$0kV~(+-TO%)*x#DG zcR6Sh^CU0doy42nKG-O}tHkUbxyqP63&HivfJpr^&W^xCP_Duu*Am5^`cXJ6K>ZmM zJOc=6WK?yD^)2`_{pECqIg~e22H?TM>tCTVd{nr%$VEmq!E_8pV{_8|6RQgljQ~Xs zyc={{>DV)gpKp<=%jC^c^3L$~(da&0W20vcj&JdL_@axAq{@By7WR|)E;hAF$tgT8|7TCctd8Q3gkMm*>b9scNr7yjBZdaIOlxAIczEQs0i z3F*66!sONS(h+ri9U=7OyKM4miS9{y&&v}#)FShc>%<+>?lu%o<#YX&k<$Y+hx$^nxho9T%>3Bb<_=?vm+EuDwov7pFm_00< z;88`pdZJ}em+r*^=-n_`0dN0s@m4oSQi)loY|ui~GJHTd?sL(pV0B^unMCSWQF)0~ z>qXF7sCvtQcv0^5tMyV7(V;6TJ&q``j)2HPiW;GOF6H@(edOWiUd~v#ug_*{Cu}kZlyNZkt&IIqw4u|W z$CJZO+MV31QQTtT$%gu-8@!IaFSv+J=VcW@I6J|&+^1&ZQc%x7U9u5iY;&e|e= z)P-M-F`yL08_{_-f;~-fS3xv$higN&gD=YWTd@9Creh|zQs!4RJ1^W1%2QTq zUI9ZA4@^B8Niu}V2&v|i#9lHQDBbF7^Vd#}axaSG=eJ9sBqXiWA@Vd@y!)uO$C8YZ zb8AXm@oNm(weL465;f<@2&k-HSKee8|6%aO0#spQ_eDXw-#`?9jNLLL+q6{CIPB1` z0?V;jMq9`*oN$~;Tt!5U-#!eAC0-%>pp;8+eF!X{>GK|s#W}0czyCd5vh52+9qR-` znOy^d!1p3q!dnnBW~uMXK}0&1=&(n|lOKnxa+sSlMLcDD=*rg~UXAs>Ddn?~O5T>k zstOi$+vcGk67-PujJ+wVcQgeLzb(p;E9yk5m*CX!v$`;+$3AUCw%%x?)?nP)SYdZ+ zb;gpl7wJF?%Sf<>Qd0$Xai#C$K3i`h zzmN5V+|@6+4%!?s2URn`viK_d$cNN(#aschP%o}n@h;?TC=NX~|D$E5kR@h@{emP% zINVW(f$rHrOi}p~)G3{^1^q5&8G`>tow-_tiOwvXmE1zc^0FS2cM*qF)Fo^SR&7cs z*^59@{*xPvCD7FGIarSE!Qcu0@;a*Y6%A$!rZ344L5sFFfja)!QZK$^%TC+8wQmK{ zRogmxHBbOZ*V0 zxrE>E*p%If{cwpNLf}98je;f}`+)Fhp zw|2ZHku!+?>Zaqq9Umle7K^+FN}#*z$Bcp#-mZbs_wT-yN6k@0)wJ>H?u9-^%`<$f z>A2Fr7x@ac04A^Pq|wmbkNtpJ%5L?J&$WVj;h^`s$7qOU_SA@B>iWe{r$54dd+3FKg((x;As;b_*q~T5Bzvaq{i;e$Wg94Q(K$>5g0=_f{mOz8cTf-~c zqN>_s0OV}yNrClcv=4mh94_b|uN<0c7@KXKnCtj4-#NL^HM!6|wb(Pg*b5vnS?E5$ z2weYL<~!l=wyhtv$KQ)jMhZ`d^G}CzPX|9?9#(+z6lhVqlQB;iK*tI^)&PBLd-O?r z6z1^)7Iywraef4zFo1`Tju_1S1D}AJ74u9pR)!p}K#o_QKiSkEf7G5o+%y0WH>epX zYWBQBo$EjW4>T7Q>QX;yc>uXOj948xSRdQooLmQ}d24E8b8>U@$M(jLgN=#fjUOkQ zKac?bZcYDz!1L!6ynx(W1o~6N-s188($T@n@!=Zc=LYiU))^+7zjL&GcD!?XynBM! zKS3NIPYyA3d|r&6*Q3XnbL8=P>G>a`FmUe$NB{f#0YD!7Zv^Bwjqy5T!VjakAJnOa zj^t>+<4#qkwHuQeRBhk#vLp)f#Q-w9sQSu*Y%kcqY*p9{gKx}zn@$ysrW8C@|Ztt26^femuxR!<&!<$IUyq#o@ez+jwNJ5TBcConWs!i;)FOwf8J*|2^N1w(TyzuYd4iC zvk4)8UcqU>xKyr?%xJQNP>Xk}wl+?;72dAqq)=sqnb$c9=3|S3TlFPG!v*t6AF{pZ zBSq&&8v1|m55X}m%v=UXnjR5`6y$%j&|u(ho);uC?W92#r1?&`7L=836YFyipbd#k zx*j4oK6}d*Y!ypt*3(zcqP>WoPQ)V%GG4wc*e;ezw4oQ;5!_fZUS2eKUbr_y+tbut zWtMPV8q27Vbid<4SW9=A@|fH=iNbu+d01drTX(+1qhy9(Oe*aTTSKK~rETtAo$X$r z1UcW#aJvG#iFudO@H+SX-kN1NU61UqI-SQ7$KgVP4yK$^MKUFpWRw~Uw)uu6S6DYn zZ7n(73uSZNb$cF#5la~Kxv_3USx<9T4@;IdJndjz8#8qU#@;V#UBufV?6A4vw`+F$CH%$pxo&`7(utj8z zToP+WWO#v_vABdaopqbIDP^NMyM*eb;+#~PA#A5R%{$IiV)^vXUxP;ia0@p1V9~8S zpF7KXq*sh^`&psSe#x`u1TEeIcLY5}T`qRb<~rC`Yw_pF9dRN3!nl-ihI-bCEvI<| zxr|0bU$;r0w#F#a=9}ONTlEg@gw24=HQ7#+cMw4-4JwOZd6~r*!KV?i zx^)+aL6JD#twy_I$NLtp1#F8!1x-pib1N|azcmKyl;?7UBm>d)zA0RFuW zQ&B(}yzTl8_K7sL=12xTroXzCZ*J}z0Q&pea73|)z0;*nS7B9D7@)FR=-C8!d z=QUE!cI4FA81tGuauFH4nAr+Rrh=z1pdwj$u*0UdA~_oE;4)g7dV3s~xtk;)oUTd3 ztPi$b%q=um6prQP7kyK><&0$wR<6dV&ilza2*yR{)&z?6J13B8<+cg(wY+Z+wtsMM zw$p`-sqMinI=ry&+jTii*?6?Cr|_nQ+%Lnw|%JIWpMNEjY*E?GRu3}TNK|%L1QD@!H?~e(0O*p!^KrtFRBQxwm+`O zxII<&Ro5{u;Q7xii5hP6nv>E%BlWPUwGlc|D?3q7HzE30ZMt=X9DWwleukUG&nmx1 zBzl-eKT3c3NOt5)kDP^&@%}ts%=pr#F~5*;=vq!?Un<^HHlAtS!*-TUcL&m{R|%r? zRTgjNE<4KKX>7(~s1^m6JRwCHoRO)wq~)lZZYn+P^qT+thEfBvqm4sSoA2ns3M!{4 z51R?4Z3*qNHyN&H@S1+#5gwyvB+bIedgVRUrEODHc^RWB zKaehmCOL>z+sQh;eYUAoQ~q+EIU^%*oD+M#Pimq2iBT!q#c*yQ#=tK;z4on#p1Qx$ zR4^U?%p>0Jf>ehoQj@gw{fGhQ2yL-j#vdsT(+P%1Z@v~Hur#hvjyJ6^GgTgpRo9f% zH644PrVLBc)%1qb<+1c;_GUN+OW$>#mRrK2?biIMUUi4$=Hg4OkDho=mRm9A*UZ{j zLtFU3rX&gnUR?8v_#(P7A^aaCs4B;QmKvBv*@0E)%kcuSddJtrpx7t<}DGyMhDV*vdh^SgpRDzgOwbiC)W-z&G@EqB;0cigLZeo*1`v(o7Z`0rG? z{5=QNZre2;iw!;#&4GQeu#UDUSVwG2=lhnfBv@}6tUt5$TXx&Pr}n|z_MyCvq5QAI z1z(2?FVZ>kd3v;sI^IK_9H34y>-<2?`|q*z|M2SBIqV{V8W~e21FiC3=!}sIE*ScE z)r|2A{!k1sF9Yxh&;Si*{a4bkgG?{I=;I2r5XC`1wNNTfv%az=k_m-DmG>w4w042v zU|T;DcHI<26g{USV{2-8YO(&6P|PyFCk1`k>qc|3VFnR;m3(v<`_qO?;rc&nvn*t8 z5}X|GhBV7j>YQml6_{z8{r2=yq~Y%PS4zo>nz315B$27IH^?v`&4&FKL%E9 z=>^ZdCBRoAk*Al))*)tz_e>|N2?*AcFC#Ra4?Anr3lGJep2rE7-5+~P*qh6*Ln?>g zl@_!v#UB=}xzFb>u`a!!9IMwsA8@&svQ_1sK8*fmO!@@XlX#QJW96vSEpz2W>&Rn& zu@nI=m1L)fWB4M;*f^>wo_F~`R!y&yR?^zG3=GmBbWHq~EeM;{Oirg0eKAo{K^rGt z*=~mHIIDd1oCwo=n@`+EOlzN$`ZE(HpfRTcV!>YyKINm+*kIYFoY4Gy(rU`LVP8s; z74;>u_D}Of{I<;fOG=uQbWAEaN$kiijw%bvt1{vA*YfU?2>HK~E)Xe{)c1NM;qbag zsMHH6NQ)J5gCB`)5DTpuGj;TAhejnK>a^t=+}S|ZFj~Ri8d~!Bb`_}|^L9l}cyGhq zE;qmux!vF-1UkMT*n<~9ZelQgMX)?+QoZfbwq%kSH6= z&e=MfD*KRR{nzB6$FX9}^TSRlRE9H#g)hcbQ|ELeWCttJ{0*sz_9d9H7Yfq2-7 z_0bHic2^a#MabwQjNk3PdWRJv>4<2ILOc&d|GL+%2^uSBFM&J9Fb4~Iu3nFZM}>4O zuxt1bsve}8aYGf8D2$wH18K-Zk;qP}76#u3p4qP-Tze|1$|>XD$bsKw(67Qqs7`4c z5Ma?@rZI%LkrT)rw#TGG>o<%qd$jeOD1(b;E0OY=-<>FyxrGxHA=M{2yXb`pGkV&6 zH8JfNE_2*0MtMJVtx?AajyZ?-~<*4j|BoW*$1$0}$Ly#>w zfvO_t=T~U7Y;*_}t`;6omu6J94Y3(Imp5;QzWIa^Sd2F36qV2Hp(QTie%?CBkO;+wMwU3o+MqQ2ZB*f%EZge z)9Tz1BDvQ6b4=KGOIT4*I9@m)K3afITU>v_JmbDh<&=Gy=2c-ssxSipWyety5g1A^Ouu~U5!}&CBxp1Pf@Ro*cwJJZ;ClS z57aYh=3mf-Eft&0gc+XTTe*~_w)hj2lM|W8!-8$_$<&efeRRBxSRd?}?^Yz5rfinp zwj&jDWPTKSeVH!slD)Z8i~0JAtwhtnZHq5Fha3D_-e2#d(0h}Q zSIFtEntX?(pDzCrZ**3^fD5U?A^7$U3Z;Z+A~B}DFg!K&Ar4J=nC?LxXTNV`v`;k1 z@ZI4!&mDYGs~FH4=PJHXx=_VamvEaNWoaJ87Ggskh%0t@^V zj$0MacPgFsE1iE$`SHBkGqyY^*$ z-Rsf@9{}$Ep5Myrziop54fJDJA8-zU8W?a6ilMWKNb zss0*Q+m%q?oz&3tp{X~uxi1acp8@-p4S;OVXldVg#o$EM#8}zF_u}oLyyJoFlW#y1 zd|n3kr=Rqto%DV@=}9@4Y?Bc^9{|<%1aMG#KVqIbhH`&PEf}aRLXMuREn}tUO>jAe zaWRfd&7Ur^Is7QoyUvayGwoR%iorl2bNccR#rzgS4Z|%M~+s9 zPcdRGpx2%owreA(^-+vodtL@3x26ClKH8c-+?qMqp4rD__F#MV=MMbmxm%0aT>y$< zAgAZ7j5=67J6y+9!bjW4<6R&qj4KO>vIl1uxzHxg%?TvNm^}}G)R?vya}F>rAX5Cc zXa5gj8uMxY^&-Wa%A>+Dk^9-Q0)C4)np|qhs!7W3Hy=q3sur&?N!zGH&U<17&aa&J z8Y<>G7`N#7!J-%e_RND6obDqMbkZBQvkq@X-;DCj8#{V8q&`RSt*Oz8HsM7o{mVWY z@?*roFNM<8(b^McHS-W3T&i4b#+80r&*C@1x!Cu4XoigBa7oCF(-V>s4*n1j4VIf6j?H zN=%d%cj^|n9Q@ujJ2xiY>9Oe=3X-3T=2N}L5MCUbtdb6?yt`45PWYmasJ^Lg{b>X) za{W@xc6(T9<%{`8av2gxK{0P*PKPg&+;)#Hk8S6NJXwK{JAC=JsMcLmf7NSDP9VMB zuJ%RJykp&qRO;!5#nC|Gro;aCku|6$;^#)u_^A9kr<{BKEju0VB&{pahm*Gh9mz;$#TT+P~ok6Az43v}9tY?kHlC5Dg6-R>98e{JiWDfwB} zUP8(|t0qPTRkh{x*3wJI;1m4@AtMa0U86I^^H+~co@OV}Gfb-a{KnlL3{_T)oo z>O7%hqJ&h9ZI&kvZ@qQ>*k$J%`XDrSuI9aQ{+An{Rrr|Md0pY(a|SvERYL=MrNmy| zBfa&RQ^84l4r04$f#>DR~zV&Qz-rCC|a#m8r2i{<%nFLzn~ILa8mras8O% zB~Ihv>OJc@G0Dn4iB#6ppbrbiUUZ6C8;*I&2ZRFhVo*dxjwt$|LaCgmpK6dLX@(&NVw?#% zwNmZ~fu!I{n)iNi+#08(QJ{=v+Qa9+cdQ(%uX3MUUoo74p@~_Yg4?4Z1MfzxlEw=O z?iG^}9Nm!Y)9D>wBy|Y*9e=m}k#CfDuB8^?11%}<;)KEBMU7sMR&%q(xEqC5TH*Ac z@Cm7Ici#I**Nt^E`dU=LGP*Zd_-FujJ(!y3xgV>Og$GGtNZX5Flc`#-A3^78ElltD zLFGLH<@&zdrYK7JyjmeZHEb;D?rp-V!;8;-rT?aLAWPSRS*C70LRf>sgtyg2v8Js} zOqFEyQ_s=pl~$8rth)P?Q|r78)HK%Eyp>agKJcpMO{^PQw5v{?>hg^Pg4b|^^Y0hn zXf$ZXUNxMyeMLASTdSk-$;^9zXK9}m5C^`9YcCD`$RtXINo&duv`zMALhIE-)a+j7 zKaIKXSCwK{qNJQ?nCUwX#*P=cZfze)+#}xAty#)<&)4$a;dqsaSvg0jl2J0YAw`U` zs2snD;3Y$Y?{vY`ZnfwHyMu-5+D^MFM24#IX5iyv{rjTTTMnLXk1tOUdtBwp{bEe^ zYHAHicX>tjo@-E+U-|S>!7yHb%HdG@CfbU?`{ca`4xF?Zi>mtbSs3{zk|$72uJlF` z-$Ic8^n{tMSg-pQH>qn)Umc{vVkEm9uZZj07k*@No%v$+ zLi{sBA=l=oM3mzL%6CLX_nRLiJ(e1G$${!z9%sCA-+GyGFm#geS`MSleMeha@Vx{# zaFv>qtR&lu2|_l~WGhlnD+#e(mwx95Q34=nO>Ll+z(aqSfF^S?gn`%R^+#(OlBco= zhp^MVuo7cC{Co!2L1jm03-b(vKGGAlHzMvhoUH~N12wo|L~2BMvnL!sz-r;h0ROx1 zetx5xXy<{4eWEf_?hP)|yex62f_uq?x&iKzO&>t4{#rxbV!A@B&^hepZu$^HpoNU? z4zV%+qY>d+b;%dLp?8e@sBWzK7I{qLfcceaa>v_Wo8HQ$OwNIzxDrE{3?sHe@iq$0LJV^ zF8qUw*)I%idSMh?fG&ZRb-*I-iU$f?Ol=E*)rCBaDRNVQ#rV_Ti}A6T+W_{&NWT#n z6g}^95zQF67ogNX>Rf+}-;1epUt^FKpxsI*j01u3Aub%_!_Z3W|YkORNUeZ=LoLd*bH~q7u#eDapGP`|DA8Wr|ZVz}8GnLNYt6YI; zu)dlXT{RvZwVrLYFPrPU0C4{Ir2M-B|FaDLU5Wq6$R#Zy=c8lq>beq}dOxtsVHr_RRX$^xEd+>c)@N zjfs`@@s;(l<+blXR@T0+u6*dq zxozU42UQ*!m>oi}W6$w6vJESkC_+@LHDZ{FM~x%+W}3n@4%bqzX{cZJ95L_|5`=Cp ziM)>N(u-sXc>3)LB8>P$Z&a@vwmK4thzSOM(WBLEVuGV*A&6S6v^VsDnVs0UGKsT3 zXB-F$UMfJ)2|T$3?-ZhvI1C|RcqLV!MXRA~@QG_0g-&+AN(x&o=KJcv;&GUEsA23wtX- zwUIAScsG%!x!WUI~#_Y*z+X zH7Y{7T_o3qnZZMZuM68=i8 zoZ@hcxjctg3PfylZ6?JU6q+lL(4{aer-;WhB&|K@_Jk6fr)T1)$gq_cmR5jAlH$+z zoU&BfPrV$c7l=bW_s2TS#yq8X{iI`$LN9A7YIXQOKvnrmT%*uJN4}->KKAC2-QP7W zK}E3Rgt>iS;Covfq=?rev#hx=QY+@mlc8XRz0}&0?#ul;3YYAfcneOX?z%IYnJ|i! zjY=>O7e>HVL2#FFjlWM)6I`*-610^&F2%J(B39*16x%r^fK(@?}CT|MbgEnz@IjZ%!o|Igdz9 z#Z=e^G#aB9&EE{VvT3ddL6`ctc+=CF7`mhJaraHVS(O6!na1l0ycQuWo5t*7ow2tN znjL0|B*;lf6T|Vmrkz ztk{FI=l}-nuM{}gaW};_@faXK6qm(SuR*fI*ro^x-{`k_)6QMF9}MNrtRfL5+Y3`6 z%~J2^Y?UbLA#9T~40(r8;q_??xfU?5mW@ymY-$Vmk&Jz5AiI^le}{`S#gyW@geqNC zHg$h;3*(NzGOf!%EQ>P-Ir{`9BQW1{nNqDdv_zBO) z7cKTKDGupVY$fHd_*aPE$h(n=5op&XpaxG z9c%74;zvH`ULIc7d0WlL1mC+QG?1hf`>ff#|L(gv^n$;{Q?n~qz3=H2x=vrW9Fw1n z`Nmx*xwJF#jGDM1FCluLWmQ|EZYWihFG_6qhWQeR#6(oW`d+FVMS5_jv^udyrjpQB zJC-`XsQ4&#o*Rg705(FRLSbnz!|7Yuav!X!KF&Wp|Eax2tY1mao0$sFe+V_8nEQ_F zF&|c(AJY2nr#1m!uE>=yKXGXb;H8GQH_D{exoHb$oqsUx#fr=q(tJS-W*PH}vE;&} zZzxh58d2Dc)j#3K+Yh+;_-vhv!n05$j;k<6bT|Hv)4ft*v&qLk#0E@BV9_guo1xbD z2|l(*%A!v6Mw~|mq*~gd1-W-^08O}-#=a8w2U^j%P+Wh!N(28(4hgq?SlaOD5^dAm zmKVO>y;>dRnhk;bPqZOZJ7AMSw^B3Lxi)(DTaRR!R(tsGyBot9;C9|}jvjAZ$D8y$ z>L&1dUlb#aTY{@=m+(j}1AFvgHJt8Mv`Q7kT%q|eI&346a6U6_eFjot@pzL@R&pN_ z+a8Wqhb1MOar7pRoxX=fI8PdjZzhIkzHg1<_@bjk%BW3&aOiFi=Nmt%#=h?-ndJ$Y zyK7R_-vF{O^T%?NE`MAq?I)K~BhaIo{%ESkkJ5C3fs{e%$_eg?g{sV8Oq_i&&y@+) zv}i~R_wHSWEi-C~CkgnWn@fI1poje+-vOIuHI}6Is+L+=>uspt0tcuEeaiw^+;p#VJ;;BL@%jTNs2i}gLM5=Z!k@b<{HX^2G3WMI9ev?F{83P!U&pu(=iGc=S!2#I7=1C5_WK6R z{eZOqVDU#BSpQVWdjq{z%bkBbkpQ)>)hPemHE!S zg|4H8?$gB{H!;K%u=duD4IBrcHZ%zN)o;lc= zJJ_Ay-&?%M;oid0?!pPiV>owsF*d^@kn=qdR#5vZsDm{OdL9BA?Gn;d`c2w=5V;gYu?2=pc!?aJMYA%0RCZA1OCA$cNi9+cBl+qY zeGMVZdpp-(D?&@a-iDEU8`KGL#^YPFElu$Oy3IkiGME68uN|EqK({`gmk0)X!=|jj z7`pXcNyO4o&@kj&KiIFLV$3<4ZLqUNd`$YL1Gq5M61 zU@jO0)0+tbC8_w*a#sbX(U49Zm`cgiSabPEcd_!cc}-8K7Gcr-cbIWg~!YWsO=H#cly~>#j1A$tZFsW$lyO{cJx2!3PaC z&)g{WUqDk|Q)$4WW7P&$(qWY*x)x*<`TR~?g$Id(Vd{dG=9QY1Hrd2tFD_9gJP~|m zHia6s$$lXGGEq)6{6`-386%xvJ~|6OgU6HF$Xyj9DWK^%l=iKt8g4Oo&<;7lgB6*_0c?iRi5#@lSoPX<5Ar12nD zBly-UtqLgkVpvdD5fX_E(Ogb*W6qDSKhuEQf)Xf2n;8ReCRZ(8`kr<`x~sfyb(X(> z5S;$$sV-T>A_cVt@U67j4O+1kf3+)($QYXX<@w(Vmkv@h0)H}n>Ji+EeMtAoZh|x) zDsA?tJT;A)C8Z|O+l5aH3*8mro^&OiUg6=&?6B6Jl60KXEl)Q^v1m!lSE8aUqM+>7BuiJ*AOW6;vTFy`8uQvKDJD-Fck$NAE=5miJ&gv8RkrnjhS<6h%`TtyJOO<4kA z-4V9F1!9;TTS)>Kr_c0b4M`*6bB;5# z2q*IxXeF4fro2;A;*Kue=-l{S)bQ1sZ7#&nJCH`h7^;7G(`-fp9kD~pk zG&)ryW%q*aEOyeEYQ{Zi+aPIc$sptFREa?B1{sfZQW)#EC8;hvwp<0d-$f|WDa3>` z$IKDhSjRbQ-n`^RdK>@SSQC|3oBs{cIr0+^YT<3-h!ZV1NM#;Me)SvI3?zUATZ{Vf z`<7Ue`GqZhqF6nj0V)uSDTBjMmaaSYds@NS6W%*tqbi~y4vU2Ryo5a|1HxXz1t0mB z2#E0CwlSyLvm@MwaMb4ZH6#%engL^-Pl%n8#*x{&7Gk;gyt>?UsYBNFSFVnCMZSRd z8jCq_O351!-%Li^J@}>B6+3{Z26`dbn$G{IvWw-8OA9urU(hw`GLOssw{b}pp(Z@i zVnUYjuDv85Ee4C;iSJ5U$2Y3CTLopIxuN`i@=~r0L+JcxQgO9a+5yHytV)gayAiqyzsxQjaZ4A( z-BeTBgIz9h(aebI2_yLA|Db$^FY~2b#^c8UgY}3@vQJYtycGlo8%ZXcMbC|pabSjOcdY+Qwn*9-K6uB8dj7_%qp5?f2MXeliB z%-TnmgFs$)(7tv%3;q=oIZQLj4xXSOdeT*yYjg`?vfHPVt5Vn%UKwhRVe%=j&jLZc zJY-}Y`Sh+M;JOxHkQ6R;M7A2er@w){vz$pHrPvkxk+U$_qJl}z@IJ9|#c}(`$%)p7 zjurh6NX4EAP7uhd)An2vwr9VG)%8MAA|GCCpr*)Z=t*BF&}nU98-rV}-Ya1gn@9Lk;`x+`0csPUtpoFtlqj)W3uuR*TT(6%vg5bl;5Lgj?mxmAZ;d}A7oqD?AH z9tkr@4kVE)lW-Y#6LTrB_Yj6YKOsD<)+EYYtO|dy8z9CRiji zs4VW+kb$>oLOE-3YzFIE<%fw%1Y{K9${L14EsE{9cPY$KgmZZ8U@Q>`$|gP>hoL|* z5StC+`@JF^Pf$#W@LIYru`HMtTH^5k1KrC1MYsPn!lo)K)SBUQ*!StLu_gd#r|L0` z3j|oko^Cv6+-l6Y6EOM&?C$V;gzB7MF*feGiVJK70W6jS@QN9y`WI#el!CvuXE@)| z3$r}~us6dS%-#$DtzPWMP;;*00{tGmw(>LLNg1>}SMB_!YFzJvjN!TYZ-O0f;?C`Jy30bz2mZVB?v{*4o#+xt zVtsOR*iKEJC6!MdCwgRg*?ocYmBhjLVwe z%$J#eWlm{QbGJ2En9aK74PRzC%~`0Zmw)% zxNK|LuY?H8Q-sMe-L1SBMY0@~(VFEeR_g^und?3_pWMXUY8b_&KCW50-RR7m06l23 z;d54gvJB9z`WVEL=ulwQiBhi$njVbL*CH3w6$^B?mL~n?Wi&)KnasUk^+n>JBwOQ$ zPryEYPFM~Z7rz?4zD5oOtM?P5^JAHC!u<^>3i7$FuO?im| zf}AjPQiyC~>N}*dmCo>y3~FW_2CD1-t^_UP)Y~DDR34DS zEEUF?@@hO+qg>z5FL-T8DvZCkY#i^NU8i44cwV%0fC$Crc*oObdK?@Qp%*$6CtU-O zwrDlzi&wG?&^`;^-ZNt~ncPG5s+pFTDbFoeuoP0rsZ&@O#opo^x8e<1(^)St^%gR= zd%2o~Yxc=zrC!!#y;e=2>aiHgpUjeZl{Yof<%;&F*Rdh%LDu^rf~p*kWr%FO+WPn_ z2#URUixNk4)?vdlAuCERuSgSB2aNP?c9Gm5*2*`z>%E%@C!-lwDpw5CoU(3i+|3Cd z=|1VYf^&b^_0YF#1MCg+L4x1Ed9#~5&`fZFFMa)`z7o`k6a+wh~q+z#^p< z0`fNkG_-wNRT4A#(Cnn+OctKaATL$g>umuVn?bGk+uXrNoFIx_vDO2|QZCK53@Uk8 z8}-#Ye2Zm|C;$H3_}TSG579q(_ zwop;p#=h?ok&uugA*rOX@7cE!V_&mp&;5PAhU)Hq-|ye|^Z9;0=XcKAd7e2hlkV!A z`;Tj`=XE`<#R@ecw)6*s0q_);m=7~5k^BKNs&Z~Q=cl|)iM|U-=(+6X`IuUCzTx$| zU+6*`ux5oFn8_x(Ekvqzn=O?yF<3%^*Y!FTjJa7zR-T(ITvi_-9LCTdK1XZKpKY^c zkOaQ!?#5ac)LsxQz&-X$68Ca1cvI!D{zkDr!0M{c=Qi(yk{QclSJ+Mq^+%RSa#QA& zau-Q_^nkg>z+J3G@TVJ^Gs>~s61G<@&lEcf9j?Q%1SK zK0l&?fNSVA+4?Rivv8>n_K>A{+6IjI5>+95I^GUMTbsddMa{s zd3S7-5Y%)QaHp(Qok;gEBwZSU?RpETjGGS`pfpfM*NFL|{xJN!)l>TMRlZlttoim< zFOH_9;D74ft{4A|*}nSSskJjW){`H&`4NCopKNtxZ+GTycRkzg&f8CG0#g>UW(y!Y z78tR>e}&9fAX`C+EM>1p_9KA+oYx;A1kfgfhybAk=M_@1n;$@}%zqOEX2IDfi~;BM zFXk%X%76^cguz>Do^Tu9myIAeb^U-wzIf7QFcyRiRW$nJ-Q_x16Q?C{S7F+tt# zN!$Ib@!mUyjxYXIi~_gyFIsc&8RQT^Q1@kJD8XkXgb)C%;bTU9$J4gnqMlE0#=ev< z4^?gq*KUr~Z;mx?j<;-0v;p?P+Dy+TK}T*AdS2TA0tUrb$Jdu9fK1$8o!KFjytV~nt^8(H+S7n+_+4g$%Io@D@b6zoZdSBd7>s{?o;??fgF+9kwwjrPIxADQ) zgGW^mzI2DCDtxIlY_v&Gc7ns62c-PTk*tB&(WH~t0AiME3gi%WP!nDo4+ zDmNzIN;yJdIjDl~fV`Aylv-u4AJ;db6{Q%x%7ebVAJu(T;?BIyuI5T_uT;8u)>CK@ z{^(?p&wZQF*A>DkdGsnt&Ze(@`5s*GP)WXes*Wfi!9>dD;Vq_YWb8fAKY!%UBnuOZ z6O&R)52rcjV-qYb{M3zDDXTs+Q3}t@8)hXh6d86w>T!0gu+OArPrOoY_6g+mM3UWS zv8F^Rfn0R6xdMWxjWb{8JHjlZ-1O7-5;3?r zOIJMq1Y7bxHtm^tAok{LOz^}Lz3d5Zd3cfc$+rA#k(37q`B(IXkwl}*0m|hOcCgHg z_hDuZl%YtOtcq*GF|Z>(!%din99Jogkqkvgi4y!@CcEDwF4JNr;`9>oedf<~UMfz; z_`ET%$YBSiJ!%=*0iG8%Pof||%)BGe?T18Biu2?P8=UGyQDcJdSplB)32c>hq9w%e+0B;6g~_er;Pz35KgEP4F-AXT%WKzy~Dwt!?yWxJnMRrI39Lo!7D zp(~j*!RVyNY9Z)5nTmCXuyh?dIvvw zL|Qdx`5snof9o4^MYS57Yc>?|QR95i+2yB3&N%|54~pg@zi%feB6id&2Nj684+T8h zUA`0CrL(*pcVR_EigJS`+DkbsxPuBU6^Y@-wzJ_iS4oxo@4eueKZf7dlSJ9B&Jh_b z*Z(P8T1M$O=EEERkh8cq#>in2`!YKCh*eKvG!=J1BW1NF%ty6fa)f7BqAN{}ckLxv znh-BzwdJ1*9jb8eOsujreurJEIAlDWcgksmT|tFh>?54+P>4Ds^;CE;Z=~f3U9^_z zaLv)gMQ;Dakwa>78XGlq-1nu7nb6s_Q3dT`my5O7U*(X>_n>Zi-O@Ugms1pN^D@M2 zm7Dn(cde@Vi*UN5)~G15Sl%qR5RRn`q%1;R*VQVN`lVX4BU&zUpddtkm5erdLp3Tf z){A~At)vj28nit=NZUXR%N%h0JrU|;y&!KY|_JXi58BJ;NLZu~{{!dJP6qq)>{ zl$84Qne~^{5A(Ku9$MA6dQZf9h1-eZ%arsfc_qfH*SdG=XRYqbAMct^=WVz^^2gG# za5LQLKj#d`6?~7j_*~`7Dbs>up6GKgEgcTaJWtLX#9~UPFSjrgK16m}U-Fx7jCDJ7o6vbn6JmT~R8F{wIv)HZpN zni!{RnRW`bqI&sVPkXId4IjtfaYiJZr&?Ew?@s)3RZ_dk>3V)nVy-&bbF0G{RvSF6=5?LP^u-+bCq8GU(i$JL3*QQljLmDlxSg(U_OJ;M3IgDDPh78uHr}6b zTt6E01EBd#0{y~&N#M+k?p`bJd zF8@I?wyZJv0|9GL+xDcPExWBf=W~1Z{Kt$!#H#%4`hp$=(EiOPR1{kkN5SQ&HOdkwve*FR}Szzb@z`Q1A`^RVc ze!hZ-y#wAHpXnW&?g6CS(W$QeGu;i|8Jp<^zcew^4w z7nZ@9*gK2MlMpy}b$V%acKO@v%D1npYxCdM7uMDn*Eg0nHdi(`SGP8nw*ejjxT_#g z0Ad9zQ=kgA4N?Yx5w_>9Zh!_Dl;GXtClGcLK+}uBG5EeGS%Jj;4V?RT^Yq_j1pZxi z0Q~lU|3whh5IJEFya1BJ|1V!a^gjAe6umbOXz2ctBJ0|hqRoTF!j3rOt1BJ{MRB&P zSue$O+Tr}^pm>7fjvo^4y0}^qz-FJXa7l*l5fHtL`2b%fV%L9S&ffe zap_~x+UyAA^5Q7%BbY#fcg!2SMRec3Rf3Ey*UgE;^lTw@)II-%i{1)&vI2s0>hH4VjJOCuw2P=PgF>1XNyu<-E=KVuIjjCoTr(XEAi7m zn)n3IKNE=YC=j_A)YM$q1mtE1>mZBru69`GBwJ?g^)J-`1+e1v2 z6&H2d94$*7n%rXTcQX1a83d9l4uyY7UW)3GTAQjn;TbJpO&5LZG0_<*&#*?Bx021) z_BbRFQ)uI(WPcH3;w;cQjR4Kl;X+F{x;rJ>b zO~Pqz6SUlTxuRaHEV$zPqIub&QxZvPFBDfZ-MXZkkr*cw&*+uQyP6}t5@iRu4_s;3 zg0WW%$y6SuNtttR=p35aAf?|DGPvGML@t0}#+ln>UdH$(Yb>wh#&7!{B%i}G&c8+( z8DOwU^%vB4(h6z&PVzjW8(vf_JkCPDz>_Rz2|Mi*Q*qlFv3sa)!;^`SD8iR zEaHJ>;$V%8$16hUu%`5LB9orK!<3C&3%)%sF; z`|#NQ{)p?s5<(hwFweY51J2XEOcmH%;$t(`j*NXXqTP~GE^}AY8WYR36XcCt^vc9_ zALa?$F`tTPCD)gic`010m-6bP3F>iJS7>%#i1Kcp)3d|9Rb$-6MbtFrl%3rJrUKMo z*!4_r>#}>XWIe4qD(bG9)>lDy?M-BW!$mhPnJIlzNB<ylA7tZ#E77_UM@ZNNy{ zhyEgeqMFvJP2>TlfJ71B+e(ij;T(*flrY3n-zJmHIP6QQkU88S6N_V6Y@5`+$;)&z zxQb;>B%PcQN9|3PpM6e+QgI4Sn{A@XN@f8gB12Q#8~d>hqDhZ$C^tU)Uode0g+b=W zi{3Amb^NYv&2*10cD~vktbjHm#+vpora?4wv|)R=7V6kTG2C~A0B*^4|0`%~0(A00 zN&#@EKv5sST05U^|AM}PxGl&k>^Z)B*f2nU1wmUvVgYF9J+F5^W&2Y;gF!OFtOP_6 zBMeGFxdpIc2IvW3RstMg_wEf!06|UA)UQ2%#BB*NhMyKMl&t-6_Gip46E@6%%lo&X zGQwOLcyoWZY=3kDVuSq+)%)KO*Z(TR_pRc+fW-g(b*~r)z3!hv$NYbEh@tt203gPJ zLtI*Suev?wV}A)qAas6t|NANL9>nzwRrU|p0In|p`3{bM#80#hPj-wjU49s9)0B;kR1q5sXVgCUdf7n0&l`h)9YR-Qavw#1& z@4Gv{P+?$wWp``s$3)rBeX^eq%OKtWRp`Kk#ohspItbf43y~TCuK`4UmkE*Ig<%N% z3wn67pTH~7wom>Owe8&}y-`>q3TBz>WQM+KWVCFUGr?(T7vK+4{Ag!K4lJ`Y2#M&x58e;nPc$AWPh5I`#%ql8NFO_ycUEO*QK1t$c7cxA{gio z3Mt#5Yz9V)V&JE9>Vzlgcx|Yn%QDC(^^Bf09<+ir+pMDzD*-o884Uv=dtW^!V<6`QTFU!v1vf_i9*1KegJevSL2<@Uv|adt#Yp{hg3T$43Bh}@4SdTjK(>zz!24L4{Z0*gzN0J{hmcOjgQC4F8TCc+Loy>#;nZ-;146`162mBZrkGnC_eJ$k$o|i@FH%eSA8gPruHy)p&IlHS&fMJrHfv4`lRt^P@<{PJX)e7^hZ0Y zl~vk#G*6pQ4sccResbfH(;J}?c=L|a+r|&mS<%YBT)`e%5TU-qt9hM^!n7oshg|Kx z+Aed2p(oOpZ|8}ouv|UWM_RK$3tHlNQj~*+L84}6`r+fJ8V?-8@GjAtl5a4e7S%D) zT>U(-&e!E0tc!^pyA?i*&$~~KKK$cGbMo*?MqQbeY1;#C$+*tvGBM}k#XX;%zo27w zP_e)Lqi4Qcfbvmy3M2dq4?FC9p)fb)^s6zZ7tY#~r$%5!KG?X78_E5qZKZ8}UrBGQ zhSSYW5dRUtPn_I17ALhx-F7wn@#R$udKDAlWIe;5=3JRar0&wJZ-4Xk6Y*N(YHEE8mbkt# zVK>PpoqV_ATxRE!b+2QHXTiP21$^RJ$tf)-uij5GmFym6nP;0nGJXE?j(fs(>WkA! z^24+o)dveg8Z^z{ZTm0N1ah7_34jP!VD0p>juBi+UNzqm6X@>~#U|mLkJFh&Mi>z# z7%E{Kgmao!txGTGS=lYOo0T8uvVWjWI+fy$X@wCXN)LRZ2wh{jGZpH{;5KJpuZ+lh z)u%v>DQMJJvR)ZeO&2CY5M330M2t-=ZgSnfElVKQf zU+nII58X2L4RE8fXQ)z<7OLT(^GC-6Xi~ucKuyGa%tw*^T`y}cCxvgVa-0} z^=aDCA4R_5i72p_GLB`?lH7uoi{!#d8QWfICnGsYgK?y0HE9R033Os)9g3^auGOO0K#<_$VqPGF*@1mq_pfjM6>$5T%lrD>?OzV=znHZ@G6m4i z7-0YcBwYjZaX|#d7)ii>#Sj`?_duu>Sh?>S9{@LZFWm|}U2t$MX&+kBz$*y5{^J3A zWq&<@0tPa%HSJI9JD)dnzkqOHy~Q9F+xF>A=fL}}FF3-wL=7}BFH$@cBZj!h^H(YrGHY4Pj8{MW&+z(t-Poc{U+Xx*u~0WhitiC#$e4$dy%p&_-U zvAzAYE;+iwBpE6}lf?(bfr0ZL2&Zv7#4xc;7iG!*{&v(2~#}eWV@P1pj(V@Qd<5f!3bapuxNuC+>wH-q_2y*)zm>RWI zNm7s<3Efo3422-R7Qw@$XYOMa1hO70MJP;=5(zNg8L@~`D?jLSx3Sw=IYzHs78_FP z?rRx$CiEN;e>!=Q^*yuDbMRxSPfsh~w+TF_;+x!mSSiWbcQV8-x3p~{rNh>jh5zaV z%R{~dlMDdLHI!<$NrE}%xKU71um}dpP?#Yq6#}y#N4kzM^To?kT(VBJ`IM6ukv=k= zeqYY0HU9C;rk(Yd#ORqvyA1Lg70+(eTBKU1x9Loh?NXc<<<&f9q`D?CIz)D|he zn&y!;-(GDwZ35S0c%5sntocxt`UzI1u={8=cEbL?Tgx*CYmMWgt`d|FMO{Csom5h2 z4Dr7D>eI=_m6Az5wDd0Vh$3UNgk(#{Yh65S_f$Vdb8$tbg0Vw`FM6OrPDJJ`_|IP9 z)IQ^Y301GA+&vubt7(U-K5^Y2C1*A??decJFZhgWl+22eIXFfgX-IWQNR2*E;8^V9 z0+IOaSRJugG^ zW8#w;Qo2W~eP|VIG?&+vPFYpob!NnC8w5xy-dON)Wqu?$E6^0lOCJ<2+OVkAb9}U& z{+6pns%A>|2^Brspgvu4_ycw14zCj1b2k3D0l8RrI>fEgPL72>uVDNW8*Q0mxDiHr zDwR^@c-LLDznHRAn9`XJO4lhf9VOD>!F#SzLjAEV!k8kW`4!#|(OEhaqzoXpPb79) zzar8I8+Xb6roznx&w^{kuZHc63`LZg)r+LFl9VFThKJLy;xbQ!l4R0^p@PQ@jDdoB4cj$DH%Ew>_G>fpW-=9UQ08X9Iu^h`%*Yb!qiC4>|XOnMaqnU^(pmMUMOnIxqUy#`{Yi(EkIUkiE`8mcvj&T(fre#3^FqlN_V3A#V&K8Sxzn{IK)}@*thE@z02x;8;c@#{J{F9accC~ z#QRUx;iHL1hs}UijZc%(b(G?r$4W;RqQuqQkk!nulp?hR1 z!`4AHbEhc1^xhnonp9G8hLC zS7J3sd_r~fux6q&ICp&3L~IukV|*GeVQ2-8G*)3;Pqcq{PKx#}7Qv8UKuv_k_-JS< z!4nqMgqM{kK{%l!@ndn8Y|FI%&8^NfnpZiRCudG2Z*}G9zsfz=GGp{^tGgib)pPrk zv!?&G%&n*W&)wg@4LLjr^!WNQe+%HEfV~RpUjt=O1MD|@b&qL~3!x04HrNva${+(m z89)M-z)=0gG1x1F5$x4{0UHcO6QHxlG1xekPyz$SD&YW9?*0MV`RDTsTu>nh=2l056}8g3_&4)HYrhTl1;ilMz7DR<53Ulhw19g661|`e2C)tx zChf%5^5i;H0-FIPu=TaCYikPxCKp<iF7-5{l>k?|8&nJ` zkTHA2gR&YVq6+BKCoq3nNS}VFe5{Hv-HxxyB-K@kBo<5af!VMwL;4gw zHe#tlM$o73kUkxTcwRI1J|_g0RY8t+LQ@USNS_9Bv?F!Oo}Z{yRe(O#^b09HfQ9ra zsX8KEnV?Te5s?qS5vc%unyu=aOs%R4^rBBhNBYk~m!^a~iT=MkQN#C?68xIfNOwv^?yQihk0>m;QRTD6OZzsAm|uOGk8pAECwGp+C6h6?R+`D* zjOy;{HL){vO1AbP*BaTUoauzqEk^1_lEVvibef`KBwP~CyI=5V^HSe#Y zF#AaKaEIiBDe>F$PjEIf)oVUJt2odMkDDc}*@p<;F zS~D=Hq9$U5=iyEKW@L7(skEpi`OAx>-|@#I>D&TVXM@Swv&-)#8dxY``;@g_R@TJ0 z@$81qrfc4ktXlE$<&$kbSHrYidEk%%&-~Qzi1%yMSw?s72Nn%tZp@+q(l7n~Xx3tU zqNN^TycGJ*n!MR9=b8UvLC}dVExL1ZYSJ_F!6M`jaJSNq_~jJ%i4D{rJix3P*(d3B z9qMWrG1Z|@Y znF^vgOo*9P3r|QVNb&VLF%!`&*Dapqjy?n*`fkx5vwT4^M%40bL$Fb_wnyuA9__*J z3UIwBrOSccH?^l-Ys%Mca?wvmQ)ev>e&`RN=Y2iOxnM=_n|v+JEJ$}?hn@83sq5T# zQg?A?Ix=3`Z6W&n=R;Y@%uE1&GuPkG(S~R_gJ^^=YEA1 zpPcEmu=Jw`JH6X9+WLGAJuT=t)lVB{aiqtkNLFHQFUMwJtvf1f z?ir3t$WCpm`<^KYt6298id8#_JngI;CP44F$7c5f{lHwWmP@v46}>NZrKPCJp1YL` zB`pXt$(_8{%*08_{#2*dF8;mnJLWaxe8;fDiZ>26HWZ&k62+vx3(j3=+3N2wSI&!m zx{Gysf$yoi{;F6afa>^l%x95}dy-FP^7K!1e->f)luTf)at_*JCT8rt9c4LXEs0Jd zieIyjHG$c_JjOyMD0B0k53zlEV|MdcCCOPn6?2hMT1L@p#ON>0iWs&dlyt?1N$@7k zUC&ai;*}gEf+bw(=z1CEXHQgZT&`8YNz$S=ERMtI!;yuwB;mcL2GKY*%Q4#i&}T$e z58b2#+YN1#lq|W;gTmt)YjKZpy#1EkE;xgce(q0Cd8o&|GiH&F$5;*rFoae(NF^e(mnrNV< z9Ohjna|s%TV21gS8(RSG)?rfK0$BgpNRul~aT@8#DHXP@wqX6@jDsyx8ppQUqa%wm z1x`-u{J-f_eNyE9&Hvx91f0xtgIO-?fC>P#AGlx#QV^OdfOZN11Qv2kfpi2jt)Q9( z&{zPF1@7?osj|RBeFQbT09*^`(sob-BRF=@YAc8a{7MH9kX%3ZU;+Fe7_L>}&<#KM z6M;Jm60!Rnf-8`=BOW5p*m*^WY$pC#8BnTAa4Fk`RYK~#z5H?h-2)Zy*bt6z zae*f~T(>gGE1F#2Hr?*yTz}fsZyZLQy zW9=)zzY>73fD8+i=Mt2c1x6;YGeK$=pa=+FCa9l5WLW4xYr5c<2;5sRIreRT0}L8R zAVg*%@+=`QySoRy-OIE7@90<{LH{$Cb@P~-PV>?6h#LgM;3`OpgBs3LI3Xi|B`8Yz zw1`y--@_6-h6m8(ln#GP(mhQ~M7a4sRza-)HlZ#&z=xP{^Z$YwrTebYn1_UL^AB5| z&>TSwzkC0En@HXvtkv*b5YalZAexHhOx2M38#y%ImvYbzAx^5p*o>qysz+1gsP!4h z@J?9_2T@AF(gR6vRKcmxS%P?KUO~+aCH$EV-%x3aQWXJ-34}$20!g2eC#jV$kf4Lv zs$_$SbtjSPG9g2PO*I**ac4^GE9BDdbyiTH^=wEb68Ff8@HJ0hNrhLqtu;s5m1sYt z9JgiCyY1Q|^o2UbA|cGnb4}<1Swe$v#v^|kO}K3imB~~_MGV?Rz)VVb`Z9--QDbJ} zZb^uBso;a@%nX3vdh|%&TQxA`cAU!7M$plX~}AIvaqM;X@wQVRVM+OG||A&(rft` zE30v;P}d}?xwn193lB_ug^W51oHQrEg#aFc6Dv45- zvJ_huKizQ!%YeON@>i{y$GvX5khW!)2g=YA9^7CxE zO)?l4Rb9RM#SR9dKdR`+xx6!n-*DW;Adc#UlUW5#UYb(Y5)tCEuIId(wj0EiFq*mC zhJ^WU%|H6XoL=JLO5|Jgne3JN;wKq zywL$$qhvdb^|(a5inVNMwUR?crF47&&u-w9<(gcfGVw=V7g|5%3JtPKR@Z7Dw7-Rh zQC}5J`IwounHBBB9F(A90nZtm^aB?>DA;#((F!)hv`6XHm}uO2)EV(8;##8NGdKs! z9V<<9vPx!Gn?S@^hOWnOnZ1KS_@PZSrFu?n60@5vQ8Y2R>gM29X1$g{IV!GLZ;*3G zFb=^h=G9YF#jJ`@m_@bn))gI+uvN)Qe`9f_LYHVt?S5>Bi@~)Iydkp|0>?g$S0f@+ zt(Q!>k2bo{3*3VxBf|sPcwJrKfxDE{1I7jgt&4gtvVCV9Sg}u84MLC`TY9x~Jup>o zJ2%g5>d%UPx}_CqW)I2FsreMa@4ILa-3d*4gr0|WYAO@~YByEs$T^W~P8ym}mF;&Am$h*7LKe_?EdkIsR( zh=f2H$52UihbNDXs`{vMpGE9e=%Wrl=_4V16#P`f#YLpOdMYFPWjEY}vQucV7S9l_ zTw}u5R9t(DyJW~)Pl4||yumH)C8L&ujdaslD&s(gEcIy;3`1DeR`Hv}c4CL_ETRXO z_}LOaJ5UCOv51)%*|8u`in@N2rimt!9l$DeBkWUkMPJ*{z#iP7=PhEgu*xOv@V`ME z=tpgHPp#iVp^l}rdd8FqOIv+pJ+dZi$zRGEi)^>MDFs^P~2P7=4j(;#?!Jn zxO11NVl2-1riIHZ@i8`AhnyL$yX{*+Y;0x|%Fco~;L<_Ck0URYN#c2ft46w>;~_G} zGKjpF()N`MrO~rEOL+?C;cg%)D@jYw$ib{kj9$dbe}40kz5q)iY#54px7mvQ-={5e_J2A1-sZmY zgzoD9)o=W1JpSVYs+PFE^v^mziGS>Wcym@N8WfYu=*3rqfvHdl!&ZWtYZ<8GxK!rkA^zA^7 zg1Xn4wkuQdI{~XPutL1Ez|)6D6EYIJW!+?3&Y@HV;;W+Nz+kqHkZbM zBK@`k`JbDs(;)J>vo^P{EeX6UXt&^pKe>0uPOu`O#OU`m2#W=#y9hr6aSaFt<`4b( ztFrZ@wFM;t_72dZzvj38R^s}vC{&<7`~MTK=xvy+45vRJRSl~^sD`3XR(1&) zVcOMVY6^=5l|u+u^os1HA;b}w?%Y5&fg>jajrLkq^dY9&PBe!TGZAuxR@FctT>JH# zM`{92C~~M(B>*Q+@{Z|3r$eo(MWP2-(5kBErN=_8Di!V$s_QXgR8Xtxki$rtTIw07 zRb_{63ZRA;!J$?a41?w#i{J*Wsx&Ups-hD>K&>hnQI(US^-!ydqGTjZE{2_KEM}RH z8|_tp6+0HUd?Py5p-_u-{N7lNk>5i;k0&~5bu zOd5ER+r{~xn@p|NwqoJAMWU0!6Ms!;D!oFiP~RpIJtOEABsya(5M|`3bu{9AhW(RB z;YwpM8L-$T5DK@>%!wkwj#&1mK*>{t+!bcTiwsAse82^;*cCy?q?hw9L)gZmTaHCE z7mguKd|Bu5wzA-^VaM|v5;F#7sbu||In?n~wa-g@b&fI%;JF*MH?) zGUQvN+Yr+|M8gr9p1B=M{d6Ifv0Ow)?s6$9u%w-<$_CXc&yyT=Nw-DU+{nVilf>*# zAH*d*c-gn+##&ZpLUM(2l5AK0;qlugFlx_WL-}~EK*f>~uT@H(}RvGA?Jff53 zM#LanMi;Q&EtDA>D|B}bRX63e$`v{;7&4-H=yBc4I?gQEw?kbvneIV?{O+Tgvt?1K znsa;yc)S<#wteLP*hX>GvXrg6D`?de=-*nvMkDK2-w(le^zS6=k+4>;bHz$|S^S|e z&y{4QxKy(^c7@qCF=|)y*7HZVw>jNUmw(S&c-bi{$40c#>_uvOOO0`7_TisX_mu|E zN(fX~m>d9;2D`@#csiW$QzfrstQ?}f4bopAT@LFj`=2Y^!+Jp!@ zbDzX6NpMV|<%WtZHQjPlI6VD>gjcyv=1W%6FE99WXmc?fAE`XZN+-|}%|a};5kuu@ z5W&2Jr@TfV38SIANvvRTK-ss3#PKEn#dwyTKJ5F=8<{a{?^IDoGfq&Oq6Bm(trzfQ z^vg%uVr9GV{Fgi4%PdFIwr*>!ZphI~)6+%EY_{a*V$wf-5%;=_8CuZeR#;(a70@0{ znG`(uwrAXjHd{AjMruReY-Eh?MWsrZGbW_rVW!9Zq6vNB_7a42%VCtBnSk0#j+SBr zo$`v_@`MrM$c+hv|1Oa}Pg@Pk-SNYuY;u#fc1wTYk$C;&q`vzD4cW*X>cf^z*%an6 zESkla$WwHxYecOheCY*{KF^vJ(*4^_xtf!s8xl1`to0i+uRN(T9I)|T;|cU_a*NT1 z={-H&T3^tjVcylJ$aVVh!&3rjQSJ8(zXZ0`7JEF!xjR^wl5|h&#Y>JDINZ9L)>3ro zs$}%D8BJAhX8Yi7d4ZEu$d8T>6EyUmITJ_fQCqi{8U?`{g`2g$%BM)PkOWte=UxcX zVMZ)=%d;iYzijsG!@I>{#+rRjvaxjsAp(iw^CBsFw4b-wCdk1Ho?pE4&18iABqmNU z&rRVh^Sy*M#4V9sDmje7CkEqLOt0GkTX!WOOGlns)gY}E+WWNSY7N|PBW=b!je1lj zQ1(ZVwx=l1lBBIlMo0;B|hEv zOS*kly26;HOJB)wKA4Dp=n1nq2O|~dOK0L8gdzV#7e+OBO{IrSJJGhW{c zdlhAFE7bWz7kSx>+^Qqq^TO1-eBWu5YaNlYBs%~LK?atp-F(bWZ&R#7ACQ*kuj7W* zDCT})W=DQi%C4PUPpc9YfIyk zN&9@&9}`-CD;@p(3;g~7{SE(7X%Z#^{=LTubR|Hhel2pDE^-B=)QRHDeI*{vrJhx9 zZs6W{zk7T0)w|ok@ za2fu#9xwqOls6{hfY@w)RMnE!(3H|$pDkNGqh=Yb2_D0SA>Ok*Jn*qE4P^^#-odsFZ0G_)iTK6Vo zfguehBYvbv_eJX@F(u4bXpjg3>>^4BP&h%{0^ls1g17ItlwSw{3_4&a~fNCW;rhvG$1qNdw;uc`D zP6O!H*0t0r}QGpn`+~eyfSO`Lp<$g$ij&fnOGi?<@Cww z3uwr&T;zg>28MI$8*Qc{N`o~*ZyI?XO%-?)QWbpPCbEt!Jo)Tttt4mj$)Ljz)KzVh zuO3=g4!VC-l>oC+5>6mrQ3f!pAo8Pen;t3vW+h9W5j`BM^f;abM{e`(OztJ2NRFbM zta}rs#?sQhI!_Ud+;-IHEMFa!_}ze*POWEIGO%pRw6;&VoTH3^Vfn?LDv1~~gj24B zuSuNG%VIk`yG1hQnG+9|gGa0YyLRMbN^gmGW!}wz4zU8i)!cK!qcg&lLN_B;F1<}V z#Z7%N9!HtW`E=$;#QS^VN}+FV9k0CnI1<}*PMYW-D_p`yEEe;K!asw}Vp~zqo}1)P z+mIS(`Di}N1rIY@#KW|s#zNd)+QA|IV#ywH95znOQWCN^$d81On_Y?W!6z}3AM4ff z6$)=>mkx_*ZZdwa>BI~#jC60i>MszEz*v+05rOAsIh+;J^Zhs)5UqS~KN0BBMpWH#4|j7i`lcR#qDfKrBM<~+I zl*foVJs00$cB;2JCFeyYp}=0vNW9v`?8m4-(@1+6tZ0c5X@0BvpwgA8Df=>1>zdn( zG7jzlhO*5{Hi@owA}t@{Ep$U=`SSeTGrQj_KkRnODf?9(FuH#tQpx)E&gn0#J9VgS zKDTQgWI9J2d;Epml&?E&kcl1=R9LuSbCdndg_S$p5%(Kjc=vs--&HXVit=~6Rsaiq zB{zW-NxbaOZdgTmb`oVZ=SH>b1*5=-_8=$=B?3uyhMAcYQKaQ`G)lu@cx zQ$Ra%Am;A<0quH0x$@|gj$7$FT5^InKAc)pb3A>%`m@cZ&UklvvD@eP84S}Qj1o4H z5Bp36V~6LYDjgi$SFCLm0 ztA9^{{baZh9k2hx#;@r?T$(TOS58I5Hrx2U88|mO`m!>9@wh6+$>5qc^R-ZcXIBnH z>Hu_G6p4&tCPOoCE>T|r!vyrXBxjA9UL?*S8}(j1o=GRQjlx=VPqG6jlvjt(1UD4#P- z-WKUZXVAH%oWgb1?s!_6iej*oxZ#k_H5{YJ$wHM(I7P)J9aL%k^LU0+)Tb>H4XLJ( z{;%hvFPI_jUzJB@if8Cegd!g^nCHcEO8JD%l zzbjT(11ZQe1#)R$D*?H*rLEqX0~-aZRvQ{*!irXBe$+S zr@HmYUR!6c*8}F7fFW4clmhOjK@SKhxWdYCur6CB0|C5LR%Uk?WEF!$~ zQzZW19$u7TtKZ$8DZRc>>a|kp^{v!v9k{W7J-^Zbds|sQh^+o#SN$%c_r(6bjd0YV66_6Z4Q1|8Nz{4`-$P2 zsgb(*(Z)4EV;FDVnrz#g?gIDp0PMO2Db4*|fbYNdt02Pv&gSYiWOuIb6I-D~=GK3! zr@vQj`n{z8*Fo8TeEzj=^;2#FH0=83%D44J2%`mf0)+EzZ62@%_Rspl>iWXU+C1TW z1+6PU-U6?C?|@%|4*21{hxG-ZShN2V73 z#!&bPvvAB74`X-O3N@U~rhA*LX9Lk-2$M1hNu?n+)wLvzK)WOm| zY?s#s+WPGwk~Vf3#^jR^t3!PI1+K5La0n)Zj7+9gxvM0l`SVk-3w%&Z2+fGzO$d>Q zdSYdh8EUQ~WSwgk`ZOa6Q$lg`kyWm}RiT;TOt#hYOU4qrG0#nNQ4=g#AxW-DD7a4lIpjjgYS=7KMybesK13^PWAW9c zSWK4QtxC5Gt%`a%45?#AaxprbDw|ni_efadWjkLE3w-4c zA3r~d%<~ola|EU3v&EfEcnd{Vew!#gcHT0RyJZA+fV(HOQ&c~;(KqCa&b7c8vzA2O z^O|JZ6_HO_OYUfh?j(xZPrgP9G92#F{`}Rlxygp8?K{UVqr8z_$zaum3iA56?}!aI zGiMJE+ZXIKDa=XN*>Xm0@y#p(K^LXQ)!+6pFvzFYt%g-FU&wgP_rf?+SBUwRTjeZ= zmYa^wlp3~T_JuW_@|58BQ;|m}aXe*5C#sJd7TTXaRjl@Z+B?svrW$oyL+B7X(m_b* zHB=E%=^aEYAVmYBA_CGB6vWVbi*!Nh9i&N9kWT2Kih%UqK{|+cC8(d@KKtx@&pr3Y z-D4caJHpBmmYQF4y=%^A?m8ikzP-Da6r_>vjdO90GtyIEw2o}Odap{-D#F?LT5+jL zy2;BI#3ey#?W;?d!|JxV7J;PX*jpu8WgRjbslkPy@k2Bx5=>0>oH6U{2|aO`qyJ-w z?kn%lFi(nQHa&Mvjd6mvnbn7|aF4kp{{|Q7vhP7FN(}pi#LkB@UWGC?CE#p}hGgh=?5|Z^4k3 zi;#u{huT@R-=E+UF_O`U`em~*F%3cUxey<&K>3vkRrIC`%stKZ!7)2Iw7A)odg?Ag z-ZaTf7PTy?crbI_U3Q;xHUG%v+X!Nc=3akl(Lw46MkXj#dj)F!syL^p1Ow+1RbuH2 zBt&O)lJ-2PgwP2> zck#otC>E|6R;f5eZL7xMAZrU{NVbseoSG+2DKVL8T%Al{BSWIxoU&Y#1gQ^glrXqX z;4-LlzqOjekjU~Q6v3u=p2n{Kkaj-q&o`vS(k$<9zMc{H>t$)$}e6G ziywM5r(UsFw_(clI0Dl6N~q|gf21dQz)989FpvH}DZVrP*pV`et2uP@`_;JxvsXPW_Q-jL0e}P&f2Y&UM4uGd(O3a52pVHj^N zmq)a<-&_B1_TeJ;jpMIZ`nS!8a6Zh_yjW~9AP2LHmEIJ+WdU<3+=&U)h?T*2nZF(W z#B565qvnT{tzSEgw{B>!ep&!*B+44VcE-1X;c2}W5tNL2Jcf)$2Q0Y%Y@CKy^~`r; zQ6Hwe*+*rc#UMv(+>##|-TC7Ry|2D=I45=;@-5ckN0qi9U!U|sQFycFm%SNsH}F9PLJ&R^ z2wl}vX?4R*5*>~SYC`)`Dwoj+Z$y)Ta&o-ZM?&1_3S}OdNfJGO$eCP3(^quo zy8F@5_&>+5QiWAC^6G8|8Xr$Fc2_i?>)H%;J)Y*EtVD6B>24ukAJ6bzscbXo+KT>g zJPQk}?0BI2Eq>&9j-8VD=X!Vc?_#++#2E8L8|zU0`9vF74gywHz@ZAXZvj5Z*)Gfz z=j9EI{*hd9UxQ1Rp{SSJ1z)B?(93$W$0*tP>~ zG7H;t5Px_Y&cYZNuqCsYhS_jz!)y@7x&ZL5e%5mVL;)<_>My_*Hh%THl?$**V3+|| zF^kcj80P>68v9F!0tbJc`BUWnI{xiF_<0fRdCae14*rN`{ezDF-2(>v15W3c;{MIY z`hDfUADkA~{;SuH3g>@bgm8Kr@%NP0X%_;<%upYUF*CG80fn=`?F(=>gNa%7=L4hx z4Et*2L*Hl(P{1`bfgxReo#_~#?Vg8-8#otqu(|F6HdmmDYvXVa@Wf(l zvDoYH{JQ>k%mVlS^%o$P+y5QK^2_SoT17$%4hmv8?p+@Q9*3-DEgIn|(W6u(rYAqq z6av9A09c8Fs2Cv=T^i(gxNN7bvdsbHpQ9V{U@51qvfT>^pjFly`W)LT8$#LE>6cLE zfo+u?SEssD(@eyNX_b|RO^mD1)nZy@2jRHqiB#!4$iO#;CcLP{>2S&DpSo~*GcnUC zkg`YfO@L>8_|W1If3vBeee%gVaZXh@Ua-uRfzr#lh`u`J^MqgCFhWN&*rX+hvn^cD z%M>OMDhly)yApZd5AnQqpXoNZ&xO8@(#V%&jGW(!P$AMh7{LZ7q`L43 zj8I6jE@0Uo08?~#$>Qg^aO>F=Nb%(u;EUK^cvSjK*fF)DWEYlYT9NWvkjUlgtLzW? zCxvS!9O&goL{HCu%dROQq}DNY2PG^MIf*rR)m0LjJu+c}tq8t#AQ!aH6+{iJHN{hi z$;a7!Z?{jCb=t5qp$;C+0)x?p3;_bm=e==;x_s_;SnY1$N{vtD@sN{MP|9<7go@XA z_O9nvmmf`?SgopXnn9#!Ng^6oE^pT@GTPVQfE-0Kx%3lDPJO5x0N?-v=}K` zH34ehEMMp)Q}_66qeMuK3k_WF?>iw8<=GT>-Khyex@y$VI2`ZKOmBS$5X8d1q?9sF z?L4E7VWb*ajd#BD)W4c(7oOR>e6qzF$Iyp>dES+3WY{RVvvZx3<_6z}dkrHA>{zXC zTE!0PCm2sISy<+SnDU^)Cjlv_U(^e3bUCviL~GAMqD73P>_R((@kvDW z4Hf$Cr7@kz(AMK_?S|uzg+Hy_P!|bZ_@LwM?Z+>7N2MTHoOQnwQVWMrT!bhI-!6pG zdP4|4SyGeQfeC#|P&Dt=N%URP=&aL}Ph_Xa#Pq3L86V;_$f+s^_J@VM-S8)WFLOC; zr9SjT3!=)CF3Lq`c0cJA>g;<)R45o3;Io3_q}I5ka$7lUtqo*P%v&CqcQwd%g_!k= zj9O@a#H;CsX%+pleCWQ1tjtjDI3H3)dM+GlY5`$7N26+3ZyrnMq52+a*SEQ|phBGYS-(m_cE=Zk=Mp}o&m&VXMoMzGcQ`Z2W*P}fu@kw4Yr zTsm=^;0e!;pdO=2)1(r~}Y^+KCgiFEjL zxQTY3dmOlx>x};=0u# z5Not2>(jWFQPyCpd7U$G?3SoYgW%XcGNw0_O8AN}`Kx(|231c)LAfa5gA@q_LV&GcB*R#mMpxU-2&pM>*=8xW?jXde{dWA=KlnG79DsMPE6RUHwGafzaKO=hGdM#-8Im21v z`SRZCFgOVr!{tt?5A6EZmIFwh zk`IQt?;PLLb6@Ta-Xb)VKdB}oq!8kuUYI2S*Mw25@iW+|#9pMIAOnf8z6svsX6~G} zbMmg$tG>=*0^yrfS3&N z^lG~lJ^dsh9}lRpdOh$A9&TGa1Ab@`PGINqM2j6q4PJOKL0*C}o%)~{1VLwX#viEan!5oq3naXP{Kn5N1}4vn)J2`PbRP5%=_J z@n9T|p`IKFLhIKf3=dTaXym<&oYlcnj0i%Aovo8&BNMfuJjkff^7t4|2%4zHTdSO-lnYueU#xJ11m(Z(!*VTWs2>e~D{cSh=%QtYEio!Ss zuoAAcF|@oHS%r!L@=!JHZ)(~TYTM!)Q88`J$exDav1-Ip`I8L*-TG7C{wBuzPtRcAV*XQq{dHL1382YKtoKT7 z08jEhrm@WaXHPH2jN*jJ%>k=r;FbY!IAfA}r!l=#=LFU^0o-U{3=`474G3n_+>wCc zMF53u-GHq(*fV|+OSn^fH&ex`4I*~QGGO4do*5uG|{*}UcdgeW_Y9uJzN0{ z5KQ}XFd?xl^oJ1~JXl?w(E3&>LV9sHnuWL2I0}5`t#0CTh)(5pT+qV)JOY zZ;SfN1RFe!Sj%EwlxPAI6drHqNfdbhX7fW{mpAa}_88~g^QosLWp^t92* z+scdh$i2~?51|n^9_S6`=X}kGXAmZ<#H`M3-KJuVcHiO*5K-#lChv6~oJ0xt4Mvgl z+wp)%TXf|&LxSOVOM1#M@wA?=$BI5oa`TaAGO}T#ywA@aP@ud05UG)}7 zQmvL@+Y3rdb>6!yPjw~_NRRs})i&+XenW_REL7u(l8v{2BMO9#vxXK92-y1QQp za`R7X9^xpU6-wKSaE!B|M525~@x?EFx4(i1(NH~Mt+-$iKJyZ{gF{FeNnWB6Vnt+6 zK+yU?AzaeVd+dl!{eDCpJ<{{VSuw&vn#}-9E@e-?8Fqr}C~E3CJLeNB`~Y#2A;p_i zc2Hy=Q+Ht|mHu(KYudg)!JCQ;MhJX*W$Q^Hd5CBfdA=q2`AJGI6!inWB2SKoD)dss zNK>~w%2)oz%3WC(NL{??orDnlmx@EA?uWlT+vC%)MyMFT0SzOVFjF;(Py@T+Gr4!b zS&q2zCnn6S)T~jQfRi>Dh71keCgy^Y)M}KqgPX20_syxdkc^6jxo)eU)d;AedCnCu zYNg7xS|i^=DeNY!A(fh)x@tQ1isirw``1Ya&-`V%eA=!Xd;+o6@B?sgpxE&)2vH^QSX06egMK zhU%J(?lX$90(gy}KeTpPm@aM`e%@=|-Eyr>-n}8O#{Th2J@Gs7Z6-0{``^r6p`@>wboQl&!{PmZ|BULlFWq6(7n*4!mD`!oTUg64-FQTgBJrk+ANp z$R49NB%6ReF@{4D_k3f8Xu-gFlPR#HDE;KM2QNp4&G^J160AFqy!)4KyGL-o6JN7& z00*0H_Ib9ng~lK@<6Vv5w`vJ_<6n@(xUfDl+K9X++Jkd)<)JYP`-`c2#!an)HeVai zRo=Gc(x7Y;WR~$npnry4UB3NGC;!()>9p-SG+bklkPy{!l@ACqgLlSIMM)=N(;1PV zOPn!E{?5wJsS=D$o{kaeXo?KLZ@7~5Yk75kRtU}_lZN5chD3vPHk?TAhERR|Oof~ck|eahBd`7n*1*B)9G4zzVl7=YW2!w@ zVLZ`fB3$)q-`1Ss{-}_eukDAOVvGJ^Be5&K)x{DLC--cVXIdXBwj-GcJ(rt_o;*}# z4uX$z^bf{a8>T!CDTF;h2bbzd&NKK7+~TZ_WqD+oVoj0j#j`DaRyo(Yhu1+et%v)e z=39TpF!>?qAv5&OOr>cE+$k8GLU!xSGL@6*j-su?%$@V~%EeDnvQC^N%Zf{s(J~GN zZ2IJSd=PzUvaLcU^I)C+VO^gg{I@ar5%bFCje3F7+1b?*cibQ}j_g-CSnC3899g(} z5fl)xOp^U02!q6>bDC+JK_&=K+BkJ`F6Lx^<$YJ`@GN{@`Q#w8EQ2xPD;4z&T^qg^ zjwk=~CA9c|QCElI|Kcue|6M*i8D3Z|amLmg{Nl+1Y7Wy51`xJv{}6+}GGu^e#Podq z-247C9Q-sNV9#UaW@=V?Y;4Sk?ugps~0M zpz8uCG6NnX0KvFZkMU_d4k*U>^8RqR{9vSVXY>Q0pclvLrp6n_CK^X4o4!u9j7_yp zPPfg^bZpIa9{^tB*$xb+0eH4B)%>%219;%D*bn%MG3c+=(R~2=g~c!cp|``0DZo^G zurYJ6IRjXWG4dIM{+jy^&|onG)EmqLJqO3zOGkj9-T|D(0A*qQ0N^p~u3^9oJF5T{ z41hFXUNN(FxQDSK14%f{uKG860js!witfKP?E(R~e=)xs&Hhnq|Ht=$d|v!_l+P~* zZh{%|4U?sB77rxYt!_~8Yi2xgQIy>h<&x* z>VDtDRe574?Ds71)jCE#YhAX}IC>h{A^(D*yXK-Dew20Rg|qs`e9CKpha&{8FYLH& zlLqD%T6r+xPVB9yi=gMnYxSUF_Q&BP6DPhZ7NVS$?41;Rms6=psCd$!_4$6XLN%Y_ zR3Ocu!<78=_4=t`LdBHMfC^Um>Ci(?c`~m}r~2veLotWxr!9GEGsr1USi3_qU+qlf zs*3pdgV`+g+2|?G6q5&26D_l`6XZ$Y2c3KxbMXzWaQ6F6$}Iqz_Wj1py|Rz;^KW{e znST*5A@prXR;kqfDx6hKTu;Wu*v?v??rW1(QSY0r%KsuV+MSx+N= zvN8_o(D)3VB}LH_-%jZL+;~W>wwZXZ)e_DoSQ>C0A2P*CJ78SL9v3aGbMfeg4Kmt$ z+XC)PM>5;w7H&l?zweL@Vh|Yxy$-lNXUJlk+d6Zmt+H0rGv<6#anPFSa$9chhbK+6 z@2WF0vT0U3X{AqR?R(y8 zY~*Wg)oc^e=h<4C(Kh%_sN6`y7}D$}o@yBZP4CR8${OU6^O8mIwB+5eL%X)sstc(V z`#2@}Tlh&Bx5{<$fRG(q=_YRstGUVi5y*VglINY%xKU_x^V{OFI;o&QZ+)jbvlZ1- zII+hJj3*UOmG~MUMHbf>`ChD_!{M#azQ_pmDe25E-Y51BeooSM1uZVkv?eS*T zLP2j=NN%kXmGVBjuL$%B^l*J>9k7~Tms_Wv)Zzq~NY^T2E(1TFql6TVI=S#x9EFLnZfp%WP z(>NCxQ+sf=o9oL26NtG^(qm!DbBL@#4d0`FTzCVTyTI`sWKUD$BV@%+ON?v0@ZsoT z+KUr8x+Jw3-iCw3Go^(*dq z@eo)jMG(`4|9q^}U#x2gAahAzcW!F=t5S@=_#di<%S3VK{@gh)Cn(myT2ZRnAL z>a-2SO(C&jq}Pw9H}@AJjFkmJ_STdXnPp1+hcKwTbu!fjMP-eGNvOH-(vrp|Rscj9+k+#HtH3`M5o}@yVc>ffK^|Wm0Tm-kyV=S` zu)Y40hV`DBY(V|p=N8P!kLemzQ5xb=>uw9i8S088@;2^ik>aIyG->2{N$8MQ=uceO zrBh+mOGOf{Z;#dYEEq3Ep+nuu+rO?M<8&W~db^Nlk7-Jlr;?7+8YZSf)ibE8aNg*0 z=iE))1W|v8HVjsuwfH;@F`#K{O=IbhBS8zawFR(=*!vev`U{2Yzxpn0=lg{Uw(47M z6sZKWk)XPAZjXh4OVRcv|7(}$ZPzE0bZlI|(7V8H-PpCen(EM#?UXeQ6E zO?%;=^@mVM;v(B;srPQp7?uT3C%q0qTYT{hKo>0F1YXk;(76E7L;0lS*_?!d%XaBI zo1b2O9osG^?>e$kC~pUF$sT{}^RJ5ZDsM>CrI?0{&iH0lJUw6F*pP}a{(7&dFJ0Gm zoWOV<0=IE4vUr+~M^>Y5{;^&``HsKO*m!B}JJ+IBCsURi+c^xd4tZNkQ@e~>|Id{P z%;2Z4?Zgd{LS@8B`S8Y`uhnfhHQwh5zexuPG>w|qM+mQ*TO|*oNQ1<@B&{DX;lUbY z>y1O0>~1}fj+?vr#3ag|z?Y1Hv||*K?Q>TFG3g|k%MUM&X;t;ok;d`2;nBYTy78(4 zULeJYHZC*0j;L?PJ3M(A$yu~Oi$Lp0-)6e9??g{}9O~z!vs5?A8V&o=+9^ zpX=ve8vAsWi{1EQ-5J>P+r?H}#g71r1CYO)cyITm%%Q9NX=CNH>MB=2KmQZJ7)C84 z{$Y<^@X7m>C~(bdZg=Vdkcq?0Pdpn2 z!`7dFI9Q17-hF>KQnmlJW_P@PW1?|>vUwa+#?Ue`-MT#8_6@^tXg|WH-hkJ`nfCqJ z&h0t$`a=K8(&we+;ltph$r^)u@LU;kt@-Osru^u~<9K*bmJ7MRE8g zR!=cw|Jm!WpZfLvpIzbCpJBfPiucpMrQ#Kiwu($s^1=UZhBJxlb?GHOwXEdQfK-o? zvxYc6s*ZqO(v$40Zot+vwPc2sMI>tLhZV?11MhDwtXOiVKQ^vgK8_&gL6cT zxQCwsP`n;Obj2Y);MMwCUoPe$4=xUfawi8Ya>4v1jZn;#Jkon(D&)9x!w<%vVvZXs zzt!T&IR=wa4_DuE_7Ga)hAJTSnp^7mI7VoBjE_S7a%LkBrnbTfp7h!m(}gN+JDNr8l3 z-=N4jJS}cx-|f8RH`WRqlKC8kO`U0KsfTSw+tRB7iB{B*_qmjLQgs7a^&3UE`sGkk znU~*6wGCwvA_retUdsXDdwsN~Z?tJ3X~6eT2L+wZ4F*T? z5B8tgo|FkK#NkXu1$~YSf9#UTfrOFtNWAHoX_Yu?X9a1wF&NaV+m>Gdb<0V5~3l>=JW1k+uBgHmv=AdvAfnZ@fby65`l<| z!b|pS0+z#b)#v?ZnA+~bnT9vyqK{J^OILW(m!W+KJ(Zu+SiD)6_w=I@@1_tjYZ@vD zC!laoe)(g>pI008@tn7}Z--Knrk=edO=&pUiKwL6(UM=o?2T}!gpfItbqi9zbcKLs zB0)$zxlw$g4(gm`4n7AMm_zNj9~j4ig*J#ZN>eyY8H2xJ0)<_pB11hIs?nHCuAr~NmSMphQjbd> zijx7hE%fT3wNR5+SJGt{j}WPBej7T0x_rX}LAX7uO2>#Iq7nDD)=Ssy<U+Z1v?t`*wph*ihW%k9=%|J8TGfo^x%k;u8F{(s z8)@{^32(mX(o`RHCMODhi4R)gFYV9Qg%o&w-Lm|w89A}``lI80trP;z(A^LM>Iv2+ zc93jOfCP`{6*&A3Eaq%QBxy@H>^YQ$rrh=OwngbRJo+e4ru3ioTz@RYf3ki zF7&wW;Z*){HAI-&f9YnjGAIesVSQJpuNsXEc1k~^eeXhh*jRk}i})rBrw}B;AWg|f zh=z?-gwLI1I)l=VCxtSe9;V$}GL2(=Ae(3DcOQGF#On;I2w4gk3qAcpP9j*mzP#cw z(;Q75K(EN=PX@g*a#j(glA8DRq?^p0Gp43__aY)B=v<29$Q}w&<~V8nxar%iN)x=~ zhQv^Cjb=J&!e`r^axZu- zFQwDjvf0`mIgE{X%9p(OLTG*K$TO2bmEJkf<{93rudS-*V6n^Agv!xEM*!<0UT?t$Mc7g8eOQ+q-~$D8){#QwJUaa7b|Q^dE1;Jx~Q{ZkSg;Do@CB>b=}IV?yHV}ron zUI5Stp!e-BU~$%AZ}!h6F3@89x#VEz{r;D-)h}gpU&d;tgZ;U8=X%zhVm z`|HdB;Hx;bDQ{v>yt``vH|-eE;M>a>XU4b1{cj7qK(Pcs``w(~+nm|kn8F~~*2aO& z^x?_~K)*O%9K;aZFr90^_`(alzz!R@4*+DZ$G@fQRWW#cCsQqi>I?**7@ef(OC@Gi zx;QS=qx|l>mol*?0=wuP!`DmE-Laehc%M?Aa~uQMy?uPO+Oo|oaC-Ye)!zE}j}saF zn2WPgS3Cj{K(%hw8=dlYzhKqC@WWl8qG2Sioi%hS#J3jpoK6LZDL4-^Q*l@xN zpFYC>JgH`5k{70fjM^{UfKzE&$l^QC?bfz&IJUWPI!HU-c5&wgQ~ z*LhX^G@j_GH$O5r&!6gM_q)nDCPT?0nxIA6_n^7l;$mjdP$7D*D(nvG=IckaQ`_lT zWtBAb4DToAGy`vciGH0+J2123U)5;!%s?uqJ}8^ky!U-T_2w{lJMHnwuyT$46B<}i z7@AwFn8{FYYm!0kiNT1yDo2j;>eL;up z)>uuL?rU;?t$}~$shnb)+}HU2P%ei^vjb)aL(dRh9A5Vsx*LWbP4p)IX3v;xOTCcX zndR=4g6At&4}9Ig^~Ah;hV{P7A7jikG*&BmJ}f&}+g=+ext6KM8RBFfmW!WQ(!BBU zhX{?djox|{*E#MViL~yFQ>f_(K{~(Pf_G*v>d2&ZSs^JEJny|v3b@3O@Re`6AE=Ag z+?O4QNrX;5S4lBm;aS*Vq0WF`(A`&Jt3;u;iCtv(U(C4Cl_u<1q)6oocaa*PK@3$0 zUm2GfRwlWxgcro?z=U=@Gm1>qihcytPt9B&ZTJi7Tb^HghR<>$r_81!GYC7PHg`&I zpTL!x`a~CxhT?&zs3uhqRQN6a>XK{(F|iRm_csFA0w9zR#VO6XIdFN=-C&gmN~}vT z|4S>xRL>R&<2!WpAIx|}Tw<)Jj^6NAFyT}yj;Uv8<6?P1ic5)reHxeS)mDN}tghiI zkZhqn+3Vmy!!^=cZcFpVan$#X%*!VVjX^)~pmf(PYvUQS11+tGXzS-?P-4oj)~>x( zA68S)?!tezs)0k=-sn!LH})Hl*W0|^_TW(0V`>#>KukW5ha3(t2_?_==I;l zv6H+x3UsFRCGf*p0N3#@?y;c*LY<716PI*7+d%acyw6W?bkAIo*M3@MX&(YTJIR&Y zD%GgqD0{W>cyO^Bid#T6j~qR8sSoq5dHDG5RX>%lPGKdedJ-0?zHro5X}D1<$wSW9 z8u@horPrO(uWT_HHRJa2s?Z5@gL>VcL*p`hSe2WodwV@|)2tRq zl#GMY6LON_MJlP+2dFNOdRFAoWRVQo1!-1ma;Sc6Vy)%Mb#mB^R?L#R?C!4x9w&Ws z1(lxdl&)(CjW*bby&*!joa^i&5R*-MQ|4x(Ru#ojW<>M72f+kgca|YR1*B!fp;7G@ zAuKqlV@;XQUc}xWt25MGC7|{U5xi4irkfMrChE9zvea_oY4rY(GsoRb_*PJo_z-fS z)H6H(TDl73Eks$y^C3aAVzVz%vL1?l8d17IaG}OgXnyPKd~;vs-d2%0)2}{YUg_t= zt-+t)`qk#Ue2E)tL)5$a>#bXiEuYu5%wSJ+HKtw3U~-rku(IFMmh^t~{!(PO#Hf@J zM4Keud8W?tN>+hGAeV$n9~z zDGKo~?CPn5^*T9lHvJTTC{P6;@GlM4!7u)|J05QTW3}$n+~38x|6tzDa8|=S_Aht* zR`F!B;^}&&^IE0LO4aj~D%aI2*R?9wjVjlzD%WpSuDc&!?$!DMSc%i8;s@>Vm^tmt z1+s0x))o*~z`hnxS-_KX;Q9H_#ce2-;03I2e^GjYivVdiV1xUU{)Hv;0+t8N?iOg# z1>kBx;0-eX5n`wO$#%KZR+-~Qnd91fdtg>e?N&=4ua?@bm0)JQ#0Hqn5}R)&HajIY zyFa(H*tISur3P$ve~&dbIQM^AHujfX|I3eySr7kj2czdtEf~L)_TNpt*ehTIdq0&w zMneB7q#rJ0A-}+S`0IOnU_;zr<^<4w0Z3a_m0QuDcs9UN@zYH4`{3uc7?8?9F0Q&Q zzOFr?t@G_bSMp?c>LxmEA4or*4nRjcbuM6R3-1mFi}r^~cfXXcd?}wFE?*q3*ch(d z82PaEwR&gl)81I^{zStepmnEOj<9_am}T&6=OI?&9?YQudM{8TakS8XxHxc#sVf6m zXh37xFdz#7aR^96fQ1GidXItj2#jF?>sHvBKi&pdXqde(ATm!IATXd_Ogat|ki%9% zU>Cg@R{~)6{Z$C@)0MD;-RAyj|NXD(G1mdb;Vem_a0p11#Slk69y2VLM zEt4r}Y32pnhL|ZWRd_b~aEKe$OR(^ywR>`A$Z!yRja1hY8D-@FrCRLcYJHH`wh*oM{fx84H9V+l#&1k;(x!MYxn zckAF^EK|b-=7Q2*>9-9@#NHpaj0*7SOU!(8DT38p9jPe*o?#_S%Q?w$fE&UJ2Mxt;7%hV*@TENpKOk{pMNy<=L3fr$KMUolyYzh)>?75}y)#xDw_2bx zr&3p5pOW-hVg@q8bDJ+sa0SP-w<+iY>LzoHY-+FZBf9>6pZuEP!6?z%!b?}vOd6_k3i9JnRq}7X=%^!Mo+c8?k($(nwEs^qzi&gi;1f5fjT+>2MBvrnLwl;K43Bs%`WcApdoFyoH2IaKTrlxvb!AAEv)o2N zn48};n_6130@@x870w&oc2FcYYc(TvsBNIb$7O@yD|nx9S>x~5`zdN=*+GSZCns+Y zQFF7~`pN_tCv0#KUGBi8l>2Cg#HYq55J!6y2f$_8=BRjYZ$O!XIcXp3E3qFa1fA=L z6yxJ~?RQd2?>4+WAx5f_gV0b=@TBf@-?IX1RFsY`(BZ<&i)+uiy{84wE{6_LZ#Qj( z$p8f34TOqPThWVElCh0I=Z`a!@1A*j-6mrwr{(j|*T%E-AW^&-G5RnZdERVTaG>;Z zAinsEcgrNiPvdxSUDjgqSrV@_t8~EPv;f~Rn~1YR>3u5_JXR)?Nj{+b`2?R~uwP$5 zzPLPv4w`Vw-0)Vdhc5pnNSMzmGrY}--mg_cUE@SuOK^>eiz={T(zWb+v8?y>8iznZ;o_DF)|*Kh1m5Vf z(nsm55x7i!Al=wvqI4S)zZPp!_OP;ad%2J<<*&%#r00INkFRE3eTyer8R?YW(8^-c zR&*^3H2>6L^Yx8;Dlra?v^m1*S~|(h6;)Z&xpF$5!)qyIS(*bP8Du#)&u_(8IJKp9 z54Y#SmpuEwsIXZYJ*2CziV2M0&UZEAQM(4aR_&ik$a)WS5%*f~hp`e%j~;=`7vPK} zjC6#wLfYp&pIpJ!E`#-FS;@TJkZ!zQmZ+|B(ve;tVA!}&U;L>A$6~muopS$%*xmQ+ zF+AV;$FC+8g;wUTv>C-&WZkrtsRm0$4wv!G+>n^!P#Cd54|f(S6d$0`;}AD%-=}gzfbwg7j76i1EQCKCblQcMB+P5i%Z?m$xpbAh+3T3U jboAe8eMkm`<^`Pp`TCzv;D0`W|M>*|=M(t<=o9!~nE>>- literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 000000000..3331e34f9 --- /dev/null +++ b/index.html @@ -0,0 +1,237 @@ +淳淳同学的个人博客 - 人不可一日无事 + + + + + + + + + +

    【个人开源】Vue3 轮播组件: v3-carousel
    Hello World
    Vue源码解读(知识点总结)
    2021前端知识点总结
    JavaScript运算符优先级
    预防XSS攻击插件 js-xss
    VSCode注释高亮插件 Better Comments
    【转】看完让你彻底搞懂Websocket原理
    加载聊天历史记录并保留滚动条当前位置
    查看代码行数
    \ No newline at end of file diff --git a/js/calendar.js b/js/calendar.js new file mode 100644 index 000000000..179aea5ee --- /dev/null +++ b/js/calendar.js @@ -0,0 +1,6 @@ +GitHubCalendar(".calendar", "LeeDebug", { responsive: true }); +// GitHubCalendar(".calendar", "LeeDebug", { +// proxy (username) { +// return fetch(`https://githubapi.ryanchristian.dev/user/${username}`) +// } +// }).then(r => r.text()) \ No newline at end of file diff --git a/js/gitcalendar.js b/js/gitcalendar.js new file mode 100644 index 000000000..ceaf6b31a --- /dev/null +++ b/js/gitcalendar.js @@ -0,0 +1,102 @@ +"use strict"; + +var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (e) { + return typeof e === "undefined" ? "undefined" : _typeof2(e); +} : function (e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e === "undefined" ? "undefined" : _typeof2(e); +};!function (e) { + "object" === ("undefined" == typeof exports ? "undefined" : _typeof(exports)) && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).GitHubCalendar = e(); +}(function () { + return function o(s, u, i) { + function c(t, e) { + if (!u[t]) { + if (!s[t]) { + var r = "function" == typeof require && require;if (!e && r) return r(t, !0);if (l) return l(t, !0);var n = new Error("Cannot find module '" + t + "'");throw n.code = "MODULE_NOT_FOUND", n; + }var a = u[t] = { exports: {} };s[t][0].call(a.exports, function (e) { + return c(s[t][1][e] || e); + }, a, a.exports, o, s, u, i); + }return u[t].exports; + }for (var l = "function" == typeof require && require, e = 0; e < i.length; e++) { + c(i[e]); + }return c; + }({ 1: [function (e, t, r) { + var h = e("github-calendar-parser"), + y = e("elly"), + v = e("add-subtract-date"), + M = e("formatoid"), + x = "YYYY 年 MMM D 日", + _ = "MMMM D", + S = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];function k(e) { + return e + " " + (1 === e ? "day" : "天"); + }t.exports = function (b, e, m) { + b = y(b), (m = m || {}).summary_text = m.summary_text || '数据来源 @' + e + "", m.cache = 1e3 * (m.cache || 86400), !1 === m.global_stats && (b.style.minHeight = "175px");var r = { content: "gh_calendar_content." + e, expire_at: "gh_calendar_expire." + e };m.proxy = m.proxy || function (e) { + return fetch("https://api.bloggify.net/gh-calendar/?username=" + e).then(function (e) { + return e.text(); + }); + }, m.getCalendar = m.getCalendar || function (e) { + if (m.cache && Date.now() < +localStorage.getItem(r.expire_at)) { + var t = localStorage.getItem(r.content);if (t) return Promise.resolve(t); + }return m.proxy(e).then(function (e) { + return m.cache && (localStorage.setItem(r.content, e), localStorage.setItem(r.expire_at, Date.now() + m.cache)), e; + }); + };return function g() { + return m.getCalendar(e).then(function (e) { + var t = document.createElement("div");t.innerHTML = e;var r, + n, + a, + o, + s, + u, + i, + c, + l, + d, + f, + p = t.querySelector(".js-yearly-contributions");y(".position-relative h2", p).remove(), p.querySelector(".float-left.text-gray").innerHTML = m.summary_text, p.querySelector("include-fragment") ? setTimeout(g, 500) : (!0 === m.responsive && (n = (r = p.querySelector("svg.js-calendar-graph-svg")).getAttribute("width"), a = r.getAttribute("height"), r.removeAttribute("height"), r.setAttribute("width", "100%"), r.setAttribute("viewBox", "0 0 " + n + " " + a)), !1 !== m.global_stats && (s = (o = h(y("svg", p).outerHTML)).current_streak ? M(o.current_streak_range[0], _) + " 日" + " – " + M(o.current_streak_range[1], _) : o.last_contributed ? "最后一次提交于" + " " + M(o.last_contributed, _) + "" : "Rock - Hard Place", u = o.longest_streak ? M(o.longest_streak_range[0], _) + " 日" + " – " + M(o.longest_streak_range[1], _) : o.last_contributed ? "最后一次提交于" + " " + M(o.last_contributed, _) + " " : "Rock - Hard Place", i = y("
    ", { class: "contrib-column contrib-column-first table-column", html: '过去一年内提交\n ' + o.last_year + ' 次\n ' + M(v.add(v.subtract(new Date(), 1, "year"), 1, "day"), x) + " – " + M(new Date(), x) + "" }), c = y("
    ", { class: "contrib-column table-column", html: '最长连续提交记录\n ' + k(o.longest_streak) + '\n ' + u + " 日" }), l = y("
    ", { class: "contrib-column table-column", html: '当前提交记录\n ' + k(o.current_streak) + '\n ' + s + " 日" }), p.appendChild(i), p.appendChild(c), p.appendChild(l)), b.innerHTML = p.innerHTML, !0 === m.tooltips && (d = b, (f = document.createElement("div")).classList.add("day-tooltip"), d.appendChild(f), d.querySelectorAll("rect.day").forEach(function (e) { + e.addEventListener("mouseenter", function (e) { + var t = e.target.getAttribute("data-count");"0" === t ? t = "No contributions" : "1" === t ? t = "1 contribution" : t += " contributions";var r = new Date(e.target.getAttribute("data-date")), + n = S[r.getUTCMonth()] + " " + r.getUTCDate() + ", " + r.getUTCFullYear();f.innerHTML = "" + t + " on " + n, f.classList.add("is-visible");var a = e.target.getBoundingClientRect(), + o = a.left + window.pageXOffset - f.offsetWidth / 2 + a.width / 2, + s = a.bottom + window.pageYOffset - f.offsetHeight - 2 * a.height;f.style.top = s + "px", f.style.left = o + "px"; + }), e.addEventListener("mouseleave", function () { + f.classList.remove("is-visible"); + }); + }))); + }).catch(function (e) { + return console.error(e); + }); + }(); + }; + }, { "add-subtract-date": 2, elly: 4, formatoid: 6, "github-calendar-parser": 8 }], 2: [function (e, t, r) { + function n(a) { + return function e(t, r, n) { + switch (r *= a, n) {case "years":case "year": + t.setFullYear(t.getFullYear() + r);break;case "months":case "month": + t.setMonth(t.getMonth() + r);break;case "weeks":case "week": + return e(t, 7 * r, "days");case "days":case "day": + t.setDate(t.getDate() + r);break;case "hours":case "hour": + t.setHours(t.getHours() + r);break;case "minutes":case "minute": + t.setMinutes(t.getMinutes() + r);break;case "seconds":case "second": + t.setSeconds(t.getSeconds() + r);break;case "milliseconds":case "millisecond": + t.setMilliseconds(t.getMilliseconds() + r);break;default: + throw new Error("Invalid range: " + n);}return t; + }; + }t.exports = { add: n(1), subtract: n(-1) }; + }, {}], 3: [function (e, t, r) { + t.exports.en = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], t.exports.en.abbr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], t.exports.en.short = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], t.exports.fr = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], t.exports.fr.abbr = ["dim", "lun", "mar", "mer", "jeu", "ven", "sam"], t.exports.fr.short = ["di", "lu", "ma", "me", "je", "ve", "sa"], t.exports.es = ["domingo", "lunes", "martes", "miercoles", "jueves", "viernes", "sabado"], t.exports.es.abbr = ["dom", "lun", "mar", "mir", "jue", "vie", "sab"], t.exports.es.short = ["do", "lu", "ma", "mi", "ju", "vi", "sa"], t.exports.it = ["Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato"], t.exports.it.abbr = ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"], t.exports.it.short = ["D", "L", "Ma", "Me", "G", "V", "S"], t.exports = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], t.exports.abbr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], t.exports.short = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; + }, {}], 4: [function (e, t, r) { + var n = e("iterate-object"), + a = e("sliced");function o(r, e) { + return "string" == typeof r ? "<" 1 11 12 13 60 =="=" r.charat(0) ? (r="document.createElement(r.slice(1," -1)), n(e || {}, function (e, t) { switch (t) {case "text": return void (r.textcontent="e);case" "html": (r.innerhtml="e);}r.setAttribute(t," e); }), r) : (e="e" document).queryselector(r) r; }o.$$="function" "string"="=" typeof e (t="t" document, a(t.queryselectorall(e))) [e]; }, t.exports="o;" "iterate-object": 9, sliced: }], 5: [function t, r="r" "0";var n="(t" t 2) - (n <="0" "" r.repeat(n)) + e; }; {}], 6: var a="e("days")," o="e("fillo")," s="e("parse-it").Parser," u="{" yyyy: yyyy(e, e.getutcfullyear() e.getfullyear(); yy: yy(e, u.yyyy(e, % 100; mmmm: mmmm(e, n[e.getutcmonth()] n[e.getmonth()]; mmm: mmm(e, n.abbr[e.getutcmonth()] n.abbr[e.getmonth()]; mm: mm(e, o(t e.getutcmonth() e.getmonth() 1); m: m(e, 1; dddd: dddd(e, a[u.d(e, t)]; ddd: ddd(e, a.abbr[u.d(e, dd: dd(e, a.short[u.d(e, d: d(e, e.getutcday() e.getday(); o(u.d(e, t)); e.getutcdate() e.getdate(); a: a(e, u.a(e, t).touppercase(); "pm" "am"; hh: hh(e, o(u.h(e, h: h(e, u.h(e, 12; e.getutchours() e.gethours(); o(u.m(e, e.getutcminutes() e.getminutes(); ss: ss(e, o(u.s(e, s: s(e, e.getutcseconds() e.getseconds(); math.round(u.s(e, * 10); 100); sss: sss(e, 1e3, 3); z: z(e) (0 "+" "-") o(parseint(t 60)) ":" 60); zz: zz(e) } i="new" s(u);t.exports="function" i.run(t, [e, e._useutc]); days: 3, fillo: 5, months: 10, "parse-it": 7: "#d6e685", "#8cc665", "#44a340", "#1e6823"]; 8: (e) o() s.current_streak> s.longest_streak && (s.longest_streak = s.current_streak, s.longest_streak_range[0] = s.current_streak_range[0], s.longest_streak_range[1] = s.current_streak_range[1]); + }var s = { last_year: 0, longest_streak: -1, longest_streak_range: [], current_streak: 0, current_streak_range: [], weeks: [], days: [], last_contributed: null }, + u = [];return e.split("\n").slice(2).map(function (e) { + return e.trim(); + }).forEach(function (e) { + if (e.startsWith(" o;) { + n[a - o] = e[a]; + }return n; + }; + }, {}] }, {}, [1])(1); +});
    \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 000000000..20f509a87 --- /dev/null +++ b/js/main.js @@ -0,0 +1,930 @@ +document.addEventListener('DOMContentLoaded', () => { + let headerContentWidth, $nav + let mobileSidebarOpen = false + + const adjustMenu = init => { + const getAllWidth = ele => Array.from(ele).reduce((width, i) => width + i.offsetWidth, 0) + + if (init) { + const blogInfoWidth = getAllWidth(document.querySelector('#blog-info > a').children) + const menusWidth = getAllWidth(document.getElementById('menus').children) + headerContentWidth = blogInfoWidth + menusWidth + $nav = document.getElementById('nav') + } + + const hideMenuIndex = window.innerWidth <= 768 || headerContentWidth > $nav.offsetWidth - 120 + $nav.classList.toggle('hide-menu', hideMenuIndex) + } + + // 初始化header + const initAdjust = () => { + adjustMenu(true) + $nav.classList.add('show') + } + + // sidebar menus + const sidebarFn = { + open: () => { + btf.overflowPaddingR.add() + btf.animateIn(document.getElementById('menu-mask'), 'to_show 0.5s') + document.getElementById('sidebar-menus').classList.add('open') + mobileSidebarOpen = true + }, + close: () => { + btf.overflowPaddingR.remove() + btf.animateOut(document.getElementById('menu-mask'), 'to_hide 0.5s') + document.getElementById('sidebar-menus').classList.remove('open') + mobileSidebarOpen = false + } + } + + /** + * 首頁top_img底下的箭頭 + */ + const scrollDownInIndex = () => { + const handleScrollToDest = () => { + btf.scrollToDest(document.getElementById('content-inner').offsetTop, 300) + } + + const $scrollDownEle = document.getElementById('scroll-down') + $scrollDownEle && btf.addEventListenerPjax($scrollDownEle, 'click', handleScrollToDest) + } + + /** + * 代碼 + * 只適用於Hexo默認的代碼渲染 + */ + const addHighlightTool = () => { + const highLight = GLOBAL_CONFIG.highlight + if (!highLight) return + + const { highlightCopy, highlightLang, highlightHeightLimit, highlightFullpage, highlightMacStyle, plugin } = highLight + const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink + const isShowTool = highlightCopy || highlightLang || isHighlightShrink !== undefined || highlightFullpage || highlightMacStyle + const $figureHighlight = plugin === 'highlight.js' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]') + + if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return + + const isPrismjs = plugin === 'prismjs' + const highlightShrinkClass = isHighlightShrink === true ? 'closed' : '' + const highlightShrinkEle = isHighlightShrink !== undefined ? '' : '' + const highlightCopyEle = highlightCopy ? '
    ' : '' + const highlightMacStyleEle = '
    ' + const highlightFullpageEle = highlightFullpage ? '' : '' + + const alertInfo = (ele, text) => { + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(text) + } else { + ele.textContent = text + ele.style.opacity = 1 + setTimeout(() => { ele.style.opacity = 0 }, 800) + } + } + + const copy = async (text, ctx) => { + try { + await navigator.clipboard.writeText(text) + alertInfo(ctx, GLOBAL_CONFIG.copy.success) + } catch (err) { + console.error('Failed to copy: ', err) + alertInfo(ctx, GLOBAL_CONFIG.copy.noSupport) + } + } + + // click events + const highlightCopyFn = (ele, clickEle) => { + const $buttonParent = ele.parentNode + $buttonParent.classList.add('copy-true') + const preCodeSelector = isPrismjs ? 'pre code' : 'table .code pre' + const codeElement = $buttonParent.querySelector(preCodeSelector) + if (!codeElement) return + copy(codeElement.innerText, clickEle.previousElementSibling) + $buttonParent.classList.remove('copy-true') + } + + const highlightShrinkFn = ele => ele.classList.toggle('closed') + + const codeFullpage = (item, clickEle) => { + const wrapEle = item.closest('figure.highlight') + const isFullpage = wrapEle.classList.toggle('code-fullpage') + + document.body.style.overflow = isFullpage ? 'hidden' : '' + clickEle.classList.toggle('fa-down-left-and-up-right-to-center', isFullpage) + clickEle.classList.toggle('fa-up-right-and-down-left-from-center', !isFullpage) + } + + const highlightToolsFn = e => { + const $target = e.target.classList + const currentElement = e.currentTarget + if ($target.contains('expand')) highlightShrinkFn(currentElement) + else if ($target.contains('copy-button')) highlightCopyFn(currentElement, e.target) + else if ($target.contains('fullpage-button')) codeFullpage(currentElement, e.target) + } + + const expandCode = e => e.currentTarget.classList.toggle('expand-done') + + // 獲取隱藏狀態下元素的真實高度 + const getActualHeight = item => { + const hiddenElements = new Map() + + const fix = () => { + let current = item + while (current !== document.body && current != null) { + if (window.getComputedStyle(current).display === 'none') { + hiddenElements.set(current, current.getAttribute('style') || '') + } + current = current.parentNode + } + + const style = 'visibility: hidden !important; display: block !important;' + hiddenElements.forEach((originalStyle, elem) => { + elem.setAttribute('style', originalStyle ? originalStyle + ';' + style : style) + }) + } + + const restore = () => { + hiddenElements.forEach((originalStyle, elem) => { + if (originalStyle === '') elem.removeAttribute('style') + else elem.setAttribute('style', originalStyle) + }) + } + + fix() + const height = item.offsetHeight + restore() + return height + } + + const createEle = (lang, item) => { + const fragment = document.createDocumentFragment() + + if (isShowTool) { + const hlTools = document.createElement('div') + hlTools.className = `highlight-tools ${highlightShrinkClass}` + hlTools.innerHTML = highlightMacStyleEle + highlightShrinkEle + lang + highlightCopyEle + highlightFullpageEle + btf.addEventListenerPjax(hlTools, 'click', highlightToolsFn) + fragment.appendChild(hlTools) + } + + if (highlightHeightLimit && getActualHeight(item) > highlightHeightLimit + 30) { + const ele = document.createElement('div') + ele.className = 'code-expand-btn' + ele.innerHTML = '' + btf.addEventListenerPjax(ele, 'click', expandCode) + fragment.appendChild(ele) + } + + isPrismjs ? item.parentNode.insertBefore(fragment, item) : item.insertBefore(fragment, item.firstChild) + } + + $figureHighlight.forEach(item => { + let langName = '' + if (isPrismjs) btf.wrap(item, 'figure', { class: 'highlight' }) + + if (!highlightLang) { + createEle('', item) + return + } + + if (isPrismjs) { + langName = item.getAttribute('data-language') || 'Code' + } else { + langName = item.getAttribute('class').split(' ')[1] + if (langName === 'plain' || langName === undefined) langName = 'Code' + } + createEle(`
    ${langName}
    `, item) + }) + } + + /** + * PhotoFigcaption + */ + const addPhotoFigcaption = () => { + if (!GLOBAL_CONFIG.isPhotoFigcaption) return + document.querySelectorAll('#article-container img').forEach(item => { + const altValue = item.title || item.alt + if (!altValue) return + const ele = document.createElement('div') + ele.className = 'img-alt text-center' + ele.textContent = altValue + item.insertAdjacentElement('afterend', ele) + }) + } + + /** + * Lightbox + */ + const runLightbox = () => { + btf.loadLightbox(document.querySelectorAll('#article-container img:not(.no-lightbox)')) + } + + /** + * justified-gallery 圖庫排版 + */ + + const fetchUrl = async url => { + try { + const response = await fetch(url) + return await response.json() + } catch (error) { + console.error('Failed to fetch URL:', error) + return [] + } + } + + const runJustifiedGallery = (container, data, config) => { + const { isButton, limit, firstLimit, tabs } = config + + const dataLength = data.length + const maxGroupKey = Math.ceil((dataLength - firstLimit) / limit + 1) + + // Gallery configuration + const igConfig = { + gap: 5, + isConstantSize: true, + sizeRange: [150, 600], + // useResizeObserver: true, + // observeChildren: true, + useTransform: true + // useRecycle: false + } + + const ig = new InfiniteGrid.JustifiedInfiniteGrid(container, igConfig) + let isLayoutHidden = false + + // Utility functions + const sanitizeString = str => (str && str.replace(/"/g, '"')) || '' + + const createImageItem = item => { + const alt = item.alt ? `alt="${sanitizeString(item.alt)}"` : '' + const title = item.title ? `title="${sanitizeString(item.title)}"` : '' + return `
    + +
    ` + } + + const getItems = (nextGroupKey, count, isFirst = false) => { + const startIndex = isFirst ? (nextGroupKey - 1) * count : (nextGroupKey - 2) * count + firstLimit + return data.slice(startIndex, startIndex + count).map(createImageItem) + } + + // Load more button + const addLoadMoreButton = container => { + const button = document.createElement('button') + button.innerHTML = `${GLOBAL_CONFIG.infinitegrid.buttonText}` + + button.addEventListener('click', () => { + button.remove() + btf.setLoading.add(container) + appendItems(ig.getGroups().length + 1, limit) + }, { once: true }) + + container.insertAdjacentElement('afterend', button) + } + + const appendItems = (nextGroupKey, count, isFirst) => { + ig.append(getItems(nextGroupKey, count, isFirst), nextGroupKey) + } + + // Event handlers + const handleRenderComplete = e => { + if (tabs) { + const parentNode = container.parentNode + if (isLayoutHidden) { + parentNode.style.visibility = 'visible' + } + if (container.offsetHeight === 0) { + parentNode.style.visibility = 'hidden' + isLayoutHidden = true + } + } + + const { updated, isResize, mounted } = e + if (!updated.length || !mounted.length || isResize) return + + btf.loadLightbox(container.querySelectorAll('img:not(.medium-zoom-image)')) + + if (ig.getGroups().length === maxGroupKey) { + btf.setLoading.remove(container) + !tabs && ig.off('renderComplete', handleRenderComplete) + return + } + + if (isButton) { + btf.setLoading.remove(container) + addLoadMoreButton(container) + } + } + + const handleRequestAppend = btf.debounce(e => { + const nextGroupKey = (+e.groupKey || 0) + 1 + + if (nextGroupKey === 1) appendItems(nextGroupKey, firstLimit, true) + else appendItems(nextGroupKey, limit) + + if (nextGroupKey === maxGroupKey) ig.off('requestAppend', handleRequestAppend) + }, 300) + + btf.setLoading.add(container) + ig.on('renderComplete', handleRenderComplete) + + if (isButton) { + appendItems(1, firstLimit, true) + } else { + ig.on('requestAppend', handleRequestAppend) + ig.renderItems() + } + + btf.addGlobalFn('pjaxSendOnce', () => ig.destroy()) + } + + const addJustifiedGallery = async (elements, tabs = false) => { + if (!elements.length) return + + const initGallery = async () => { + for (const element of elements) { + if (btf.isHidden(element) || element.classList.contains('loaded')) continue + + const config = { + isButton: element.getAttribute('data-button') === 'true', + limit: parseInt(element.getAttribute('data-limit'), 10), + firstLimit: parseInt(element.getAttribute('data-first'), 10), + tabs + } + + const container = element.firstElementChild + const content = container.textContent + container.textContent = '' + element.classList.add('loaded') + + try { + const data = element.getAttribute('data-type') === 'url' ? await fetchUrl(content) : JSON.parse(content) + runJustifiedGallery(container, data, config) + } catch (error) { + console.error('Gallery data parsing failed:', error) + } + } + } + + if (typeof InfiniteGrid === 'function') { + await initGallery() + } else { + await btf.getScript(GLOBAL_CONFIG.infinitegrid.js) + await initGallery() + } + } + + /** + * rightside scroll percent + */ + const rightsideScrollPercent = currentTop => { + const scrollPercent = btf.getScrollPercent(currentTop, document.body) + const goUpElement = document.getElementById('go-up') + + if (scrollPercent < 95) { + goUpElement.classList.add('show-percent') + goUpElement.querySelector('.scroll-percent').textContent = scrollPercent + } else { + goUpElement.classList.remove('show-percent') + } + } + + /** + * 滾動處理 + */ + const scrollFn = () => { + const $rightside = document.getElementById('rightside') + const innerHeight = window.innerHeight + 56 + let initTop = 0 + const $header = document.getElementById('page-header') + const isChatBtn = typeof chatBtn !== 'undefined' + const isShowPercent = GLOBAL_CONFIG.percent.rightside + + // 檢查文檔高度是否小於視窗高度 + const checkDocumentHeight = () => { + if (document.body.scrollHeight <= innerHeight) { + $rightside.classList.add('rightside-show') + return true + } + return false + } + + // 如果文檔高度小於視窗高度,直接返回 + if (checkDocumentHeight()) return + + // find the scroll direction + const scrollDirection = currentTop => { + const result = currentTop > initTop // true is down & false is up + initTop = currentTop + return result + } + + let flag = '' + const scrollTask = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + const isDown = scrollDirection(currentTop) + if (currentTop > 56) { + if (flag === '') { + $header.classList.add('nav-fixed') + $rightside.classList.add('rightside-show') + } + + if (isDown) { + if (flag !== 'down') { + $header.classList.remove('nav-visible') + isChatBtn && window.chatBtn.hide() + flag = 'down' + } + } else { + if (flag !== 'up') { + $header.classList.add('nav-visible') + isChatBtn && window.chatBtn.show() + flag = 'up' + } + } + } else { + flag = '' + if (currentTop === 0) { + $header.classList.remove('nav-fixed', 'nav-visible') + } + $rightside.classList.remove('rightside-show') + } + + isShowPercent && rightsideScrollPercent(currentTop) + checkDocumentHeight() + }, 300) + + btf.addEventListenerPjax(window, 'scroll', scrollTask, { passive: true }) + } + + /** + * toc,anchor + */ + const scrollFnToDo = () => { + const isToc = GLOBAL_CONFIG_SITE.isToc + const isAnchor = GLOBAL_CONFIG.isAnchor + const $article = document.getElementById('article-container') + + if (!($article && (isToc || isAnchor))) return + + let $tocLink, $cardToc, autoScrollToc, $tocPercentage, isExpand + + if (isToc) { + const $cardTocLayout = document.getElementById('card-toc') + $cardToc = $cardTocLayout.querySelector('.toc-content') + $tocLink = $cardToc.querySelectorAll('.toc-link') + $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') + isExpand = $cardToc.classList.contains('is-expand') + + // toc元素點擊 + const tocItemClickFn = e => { + const target = e.target.closest('.toc-link') + if (!target) return + + e.preventDefault() + btf.scrollToDest(btf.getEleTop(document.getElementById(decodeURI(target.getAttribute('href')).replace('#', ''))), 300) + if (window.innerWidth < 900) { + $cardTocLayout.classList.remove('open') + } + } + + btf.addEventListenerPjax($cardToc, 'click', tocItemClickFn) + + autoScrollToc = item => { + const sidebarHeight = $cardToc.clientHeight + const itemOffsetTop = item.offsetTop + const itemHeight = item.clientHeight + const scrollTop = $cardToc.scrollTop + const offset = itemOffsetTop - scrollTop + const middlePosition = (sidebarHeight - itemHeight) / 2 + + if (offset !== middlePosition) { + $cardToc.scrollTop = scrollTop + (offset - middlePosition) + } + } + + // 處理 hexo-blog-encrypt 事件 + $cardToc.style.display = 'block' + } + + // find head position & add active class + const $articleList = $article.querySelectorAll('h1,h2,h3,h4,h5,h6') + let detectItem = '' + + const findHeadPosition = top => { + if (top === 0) return false + + let currentId = '' + let currentIndex = '' + + for (let i = 0; i < $articleList.length; i++) { + const ele = $articleList[i] + if (top > btf.getEleTop(ele) - 80) { + const id = ele.id + currentId = id ? '#' + encodeURI(id) : '' + currentIndex = i + } else { + break + } + } + + if (detectItem === currentIndex) return + + if (isAnchor) btf.updateAnchor(currentId) + + detectItem = currentIndex + + if (isToc) { + $cardToc.querySelectorAll('.active').forEach(i => i.classList.remove('active')) + + if (currentId) { + const currentActive = $tocLink[currentIndex] + currentActive.classList.add('active') + + setTimeout(() => autoScrollToc(currentActive), 0) + + if (!isExpand) { + let parent = currentActive.parentNode + while (!parent.matches('.toc')) { + if (parent.matches('li')) parent.classList.add('active') + parent = parent.parentNode + } + } + } + } + } + + // main of scroll + const tocScrollFn = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + if (isToc && GLOBAL_CONFIG.percent.toc) { + $tocPercentage.textContent = btf.getScrollPercent(currentTop, $article) + } + findHeadPosition(currentTop) + }, 100) + + btf.addEventListenerPjax(window, 'scroll', tocScrollFn, { passive: true }) + } + + const handleThemeChange = mode => { + const globalFn = window.globalFn || {} + const themeChange = globalFn.themeChange || {} + if (!themeChange) { + return + } + + Object.keys(themeChange).forEach(key => { + const themeChangeFn = themeChange[key] + if (['disqus', 'disqusjs'].includes(key)) { + setTimeout(() => themeChangeFn(mode), 300) + } else { + themeChangeFn(mode) + } + }) + } + + /** + * Rightside + */ + const rightSideFn = { + readmode: () => { // read mode + const $body = document.body + const newEle = document.createElement('button') + + const exitReadMode = () => { + $body.classList.remove('read-mode') + newEle.remove() + newEle.removeEventListener('click', exitReadMode) + } + + $body.classList.add('read-mode') + newEle.type = 'button' + newEle.className = 'fas fa-sign-out-alt exit-readmode' + newEle.addEventListener('click', exitReadMode) + $body.appendChild(newEle) + }, + darkmode: () => { // switch between light and dark mode + const willChangeMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark' + if (willChangeMode === 'dark') { + btf.activateDarkMode() + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night) + } else { + btf.activateLightMode() + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day) + } + btf.saveToLocal.set('theme', willChangeMode, 2) + handleThemeChange(willChangeMode) + }, + 'rightside-config': item => { // Show or hide rightside-hide-btn + const hideLayout = item.firstElementChild + if (hideLayout.classList.contains('show')) { + hideLayout.classList.add('status') + setTimeout(() => { + hideLayout.classList.remove('status') + }, 300) + } + + hideLayout.classList.toggle('show') + }, + 'go-up': () => { // Back to top + btf.scrollToDest(0, 500) + }, + 'hide-aside-btn': () => { // Hide aside + const $htmlDom = document.documentElement.classList + const saveStatus = $htmlDom.contains('hide-aside') ? 'show' : 'hide' + btf.saveToLocal.set('aside-status', saveStatus, 2) + $htmlDom.toggle('hide-aside') + }, + 'mobile-toc-button': (p, item) => { // Show mobile toc + const tocEle = document.getElementById('card-toc') + tocEle.style.transition = 'transform 0.3s ease-in-out' + + const tocEleHeight = tocEle.clientHeight + const btData = item.getBoundingClientRect() + + const tocEleBottom = window.innerHeight - btData.bottom - 30 + if (tocEleHeight > tocEleBottom) { + tocEle.style.transformOrigin = `right ${tocEleHeight - tocEleBottom - btData.height / 2}px` + } + + tocEle.classList.toggle('open') + tocEle.addEventListener('transitionend', () => { + tocEle.style.cssText = '' + }, { once: true }) + }, + 'chat-btn': () => { // Show chat + window.chatBtnFn() + }, + translateLink: () => { // switch between traditional and simplified chinese + window.translateFn.translatePage() + } + } + + document.getElementById('rightside').addEventListener('click', e => { + const $target = e.target.closest('[id]') + if ($target && rightSideFn[$target.id]) { + rightSideFn[$target.id](e.currentTarget, $target) + } + }) + + /** + * menu + * 側邊欄sub-menu 展開/收縮 + */ + const clickFnOfSubMenu = () => { + const handleClickOfSubMenu = e => { + const target = e.target.closest('.site-page.group') + if (!target) return + target.classList.toggle('hide') + } + + const menusItems = document.querySelector('#sidebar-menus .menus_items') + menusItems && menusItems.addEventListener('click', handleClickOfSubMenu) + } + + /** + * 手机端目录点击 + */ + const openMobileMenu = () => { + const toggleMenu = document.getElementById('toggle-menu') + if (!toggleMenu) return + btf.addEventListenerPjax(toggleMenu, 'click', () => { sidebarFn.open() }) + } + + /** + * 複製時加上版權信息 + */ + const addCopyright = () => { + const { limitCount, languages } = GLOBAL_CONFIG.copyright + + const handleCopy = (e) => { + e.preventDefault() + const copyFont = window.getSelection(0).toString() + let textFont = copyFont + if (copyFont.length > limitCount) { + textFont = `${copyFont}\n\n\n${languages.author}\n${languages.link}${window.location.href}\n${languages.source}\n${languages.info}` + } + if (e.clipboardData) { + return e.clipboardData.setData('text', textFont) + } else { + return window.clipboardData.setData('text', textFont) + } + } + + document.body.addEventListener('copy', handleCopy) + } + + /** + * 網頁運行時間 + */ + const addRuntime = () => { + const $runtimeCount = document.getElementById('runtimeshow') + if ($runtimeCount) { + const publishDate = $runtimeCount.getAttribute('data-publishDate') + $runtimeCount.textContent = `${btf.diffDate(publishDate)} ${GLOBAL_CONFIG.runtime}` + } + } + + /** + * 最後一次更新時間 + */ + const addLastPushDate = () => { + const $lastPushDateItem = document.getElementById('last-push-date') + if ($lastPushDateItem) { + const lastPushDate = $lastPushDateItem.getAttribute('data-lastPushDate') + $lastPushDateItem.textContent = btf.diffDate(lastPushDate, true) + } + } + + /** + * table overflow + */ + const addTableWrap = () => { + const $table = document.querySelectorAll('#article-container table') + if (!$table.length) return + + $table.forEach(item => { + if (!item.closest('.highlight')) { + btf.wrap(item, 'div', { class: 'table-wrap' }) + } + }) + } + + /** + * tag-hide + */ + const clickFnOfTagHide = () => { + const hideButtons = document.querySelectorAll('#article-container .hide-button') + if (!hideButtons.length) return + hideButtons.forEach(item => item.addEventListener('click', e => { + const currentTarget = e.currentTarget + currentTarget.classList.add('open') + addJustifiedGallery(currentTarget.nextElementSibling.querySelectorAll('.gallery-container')) + }, { once: true })) + } + + const tabsFn = () => { + const navTabsElements = document.querySelectorAll('#article-container .tabs') + if (!navTabsElements.length) return + + const setActiveClass = (elements, activeIndex) => { + elements.forEach((el, index) => { + el.classList.toggle('active', index === activeIndex) + }) + } + + const handleNavClick = e => { + const target = e.target.closest('button') + if (!target || target.classList.contains('active')) return + + const navItems = [...e.currentTarget.children] + const tabContents = [...e.currentTarget.nextElementSibling.children] + const indexOfButton = navItems.indexOf(target) + setActiveClass(navItems, indexOfButton) + e.currentTarget.classList.remove('no-default') + setActiveClass(tabContents, indexOfButton) + addJustifiedGallery(tabContents[indexOfButton].querySelectorAll('.gallery-container'), true) + } + + const handleToTopClick = tabElement => e => { + if (e.target.closest('button')) { + btf.scrollToDest(btf.getEleTop(tabElement), 300) + } + } + + navTabsElements.forEach(tabElement => { + btf.addEventListenerPjax(tabElement.firstElementChild, 'click', handleNavClick) + btf.addEventListenerPjax(tabElement.lastElementChild, 'click', handleToTopClick(tabElement)) + }) + } + + const toggleCardCategory = () => { + const cardCategory = document.querySelector('#aside-cat-list.expandBtn') + if (!cardCategory) return + + const handleToggleBtn = e => { + const target = e.target + if (target.nodeName === 'I') { + e.preventDefault() + target.parentNode.classList.toggle('expand') + } + } + btf.addEventListenerPjax(cardCategory, 'click', handleToggleBtn, true) + } + + const addPostOutdateNotice = () => { + const ele = document.getElementById('post-outdate-notice') + if (!ele) return + + const { limitDay, messagePrev, messageNext, postUpdate } = JSON.parse(ele.getAttribute('data')) + const diffDay = btf.diffDate(postUpdate) + if (diffDay >= limitDay) { + ele.textContent = `${messagePrev} ${diffDay} ${messageNext}` + ele.hidden = false + } + } + + const lazyloadImg = () => { + window.lazyLoadInstance = new LazyLoad({ + elements_selector: 'img', + threshold: 0, + data_src: 'lazy-src' + }) + + btf.addGlobalFn('pjaxComplete', () => { + window.lazyLoadInstance.update() + }, 'lazyload') + } + + const relativeDate = selector => { + selector.forEach(item => { + item.textContent = btf.diffDate(item.getAttribute('datetime'), true) + item.style.display = 'inline' + }) + } + + const justifiedIndexPostUI = () => { + const recentPostsElement = document.getElementById('recent-posts') + if (!(recentPostsElement && recentPostsElement.classList.contains('masonry'))) return + + const init = () => { + const masonryItem = new InfiniteGrid.MasonryInfiniteGrid('.recent-post-items', { + gap: { horizontal: 10, vertical: 20 }, + useTransform: true, + useResizeObserver: true + }) + masonryItem.renderItems() + btf.addGlobalFn('pjaxCompleteOnce', () => { masonryItem.destroy() }, 'removeJustifiedIndexPostUI') + } + + typeof InfiniteGrid === 'function' ? init() : btf.getScript(`${GLOBAL_CONFIG.infinitegrid.js}`).then(init) + } + + const unRefreshFn = () => { + window.addEventListener('resize', () => { + adjustMenu(false) + mobileSidebarOpen && btf.isHidden(document.getElementById('toggle-menu')) && sidebarFn.close() + }) + + const menuMask = document.getElementById('menu-mask') + menuMask && menuMask.addEventListener('click', () => { sidebarFn.close() }) + + clickFnOfSubMenu() + GLOBAL_CONFIG.islazyloadPlugin && lazyloadImg() + GLOBAL_CONFIG.copyright !== undefined && addCopyright() + + if (GLOBAL_CONFIG.autoDarkmode) { + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => { + if (btf.saveToLocal.get('theme') !== undefined) return + e.matches ? handleThemeChange('dark') : handleThemeChange('light') + }) + } + } + + const forPostFn = () => { + addHighlightTool() + addPhotoFigcaption() + addJustifiedGallery(document.querySelectorAll('#article-container .gallery-container')) + runLightbox() + scrollFnToDo() + addTableWrap() + clickFnOfTagHide() + tabsFn() + } + + const refreshFn = () => { + initAdjust() + justifiedIndexPostUI() + + if (GLOBAL_CONFIG_SITE.pageType === 'post') { + addPostOutdateNotice() + GLOBAL_CONFIG.relativeDate.post && relativeDate(document.querySelectorAll('#post-meta time')) + } else { + GLOBAL_CONFIG.relativeDate.homepage && relativeDate(document.querySelectorAll('#recent-posts time')) + GLOBAL_CONFIG.runtime && addRuntime() + addLastPushDate() + toggleCardCategory() + } + + GLOBAL_CONFIG_SITE.pageType === 'home' && scrollDownInIndex() + scrollFn() + + forPostFn() + GLOBAL_CONFIG_SITE.pageType !== 'shuoshuo' && btf.switchComments(document) + openMobileMenu() + } + + btf.addGlobalFn('pjaxComplete', refreshFn, 'refreshFn') + refreshFn() + unRefreshFn() + + // 處理 hexo-blog-encrypt 事件 + window.addEventListener('hexo-blog-decrypt', e => { + forPostFn() + window.translateFn.translateInitialization() + Object.values(window.globalFn.encrypt).forEach(fn => { + fn() + }) + }) +}) diff --git a/js/search/algolia.js b/js/search/algolia.js new file mode 100644 index 000000000..8624f52f9 --- /dev/null +++ b/js/search/algolia.js @@ -0,0 +1,174 @@ +window.addEventListener('load', () => { + const { algolia } = GLOBAL_CONFIG + const { appId, apiKey, indexName, hitsPerPage = 5, languages } = algolia + + if (!appId || !apiKey || !indexName) { + return console.error('Algolia setting is invalid!') + } + + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#algolia-search .search-dialog') + + const animateElements = show => { + const action = show ? 'animateIn' : 'animateOut' + const maskAnimation = show ? 'to_show 0.5s' : 'to_hide 0.5s' + const dialogAnimation = show ? 'titleScale 0.5s' : 'search_close .5s' + btf[action]($searchMask, maskAnimation) + btf[action]($searchDialog, dialogAnimation) + } + + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', `${window.innerHeight}px`) + } + } + + const openSearch = () => { + btf.overflowPaddingR.add() + animateElements(true) + setTimeout(() => { document.querySelector('#algolia-search .ais-SearchBox-input').focus() }, 100) + + const handleEscape = event => { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', handleEscape) + } + } + + document.addEventListener('keydown', handleEscape) + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + btf.overflowPaddingR.remove() + animateElements(false) + window.removeEventListener('resize', fixSafariHeight) + } + + const searchClickFn = () => { + btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) + } + + const searchFnOnce = () => { + $searchMask.addEventListener('click', closeSearch) + document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch) + } + + const cutContent = (content) => { + if (!content) return '' + const firstOccur = content.indexOf('') + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + return `${pre}${content.substring(start, end)}${post}` + } + + const disableDiv = [ + document.getElementById('algolia-hits'), + document.getElementById('algolia-pagination'), + document.querySelector('#algolia-info .algolia-stats') + ] + + const searchClient = typeof algoliasearch === 'function' ? algoliasearch : window['algoliasearch/lite'].liteClient + const search = instantsearch({ + indexName, + searchClient: searchClient(appId, apiKey), + searchFunction (helper) { + disableDiv.forEach(item => { + item.style.display = helper.state.query ? '' : 'none' + }) + if (helper.state.query) helper.search() + } + }) + + const widgets = [ + instantsearch.widgets.configure({ hitsPerPage }), + instantsearch.widgets.searchBox({ + container: '#algolia-search-input', + showReset: false, + showSubmit: false, + placeholder: languages.input_placeholder, + showLoadingIndicator: true + }), + instantsearch.widgets.hits({ + container: '#algolia-hits', + templates: { + item (data) { + const link = data.permalink || (GLOBAL_CONFIG.root + data.path) + const result = data._highlightResult + const content = result.contentStripTruncate + ? cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? cutContent(result.contentStrip.value) + : result.content + ? cutContent(result.content.value) + : '' + return ` + + ${result.title.value || 'no-title'} + ${content ? `
    ${content}
    ` : ''} +
    ` + }, + empty (data) { + return `
    ${languages.hits_empty.replace(/\$\{query}/, data.query)}
    ` + } + } + }), + instantsearch.widgets.stats({ + container: '#algolia-info > .algolia-stats', + templates: { + text (data) { + const stats = languages.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return `
    ${stats}` + } + } + }), + instantsearch.widgets.poweredBy({ + container: '#algolia-info > .algolia-poweredBy' + }), + instantsearch.widgets.pagination({ + container: '#algolia-pagination', + totalPages: 5, + templates: { + first: '', + last: '', + previous: '', + next: '' + } + }) + ] + + search.addWidgets(widgets) + search.start() + searchClickFn() + searchFnOnce() + + window.addEventListener('pjax:complete', () => { + if (!btf.isHidden($searchMask)) closeSearch() + searchClickFn() + }) + + if (window.pjax) { + search.on('render', () => { + window.pjax.refresh(document.getElementById('algolia-hits')) + }) + } +}) diff --git a/js/search/local-search.js b/js/search/local-search.js new file mode 100644 index 000000000..1d3f26872 --- /dev/null +++ b/js/search/local-search.js @@ -0,0 +1,360 @@ +/** + * Refer to hexo-generator-searchdb + * https://github.com/next-theme/hexo-generator-searchdb/blob/main/dist/search.js + * Modified by hexo-theme-butterfly + */ + +class LocalSearch { + constructor ({ + path = '', + unescape = false, + top_n_per_article = 1 + }) { + this.path = path + this.unescape = unescape + this.top_n_per_article = top_n_per_article + this.isfetched = false + this.datas = null + } + + getIndexByWord (words, text, caseSensitive = false) { + const index = [] + const included = new Set() + + if (!caseSensitive) { + text = text.toLowerCase() + } + words.forEach(word => { + if (this.unescape) { + const div = document.createElement('div') + div.innerText = word + word = div.innerHTML + } + const wordLen = word.length + if (wordLen === 0) return + let startPosition = 0 + let position = -1 + if (!caseSensitive) { + word = word.toLowerCase() + } + while ((position = text.indexOf(word, startPosition)) > -1) { + index.push({ position, word }) + included.add(word) + startPosition = position + wordLen + } + }) + // Sort index by position of keyword + index.sort((left, right) => { + if (left.position !== right.position) { + return left.position - right.position + } + return right.word.length - left.word.length + }) + return [index, included] + } + + // Merge hits into slices + mergeIntoSlice (start, end, index) { + let item = index[0] + let { position, word } = item + const hits = [] + const count = new Set() + while (position + word.length <= end && index.length !== 0) { + count.add(word) + hits.push({ + position, + length: word.length + }) + const wordEnd = position + word.length + + // Move to next position of hit + index.shift() + while (index.length !== 0) { + item = index[0] + position = item.position + word = item.word + if (wordEnd > position) { + index.shift() + } else { + break + } + } + } + return { + hits, + start, + end, + count: count.size + } + } + + // Highlight title and content + highlightKeyword (val, slice) { + let result = '' + let index = slice.start + for (const { position, length } of slice.hits) { + result += val.substring(index, position) + index = position + length + result += `${val.substr(position, length)}` + } + result += val.substring(index, slice.end) + return result + } + + getResultItems (keywords) { + const resultItems = [] + this.datas.forEach(({ title, content, url }) => { + // The number of different keywords included in the article. + const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title) + const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content) + const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size + + // Show search results + const hitCount = indexOfTitle.length + indexOfContent.length + if (hitCount === 0) return + + const slicesOfTitle = [] + if (indexOfTitle.length !== 0) { + slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle)) + } + + let slicesOfContent = [] + while (indexOfContent.length !== 0) { + const item = indexOfContent[0] + const { position } = item + // Cut out 120 characters. The maxlength of .search-input is 80. + const start = Math.max(0, position - 20) + const end = Math.min(content.length, position + 100) + slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent)) + } + + // Sort slices in content by included keywords' count and hits' count + slicesOfContent.sort((left, right) => { + if (left.count !== right.count) { + return right.count - left.count + } else if (left.hits.length !== right.hits.length) { + return right.hits.length - left.hits.length + } + return left.start - right.start + }) + + // Select top N slices in content + const upperBound = parseInt(this.top_n_per_article, 10) + if (upperBound >= 0) { + slicesOfContent = slicesOfContent.slice(0, upperBound) + } + + let resultItem = '' + + url = new URL(url, location.origin) + url.searchParams.append('highlight', keywords.join(' ')) + + if (slicesOfTitle.length !== 0) { + resultItem += `
  • ${this.highlightKeyword(title, slicesOfTitle[0])}` + } else { + resultItem += `
  • ${title}` + } + + slicesOfContent.forEach(slice => { + resultItem += `

    ${this.highlightKeyword(content, slice)}...

    ` + }) + + resultItem += '
  • ' + resultItems.push({ + item: resultItem, + id: resultItems.length, + hitCount, + includedCount + }) + }) + return resultItems + } + + fetchData () { + const isXml = !this.path.endsWith('json') + fetch(this.path) + .then(response => response.text()) + .then(res => { + // Get the contents from search data + this.isfetched = true + this.datas = isXml + ? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({ + title: element.querySelector('title').textContent, + content: element.querySelector('content').textContent, + url: element.querySelector('url').textContent + })) + : JSON.parse(res) + // Only match articles with non-empty titles + this.datas = this.datas.filter(data => data.title).map(data => { + data.title = data.title.trim() + data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '' + data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/') + return data + }) + // Remove loading animation + window.dispatchEvent(new Event('search:loaded')) + }) + } + + // Highlight by wrapping node in mark elements with the given class name + highlightText (node, slice, className) { + const val = node.nodeValue + let index = slice.start + const children = [] + for (const { position, length } of slice.hits) { + const text = document.createTextNode(val.substring(index, position)) + index = position + length + const mark = document.createElement('mark') + mark.className = className + mark.appendChild(document.createTextNode(val.substr(position, length))) + children.push(text, mark) + } + node.nodeValue = val.substring(index, slice.end) + children.forEach(element => { + node.parentNode.insertBefore(element, node) + }) + } + + // Highlight the search words provided in the url in the text + highlightSearchWords (body) { + const params = new URL(location.href).searchParams.get('highlight') + const keywords = params ? params.split(' ') : [] + if (!keywords.length || !body) return + const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null) + const allNodes = [] + while (walk.nextNode()) { + if (!walk.currentNode.parentNode.matches('button, select, textarea, .mermaid')) allNodes.push(walk.currentNode) + } + allNodes.forEach(node => { + const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue) + if (!indexOfNode.length) return + const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode) + this.highlightText(node, slice, 'search-keyword') + }) + } +} + +window.addEventListener('load', () => { +// Search + const { path, top_n_per_article, unescape, languages } = GLOBAL_CONFIG.localSearch + const localSearch = new LocalSearch({ + path, + top_n_per_article, + unescape + }) + + const input = document.querySelector('#local-search-input input') + const statsItem = document.getElementById('local-search-stats-wrap') + const $loadingStatus = document.getElementById('loading-status') + const isXml = !path.endsWith('json') + + const inputEventFunction = () => { + if (!localSearch.isfetched) return + let searchText = input.value.trim().toLowerCase() + isXml && (searchText = searchText.replace(//g, '>')) + if (searchText !== '') $loadingStatus.innerHTML = '' + const keywords = searchText.split(/[-\s]+/) + const container = document.getElementById('local-search-results') + let resultItems = [] + if (searchText.length > 0) { + // Perform local searching + resultItems = localSearch.getResultItems(keywords) + } + if (keywords.length === 1 && keywords[0] === '') { + container.textContent = '' + statsItem.textContent = '' + } else if (resultItems.length === 0) { + container.textContent = '' + const statsDiv = document.createElement('div') + statsDiv.className = 'search-result-stats' + statsDiv.textContent = languages.hits_empty.replace(/\$\{query}/, searchText) + statsItem.innerHTML = statsDiv.outerHTML + } else { + resultItems.sort((left, right) => { + if (left.includedCount !== right.includedCount) { + return right.includedCount - left.includedCount + } else if (left.hitCount !== right.hitCount) { + return right.hitCount - left.hitCount + } + return right.id - left.id + }) + + const stats = languages.hits_stats.replace(/\$\{hits}/, resultItems.length) + + container.innerHTML = `
      ${resultItems.map(result => result.item).join('')}
    ` + statsItem.innerHTML = `
    ${stats}
    ` + window.pjax && window.pjax.refresh(container) + } + + $loadingStatus.textContent = '' + } + + let loadFlag = false + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#local-search .search-dialog') + + // fix safari + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') + } + } + + const openSearch = () => { + btf.overflowPaddingR.add() + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn($searchDialog, 'titleScale 0.5s') + setTimeout(() => { input.focus() }, 300) + if (!loadFlag) { + !localSearch.isfetched && localSearch.fetchData() + input.addEventListener('input', inputEventFunction) + loadFlag = true + } + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + btf.overflowPaddingR.remove() + btf.animateOut($searchDialog, 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + window.removeEventListener('resize', fixSafariHeight) + } + + const searchClickFn = () => { + btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) + } + + const searchFnOnce = () => { + document.querySelector('#local-search .search-close-button').addEventListener('click', closeSearch) + $searchMask.addEventListener('click', closeSearch) + if (GLOBAL_CONFIG.localSearch.preload) { + localSearch.fetchData() + } + localSearch.highlightSearchWords(document.getElementById('article-container')) + } + + window.addEventListener('search:loaded', () => { + const $loadDataItem = document.getElementById('loading-database') + $loadDataItem.nextElementSibling.style.display = 'block' + $loadDataItem.remove() + }) + + searchClickFn() + searchFnOnce() + + // pjax + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + localSearch.highlightSearchWords(document.getElementById('article-container')) + searchClickFn() + }) +}) diff --git a/js/tw_cn.js b/js/tw_cn.js new file mode 100644 index 000000000..c19d69cd9 --- /dev/null +++ b/js/tw_cn.js @@ -0,0 +1,117 @@ +document.addEventListener('DOMContentLoaded', () => { + const { defaultEncoding, translateDelay, msgToTraditionalChinese, msgToSimplifiedChinese } = GLOBAL_CONFIG.translate + const snackbarData = GLOBAL_CONFIG.Snackbar + const targetEncodingCookie = 'translate-chn-cht' + + let currentEncoding = defaultEncoding + let targetEncoding = Number(btf.saveToLocal.get(targetEncodingCookie)) || defaultEncoding + const translateButtonObject = document.getElementById('translateLink') + const isSnackbar = snackbarData !== undefined + + const setLang = () => { + document.documentElement.lang = targetEncoding === 1 ? 'zh-TW' : 'zh-CN' + } + + const translateText = (txt) => { + if (!txt) return '' + if (currentEncoding === 1 && targetEncoding === 2) return Simplized(txt) + if (currentEncoding === 2 && targetEncoding === 1) return Traditionalized(txt) + return txt + } + + const translateBody = (fobj) => { + const nodes = typeof fobj === 'object' ? fobj.childNodes : document.body.childNodes + + for (const node of nodes) { + // Skip BR, HR tags, or the translate button object + if (['BR', 'HR'].includes(node.tagName) || node === translateButtonObject) continue + + if (node.nodeType === Node.ELEMENT_NODE) { + const { tagName, title, alt, placeholder, value, type } = node + + // Translate title, alt, placeholder + if (title) node.title = translateText(title) + if (alt) node.alt = translateText(alt) + if (placeholder) node.placeholder = translateText(placeholder) + + // Translate input value except text and hidden types + if (tagName === 'INPUT' && value && type !== 'text' && type !== 'hidden') { + node.value = translateText(value) + } + + // Recursively translate child nodes + translateBody(node) + } else if (node.nodeType === Node.TEXT_NODE) { + // Translate text node data + node.data = translateText(node.data) + } + } + } + + const translatePage = () => { + if (targetEncoding === 1) { + currentEncoding = 1 + targetEncoding = 2 + translateButtonObject.textContent = msgToTraditionalChinese + isSnackbar && btf.snackbarShow(snackbarData.cht_to_chs) + } else if (targetEncoding === 2) { + currentEncoding = 2 + targetEncoding = 1 + translateButtonObject.textContent = msgToSimplifiedChinese + isSnackbar && btf.snackbarShow(snackbarData.chs_to_cht) + } + btf.saveToLocal.set(targetEncodingCookie, targetEncoding, 2) + setLang() + translateBody() + } + + const JTPYStr = () => '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾龙历志制一台皋准复猛钟注范签' + const FTPYStr = () => '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽龍歷誌製壹臺臯準復勐鐘註範籤' + + const Traditionalized = (cc) => { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) !== -1) { + str += tt.charAt(ss.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + const Simplized = (cc) => { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) !== -1) { + str += ss.charAt(tt.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + const translateInitialization = () => { + if (translateButtonObject) { + if (currentEncoding !== targetEncoding) { + translateButtonObject.textContent = + targetEncoding === 1 + ? msgToSimplifiedChinese + : msgToTraditionalChinese + setLang() + setTimeout(translateBody, translateDelay) + } + } + } + + window.translateFn = { + translatePage, + Traditionalized, + Simplized, + translateInitialization + } + + translateInitialization() + btf.addGlobalFn('pjaxComplete', translateInitialization, 'translateInitialization') +}) diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 000000000..48d8306d0 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,313 @@ +(() => { + const btfFn = { + debounce: (func, wait = 0, immediate = false) => { + let timeout + return (...args) => { + const later = () => { + timeout = null + if (!immediate) func(...args) + } + const callNow = immediate && !timeout + clearTimeout(timeout) + timeout = setTimeout(later, wait) + if (callNow) func(...args) + } + }, + + throttle: function (func, wait, options = {}) { + let timeout, context, args + let previous = 0 + + const later = () => { + previous = options.leading === false ? 0 : new Date().getTime() + timeout = null + func.apply(context, args) + if (!timeout) context = args = null + } + + const throttled = (...params) => { + const now = new Date().getTime() + if (!previous && options.leading === false) previous = now + const remaining = wait - (now - previous) + context = this + args = params + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout) + timeout = null + } + previous = now + func.apply(context, args) + if (!timeout) context = args = null + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining) + } + } + + return throttled + }, + + overflowPaddingR: { + add: () => { + const paddingRight = window.innerWidth - document.body.clientWidth + + if (paddingRight > 0) { + document.body.style.paddingRight = `${paddingRight}px` + document.body.style.overflow = 'hidden' + const menuElement = document.querySelector('#page-header.nav-fixed #menus') + if (menuElement) { + menuElement.style.paddingRight = `${paddingRight}px` + } + } + }, + remove: () => { + document.body.style.paddingRight = '' + document.body.style.overflow = '' + const menuElement = document.querySelector('#page-header.nav-fixed #menus') + if (menuElement) { + menuElement.style.paddingRight = '' + } + } + }, + + snackbarShow: (text, showAction = false, duration = 2000) => { + const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar + const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark + Snackbar.show({ + text, + backgroundColor: bg, + showAction, + duration, + pos: position, + customClass: 'snackbar-css' + }) + }, + + diffDate: (inputDate, more = false) => { + const dateNow = new Date() + const datePost = new Date(inputDate) + const diffMs = dateNow - datePost + const diffSec = diffMs / 1000 + const diffMin = diffSec / 60 + const diffHour = diffMin / 60 + const diffDay = diffHour / 24 + const diffMonth = diffDay / 30 + const { dateSuffix } = GLOBAL_CONFIG + + if (!more) return Math.floor(diffDay) + + if (diffMonth > 12) return datePost.toISOString().slice(0, 10) + if (diffMonth >= 1) return `${Math.floor(diffMonth)} ${dateSuffix.month}` + if (diffDay >= 1) return `${Math.floor(diffDay)} ${dateSuffix.day}` + if (diffHour >= 1) return `${Math.floor(diffHour)} ${dateSuffix.hour}` + if (diffMin >= 1) return `${Math.floor(diffMin)} ${dateSuffix.min}` + return dateSuffix.just + }, + + loadComment: (dom, callback) => { + if ('IntersectionObserver' in window) { + const observerItem = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + callback() + observerItem.disconnect() + } + }, { threshold: [0] }) + observerItem.observe(dom) + } else { + callback() + } + }, + + scrollToDest: (pos, time = 500) => { + const currentPos = window.scrollY + const isNavFixed = document.getElementById('page-header').classList.contains('fixed') + if (currentPos > pos || isNavFixed) pos = pos - 70 + + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + top: pos, + behavior: 'smooth' + }) + return + } + + const startTime = performance.now() + const animate = currentTime => { + const timeElapsed = currentTime - startTime + const progress = Math.min(timeElapsed / time, 1) + window.scrollTo(0, currentPos + (pos - currentPos) * progress) + if (progress < 1) { + requestAnimationFrame(animate) + } + } + requestAnimationFrame(animate) + }, + + animateIn: (ele, animation) => { + ele.style.display = 'block' + ele.style.animation = animation + }, + + animateOut: (ele, animation) => { + const handleAnimationEnd = () => { + ele.style.display = '' + ele.style.animation = '' + ele.removeEventListener('animationend', handleAnimationEnd) + } + ele.addEventListener('animationend', handleAnimationEnd) + ele.style.animation = animation + }, + + wrap: (selector, eleType, options) => { + const createEle = document.createElement(eleType) + for (const [key, value] of Object.entries(options)) { + createEle.setAttribute(key, value) + } + selector.parentNode.insertBefore(createEle, selector) + createEle.appendChild(selector) + }, + + isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0, + + getEleTop: ele => { + let actualTop = ele.offsetTop + let current = ele.offsetParent + + while (current !== null) { + actualTop += current.offsetTop + current = current.offsetParent + } + + return actualTop + }, + + loadLightbox: ele => { + const service = GLOBAL_CONFIG.lightbox + + if (service === 'medium_zoom') { + mediumZoom(ele, { background: 'var(--zoom-bg)' }) + } + + if (service === 'fancybox') { + Array.from(ele).forEach(i => { + if (i.parentNode.tagName !== 'A') { + const dataSrc = i.dataset.lazySrc || i.src + const dataCaption = i.title || i.alt || '' + btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc }) + } + }) + + if (!window.fancyboxRun) { + Fancybox.bind('[data-fancybox]', { + Hash: false, + Thumbs: { + showOnStart: false + }, + Images: { + Panzoom: { + maxScale: 4 + } + }, + Carousel: { + transition: 'slide' + }, + Toolbar: { + display: { + left: ['infobar'], + middle: [ + 'zoomIn', + 'zoomOut', + 'toggle1to1', + 'rotateCCW', + 'rotateCW', + 'flipX', + 'flipY' + ], + right: ['slideshow', 'thumbs', 'close'] + } + } + }) + window.fancyboxRun = true + } + } + }, + + setLoading: { + add: ele => { + const html = ` +
    +
    +
    +
    +
    + ` + ele.insertAdjacentHTML('afterend', html) + }, + remove: ele => { + ele.nextElementSibling.remove() + } + }, + + updateAnchor: anchor => { + if (anchor !== window.location.hash) { + if (!anchor) anchor = location.pathname + const title = GLOBAL_CONFIG_SITE.title + window.history.replaceState({ + url: location.href, + title + }, title, anchor) + } + }, + + getScrollPercent: (() => { + let docHeight, winHeight, headerHeight, contentMath + + return (currentTop, ele) => { + if (!docHeight || ele.clientHeight !== docHeight) { + docHeight = ele.clientHeight + winHeight = window.innerHeight + headerHeight = ele.offsetTop + contentMath = Math.max(docHeight - winHeight, document.documentElement.scrollHeight - winHeight) + } + + const scrollPercent = (currentTop - headerHeight) / contentMath + return Math.max(0, Math.min(100, Math.round(scrollPercent * 100))) + } + })(), + + addEventListenerPjax: (ele, event, fn, option = false) => { + ele.addEventListener(event, fn, option) + btf.addGlobalFn('pjaxSendOnce', () => { + ele.removeEventListener(event, fn, option) + }) + }, + + removeGlobalFnEvent: (key, parent = window) => { + const globalFn = parent.globalFn || {} + const keyObj = globalFn[key] + if (!keyObj) return + + Object.keys(keyObj).forEach(i => keyObj[i]()) + + delete globalFn[key] + }, + + switchComments: (el = document, path) => { + const switchBtn = el.querySelector('#switch-btn') + if (!switchBtn) return + + let switchDone = false + const postComment = el.querySelector('#post-comment') + const handleSwitchBtn = () => { + postComment.classList.toggle('move') + if (!switchDone && typeof loadOtherComment === 'function') { + switchDone = true + loadOtherComment(el, path) + } + } + btf.addEventListenerPjax(switchBtn, 'click', handleSwitchBtn) + } + } + + window.btf = { ...window.btf, ...btfFn } +})() diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 000000000..04ed4e04b --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,237 @@ +淳淳同学的个人博客 - 人不可一日无事 + + + + + + + + + +
    linear-gradient函数实现线性渐变
    navigator.userAgent获取当前设备信息
    实现输入框的n种形式
    viewerjs查看大图组件
    修改element-ui的全局配置
    安卓微信浏览器中type=file的input框无法使用
    copy-webpack-plugin处理单独js文件
    vue3的生命周期钩子
    git仓库推送脚本(本地简易版)
    qiankun的css样式污染解决方案
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 000000000..126e5587b --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,237 @@ +淳淳同学的个人博客 - 人不可一日无事 + + + + + + + + + +
    GitHub Corners
    git贡献墙 gitcalendar
    Mac配置多个SSH-Key
    node打包内存溢出
    git推送后没有贡献记录
    jsdelivr
    中央事件总线插件vue-bus-ts
    qiankun 2.0.24 爬坑记录
    2020前端面试
    你不知道的JavaScript(上卷)
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 000000000..a6e637278 --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,237 @@ +淳淳同学的个人博客 - 人不可一日无事 + + + + + + + + + +
    Ubuntu 16.04 部署命令
    LeetCode常见题
    《前端内参》读书笔记
    前端个人学习笔记与项目规范
    程序员进修文档
    js-md5
    从0开始搭建Hexo个人博客
    \ No newline at end of file diff --git a/resume/index.html b/resume/index.html new file mode 100644 index 000000000..e62e7a995 --- /dev/null +++ b/resume/index.html @@ -0,0 +1,392 @@ +个人简历 | 淳淳同学的个人博客 + + + + + + + + + + + +

    壹。 自我介绍

    个人信息

      +
    • 头像:
    • +
    • 个人头像
    • +
    • 姓名:李淳淳
    • +
    • 求职意向:前端开发想转全栈开发(对大数据、人工智能感兴趣)
    • +
    • 联系方式:15610045821
    • +
    • 电子邮箱:961150665@qq.com
    • +
    • 个人博客:淳淳同学的个人博客
    • +
    +

    技能掌握

      +
    • 熟练运用:vue2.x、vue3.x、Element Plus、Vuex、Vue-Router、…
    • +
    • 灵活使用:Webpack、qiankun、TypeScript、Vite、Bus、微信小程序…
    • +
    • 额外了解:Electron、Django + Restful Api、Taro、Uni-App、…
    • +
    +

    教育经历

      +
    • 专业硕士研究生(非全日制),青岛大学(2018.9-2021.7),计算机技术;
    • +
    • 本科,青岛理工大学(2014.9-2018.7),网络工程;
    • +
    +

    个人评价

      +
    • 坚持6年相声演出;坚持3年每天写日记;
    • +
    • 喜欢研究阅读源码;喜欢对新技术落地实施;
    • +
    • 细节把握成败;勇于犯错且敢于承担责任;
    • +
    • 性格外向开朗;善于团队合作;
    • +
    +

    贰。 项目详细介绍

    V7联络云 - 访客端(PC + H5)

    从2020-12-01至今历时7个月,已迭代至V3.4.2版本。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gantt

    title 进度周期(甘特图)
    dateFormat YYYY-MM-DD

    section 业务逻辑
    需求评审 :a1, 2020-12-01, 20d
    V1.0 :a2, 2020-12-22, 66d
    V2.0 :a3, 2021-03-01, 45d
    V3.0 :a4, 2021-04-18, 70d
    + +

    介绍

    打造一款更轻便的消息渲染器,让客户仅需要添加一段script代码即可为自己的网站提供智能在线客服的能力(手机官网、app、小程序等跳转H5链接即可)。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 技术栈(无任何UI框架)
    "axios": "0.21.0",
    "qiniu-js": "3.1.2",
    "socket.io-client": "2.3.0",
    "v3-carousel": "1.1.1", // 自己封装并发布npm的开源轮播组件
    "vue": "3.0.4",
    "vue-i18n": "9.0.0-beta.15",
    "vuex": "4.0.0-rc.2",
    "xss": "1.0.8",
    "crypto-js": "4.0.0",
    "stylus": "0.54.7",
    "typescript": "4.1.3",
    "vite": "2.3.4",
    + +

    功能

      +
    • 自动邀请框:首次自动弹出、关闭后n秒重新弹出、配置可弹出时机、快捷咨询发起会话、自定义样式、缩小后未读消息提示等
    • +
    • 机器人流程:联想输入、快捷回复按钮、有无帮助、关键词及按钮转人工等
    • +
    • 人工咨询流程:文本消息、富文本消息、emoji表情、文件图片视频、满意度评价(主动、被动、结束会话)、粘贴图片即发送、发送loading与失败重发、已读未读、发送消息节流、会话转接等
    • +
    • 留言流程:表单留言、文本消息留言等
    • +
    • 自定义主题色、自定义弹窗及咨询按钮位置、会话流程日志打印等
    • +
    • 多处轮播广告栏、首次广告语推送、自定义图片视频、iframe嵌入等
    • +
    • 刷新页面记忆流程节点、socket心跳检测及意外断开重连、消息时序问题、多端登录互踢等
    • +
    +

    亮点

      +
    • 多入口打包,同时兼容PCH5的方式打开
    • +
    • 更完善的流程与状态管理,可拖拽的配置方式,客户可自由搭配
    • +
    • 智能引导菜单、机器人、人工、留言、广告推送等多种留资方式
    • +
    • 多种自定义样式模板:pc模板、h5模板、广告模板、小程序模板
    • +
    • 配置信息、聊天内容、socket推送等敏感信息用crypto-js加密
    • +
    +

    难点

      +
    • 首次从〇开始初始化 vue3 + ts 项目
    • +
    • 项目多入口打包方式的构思与实现
    • +
    • socket 的事件推送与处理维护机制
    • +
    • emoji 表情采用雪碧图(精灵图)的形式展示
    • +
    • 消息列表渲染、消息类型区分、列表滚动机制
    • +
    • 移动端兼容问题(键盘遮挡、hover样式不消失等)
    • +
    • 客户页与iframe内部通过postMessage事件通信
    • +
    • 前端用sendStatus字段维护消息的状态
    • +
    • 使用xssFilterXSS方法进行消息过滤
    • +
    • 把富文本消息要绑定的函数挂载到window上即可调用
    • +
    • IOS上点击输入框会被弹起的键盘遮挡住
    • +
    • IOS上不支持直接使用transparent透明属性
    • +
    • Android微信浏览器,点击type=fileinput框选取文件会报错
    • +
    • 手机端上元素点击后:hover样式不会自动消失
    • +
    • 图片加载小图、预加载骨架
    • +
    +
    +

    V7联络云 - 访客端(微信小程序插件)

    1
    2
    3
    4
    5
    6
    7
    8
    gantt

    title 进度周期(甘特图)
    dateFormat YYYY-MM-DD

    section 业务逻辑
    需求评审 :a1, 2021-05-20, 12d
    V1.0 :a2, 2021-06-01, 30d
    + +

    介绍

    将访客端以插件的形式移至微信小程序内,宿主(即插件调用者)仅需使用插件版本号与插件开发者的AppId即可实现智能客服能力。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 技术栈:
    "@vant/weapp": "1.0.0",
    "crypto-js": "4.0.0",
    "miniprogram-api-promise": "1.0.4",
    "miniprogram-computed": "4.0.4",
    "mobx-miniprogram": "4.13.2",
    "mobx-miniprogram-bindings": "1.2.1",
    "mp-html": "2.1.3",
    "weapp.socket.io": "2.1.0"
    + +

    功能

      +
    • 大部分功能同h5访客端
    • +
    • 座席端的样式配置、基座小程序的功能配置
    • +
    • Emm…
    • +
    +

    亮点

      +
    • Emm…
    • +
    +

    难点

      +
    • uni-app ==> mp-vue ==> wepy ==> taro/cli ==> 原生 + npm
    • +
    • 宿主与插件的事件交互机制问题(宿主直接调用插件函数,传参数或回调函数)
    • +
    • 更新mobx中的引用类型数据后,无法触发视图更新(list=list,obj=Object.assign(obj, obj1))
    • +
    • 在js文件中的非Component模块中以及mobx中,无法获取dom节点(使用scroll-view的scroll-top属性代替手动滚动行为,定义一个超大数值COUNT++)
    • +
    • 不能出现文件循环引用的问题(缺点即:无法将mobx模块化)
    • +
    • socket没有自带的心跳检测(需要配合计时器手动监听)
    • +
    • 没有style标签的概念,无法创建全局样式(只能通过mobx进行数据绑定)
    • +
    • 微信开发者工具的BUG:wxml没有a标签、wxss不能穿透、在插件内调用宿主的路由跳转api报错、text标签内不能换行、插件内不能使用webview_App({})_getApp()方法
    • +
    +
    +

    V7联络云

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gantt

    title 进度周期(甘特图)
    dateFormat YYYY-MM-DD

    section 业务逻辑
    需求评审 :a1, 2020-11-01, 50d
    V1.0 :a2, 2020-12-22, 66d
    V2.0 :a3, 2021-03-01, 45d
    V3.0 :a4, 2021-04-18, 70d
    + +

    介绍

    采用蚂蚁金融科技提供的 qiankun 微前端框架,将我司现有的 零代码平台 产品 Mopower 嵌入到新开发的 V7联络云 中,实现客户与工单模块的表单配置、用户角色的权限配置、以及客户的关联与应用等功能。

    +

    功能

      +
    • 通话模块和在线客服模块,以及相对应的数据报表中心
    • +
    • 客户模块和工单模块,以及相对应的表单配置模块
    • +
    • 消息中心模块,全局的接入、转接、下载、导入导出的提示
    • +
    • 知识库模块,为在线客服提供更多智能话术模板
    • +
    • OEM自定义域名配置及相关私密信息脱敏
    • +
    +

    亮点

      +
    • qiankun框架的应用解决了iframe的跳转与数据交互的痛点
    • +
    • 使用qiankun微前端框架嵌入其他子应用,并将自身作为子应用嵌入其他基座
    • +
    • 封装vue-router,根据接口数据动态生成路由,且可使用多个字段进行权限控制
    • +
    +

    难点

      +
    • 基座与子应用之间的样式污染问题,特别是子应用插入到基座Body中的Dom元素(采用BEM命名规范的思想与postcss命名空间插件共同解决)。在不开沙箱的情况下使用postcss的插件解决css样式污染和iconfont冲突问题
    • +
    • 使用 bus + keep-alive + vue生命周期 封装qiankun的子应用组件
    • +
    +
    +

    七陌官网重构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gantt

    title 进度周期(甘特图)
    dateFormat YYYY-MM-DD

    section 业务逻辑
    需求评审 :a1, 2020-11-09, 38d
    V2.0 :a2, 2020-12-18, 53d
    V2.1 :a3, 2021-02-20, 25d
    V2.2 :a4, 2021-04-10, 33d
    + +

    介绍

    由于容联集团于 2021年02月09日 赴美上市,所以对容联七陌的 PC端官网移动端官网 进行代码重构及新页面的改版。

    +

    功能

      +
    • 使用 vue-router 进行路由改版
    • +
    • 引入 gio 埋点
    • +
    +

    亮点

    +

    难点

      +
    • @import引入的css不走px3rem-loaders,改为src的引入形式
      1
      2
      3
      4
      - <style scoped>
      - @import './indexStyle.css';
      + <style scoped src="../../assets/css/indexStyle.css">
      </style>
      + + +
    • +
    +

    叁。 模拟问答

    负责过什么项目,以及在每个项目中的职责?

    答:

    +
      +
    • 七陌专注于做企业通信领域的SAAS云服务提供商,是一家提供智能客服解决方案的。
    • +
    • 虽然我入职仅一年,但已经独立完整的负责过两个项目:
        +
      • 一个是智能客服的访客端,分别打包成js接入和h5链接的形式;
      • +
      • 另一个项目也是访客端,是把现有的访客端开发成原生小程序插件的形式(也就是SDK的形式);
      • +
      +
    • +
    • 还有客服座席端的客户、工单等模块,采用qiankun微前端框架嵌入了子项目的重要模块;
    • +
    • 还有pc端和wap端七陌官网的重构;
    • +
    +

    遇到过什么困难的问题,以及解决方案?

    答:

    +
      +
    • webpack多入口打包
    • +
    • 访客端ui高度自定义化
    • +
    • qiankun样式污染问题
    • +
    • 消息列表渲染,滚动时机
    • +
    • 利用雪碧图做emoji表情墙
    • +
    • 小程序宿主与插件的事件交互
    • +
    • vue3 + ts 学习成本
    • +
    +

    平时如何学习?如何做到 WLB ?

    答:

    +
      +
    • 白天认真工作,工作才是第一生产力
    • +
    • 晚上总结输出,只有多产出才能记住
    • +
    • 平时多交流沟通,每个月会做1-2次技术分享
    • +
    • 定时更新博客,记录学到的内容并学会总结分享
    • +
    +

    肆。 备注

    写点儿啥呢。。。

    +
    \ No newline at end of file diff --git a/tags/CSS/index.html b/tags/CSS/index.html new file mode 100644 index 000000000..21ea8d538 --- /dev/null +++ b/tags/CSS/index.html @@ -0,0 +1,237 @@ +Tag: CSS | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html new file mode 100644 index 000000000..99b79166b --- /dev/null +++ b/tags/Git/index.html @@ -0,0 +1,237 @@ +Tag: Git | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html new file mode 100644 index 000000000..66503a573 --- /dev/null +++ b/tags/JavaScript/index.html @@ -0,0 +1,237 @@ +Tag: JavaScript | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/LeetCode/index.html b/tags/LeetCode/index.html new file mode 100644 index 000000000..44fa5e53a --- /dev/null +++ b/tags/LeetCode/index.html @@ -0,0 +1,237 @@ +Tag: LeetCode | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/Socket/index.html b/tags/Socket/index.html new file mode 100644 index 000000000..a6e6d80a4 --- /dev/null +++ b/tags/Socket/index.html @@ -0,0 +1,237 @@ +Tag: Socket | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/VSCode/index.html b/tags/VSCode/index.html new file mode 100644 index 000000000..dd0e3ad44 --- /dev/null +++ b/tags/VSCode/index.html @@ -0,0 +1,237 @@ +Tag: VSCode | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/Vue/index.html b/tags/Vue/index.html new file mode 100644 index 000000000..1cba101ea --- /dev/null +++ b/tags/Vue/index.html @@ -0,0 +1,237 @@ +Tag: Vue | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/Webpack/index.html b/tags/Webpack/index.html new file mode 100644 index 000000000..2ea2f4054 --- /dev/null +++ b/tags/Webpack/index.html @@ -0,0 +1,237 @@ +Tag: Webpack | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..41089a073 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,239 @@ +标签 | 淳淳同学的个人博客 + + + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/npm/index.html b/tags/npm/index.html new file mode 100644 index 000000000..1cb77d75f --- /dev/null +++ b/tags/npm/index.html @@ -0,0 +1,237 @@ +Tag: npm | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" new file mode 100644 index 000000000..e6dab2da1 --- /dev/null +++ "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -0,0 +1,237 @@ +Tag: 个人文档 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\276\256\345\211\215\347\253\257/index.html" "b/tags/\345\276\256\345\211\215\347\253\257/index.html" new file mode 100644 index 000000000..799ef48c3 --- /dev/null +++ "b/tags/\345\276\256\345\211\215\347\253\257/index.html" @@ -0,0 +1,237 @@ +Tag: 微前端 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\234\215\345\212\241\345\231\250/index.html" "b/tags/\346\234\215\345\212\241\345\231\250/index.html" new file mode 100644 index 000000000..db18579d5 --- /dev/null +++ "b/tags/\346\234\215\345\212\241\345\231\250/index.html" @@ -0,0 +1,237 @@ +Tag: 服务器 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\247\273\345\212\250\347\253\257/index.html" "b/tags/\347\247\273\345\212\250\347\253\257/index.html" new file mode 100644 index 000000000..4ebe5cd3a --- /dev/null +++ "b/tags/\347\247\273\345\212\250\347\253\257/index.html" @@ -0,0 +1,237 @@ +Tag: 移动端 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" new file mode 100644 index 000000000..fde0c32d5 --- /dev/null +++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -0,0 +1,237 @@ +Tag: 读书笔记 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" new file mode 100644 index 000000000..268752baa --- /dev/null +++ "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" @@ -0,0 +1,237 @@ +Tag: 面试,Vue,JavaScript | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225/index.html" "b/tags/\351\235\242\350\257\225/index.html" new file mode 100644 index 000000000..8170b3be4 --- /dev/null +++ "b/tags/\351\235\242\350\257\225/index.html" @@ -0,0 +1,237 @@ +Tag: 面试 | 淳淳同学的个人博客 + + + + + + + + + +
    \ No newline at end of file From aa6cd41183e0aeb873bdc84427c98fb28937b52b Mon Sep 17 00:00:00 2001 From: Edan's Win11 <961150665@qq.com> Date: Mon, 30 Dec 2024 14:19:52 +0800 Subject: [PATCH 3/5] Site updated: 2024-12-30 14:19:47 --- .../index.html" | 8 ++++---- .../index.html" | 2 +- .../index.html" | 2 +- 2020/11/10/jsdelivr/index.html | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- archives/2020/06/index.html | 4 ++-- archives/2020/07/index.html | 4 ++-- archives/2020/08/index.html | 4 ++-- archives/2020/10/index.html | 4 ++-- archives/2020/11/index.html | 4 ++-- archives/2020/12/index.html | 4 ++-- archives/2020/index.html | 4 ++-- archives/2020/page/2/index.html | 4 ++-- archives/2021/01/index.html | 4 ++-- archives/2021/02/index.html | 4 ++-- archives/2021/03/index.html | 4 ++-- archives/2021/04/index.html | 4 ++-- archives/2021/05/index.html | 4 ++-- archives/2021/07/index.html | 4 ++-- archives/2021/index.html | 4 ++-- archives/2021/page/2/index.html | 4 ++-- archives/2024/12/index.html | 4 ++-- archives/2024/index.html | 4 ++-- archives/index.html | 4 ++-- archives/page/2/index.html | 4 ++-- archives/page/3/index.html | 4 ++-- archives/page/4/index.html | 4 ++-- categories/CSS/index.html | 4 ++-- categories/Git/index.html | 4 ++-- categories/JavaScript/index.html | 4 ++-- categories/LeetCode/index.html | 4 ++-- categories/Socket/index.html | 4 ++-- categories/VSCode/index.html | 4 ++-- categories/Vue/index.html | 4 ++-- categories/Webpack/index.html | 4 ++-- categories/index.html | 4 ++-- categories/npm/index.html | 4 ++-- .../index.html" | 4 ++-- .../\345\276\256\345\211\215\347\253\257/index.html" | 4 ++-- .../\346\234\215\345\212\241\345\231\250/index.html" | 4 ++-- .../\347\247\273\345\212\250\347\253\257/index.html" | 4 ++-- .../index.html" | 4 ++-- "categories/\351\235\242\350\257\225/index.html" | 4 ++-- index.html | 4 ++-- page/2/index.html | 4 ++-- page/3/index.html | 4 ++-- page/4/index.html | 4 ++-- resume/index.html | 10 +++++----- tags/CSS/index.html | 4 ++-- tags/Git/index.html | 4 ++-- tags/JavaScript/index.html | 4 ++-- tags/LeetCode/index.html | 4 ++-- tags/Socket/index.html | 4 ++-- tags/VSCode/index.html | 4 ++-- tags/Vue/index.html | 4 ++-- tags/Webpack/index.html | 4 ++-- tags/index.html | 6 +++--- tags/npm/index.html | 4 ++-- .../index.html" | 4 ++-- "tags/\345\276\256\345\211\215\347\253\257/index.html" | 4 ++-- "tags/\346\234\215\345\212\241\345\231\250/index.html" | 4 ++-- "tags/\347\247\273\345\212\250\347\253\257/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- "tags/\351\235\242\350\257\225/index.html" | 4 ++-- 75 files changed, 142 insertions(+), 142 deletions(-) diff --git "a/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" index 9d700e9e5..e5bf6b800 100644 --- "a/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" +++ "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" @@ -7,7 +7,7 @@ - + @@ -18,7 +18,7 @@ "url": "https://leedebug.github.io/2020/06/07/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAHexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/", "image": "https://cdn.jsdelivr.net/gh/LeeDebug/PicGo/img/20201111170432.png", "datePublished": "2020-06-07T15:23:55.000Z", - "dateModified": "2024-12-30T05:49:35.064Z", + "dateModified": "2024-12-30T06:19:23.249Z", "author": [ { "@type": "Person", @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    从0开始搭建Hexo个人博客

    +}

    从0开始搭建Hexo个人博客

    搭建个人博客是每个程序员成长的必经之路,不但可以记录与分享自己在学习过程中Get到的新技能、新知识,还能顺便提高一下自己的文采。

    Hexo简介

    Hexo是一款基于Node.js的静态博客框架,可方便快捷的托管于GitHub上,是搭建博客的首选框架。

    @@ -197,7 +197,7 @@

    运行成功后,浏览器打开http://localhost:4000便可看到你的hexo博客项目了,除了主题有点儿吃藕,还是挺不错的~

    将Hexo部署到GitHub

    这一步,我们就可以将hexo和GitHub关联起来,也就是将hexo生成的文章部署到GitHub上,打开站点配置文件_config.yml,翻到最后,修改为下面这样,其中LeeDebug改为你的GitHub账户名

    -
    1
    2
    3
    4
    deploy:
    type: git
    repo: https://github.com/LeeDebug/LeeDebug.github.io.git
    branch: master
    +
    1
    2
    3
    4
    deploy:
    type: git
    repo: git@github.com:LeeDebug/LeeDebug.github.io.git
    branch: master

    这个时候需要先安装deploy-git,也就是部署的命令,这样你才能用命令部署到GitHub。

    1
    $ npm install hexo-deployer-git --save
    diff --git "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" index 1f83746a7..36acbd2c7 100644 --- "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" +++ "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" @@ -1677,7 +1677,7 @@

    Webpa
  • vue-cli开启打包压缩和后台配合gzip访问
      -
    • npm install –save-dev compression-webpack-plugin@1.1.11
    • +
    • npm install –save-dev compression-webpack-plugin@1.1.11
    • 打开 config/index.js ,找到 build 对象中的 productionGzip ,改成 true
    • 此时打包的文件会 新增 .gz 文件
    • 后台nginx开启gzip模式访问(gzip on;),浏览器访问项目,自动会找到 .gz 的文件
    • diff --git "a/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" index 5ca937f18..0a5396812 100644 --- "a/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" +++ "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" @@ -180,4 +180,4 @@

      订阅事件?

      1
      2
      3
      4
      5
      6
      # *.vue

      let result = this.$bus.$subscribed('event_name')
      if (result) {
      // do something...
      }
      -

      祝君无Bug~

  • Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/07/%E4%B8%AD%E5%A4%AE%E4%BA%8B%E4%BB%B6%E6%80%BB%E7%BA%BF%E6%8F%92%E4%BB%B6vue-bus-ts/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/07/%E4%B8%AD%E5%A4%AE%E4%BA%8B%E4%BB%B6%E6%80%BB%E7%BA%BF%E6%8F%92%E4%BB%B6vue-bus-ts/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/2020/11/10/jsdelivr/index.html b/2020/11/10/jsdelivr/index.html index c75ce8eeb..5aad7c9c4 100644 --- a/2020/11/10/jsdelivr/index.html +++ b/2020/11/10/jsdelivr/index.html @@ -190,4 +190,4 @@

    奇虎图床

    网页上传;不支持url复制;

    测试图片:
    奇虎图床

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/10/jsdelivr/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/10/jsdelivr/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" index 821339620..b4e8dd5d0 100644 --- "a/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" +++ "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" @@ -176,4 +176,4 @@

    1
    git config user.email "your github email"
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/git%E6%8E%A8%E9%80%81%E5%90%8E%E6%B2%A1%E6%9C%89%E8%B4%A1%E7%8C%AE%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/git%E6%8E%A8%E9%80%81%E5%90%8E%E6%B2%A1%E6%9C%89%E8%B4%A1%E7%8C%AE%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" index a62e398be..9864cef1b 100644 --- "a/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" +++ "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" @@ -257,4 +257,4 @@

    步骤五:打包部署

    教程到此结束,打包部署即可查看效果。如有疑问请联系博主

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/14/git%E8%B4%A1%E7%8C%AE%E5%A2%99gitcalendar/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/14/git%E8%B4%A1%E7%8C%AE%E5%A2%99gitcalendar/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" index e94e36f75..1b8c3b5ed 100644 --- "a/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" +++ "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" @@ -167,4 +167,4 @@

    运行脚本

    每次推送时,在当前目录运行sh push.sh命令即可,接下来会提示你输入要提交的信息,输入完点击回车即可

    注:如果加入了hexo项目的构建部署命令,每次推送时也会帮你完成部署

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/26/git%E4%BB%93%E5%BA%93%E6%8E%A8%E9%80%81%E8%84%9A%E6%9C%AC%EF%BC%88%E6%9C%AC%E5%9C%B0%E7%AE%80%E6%98%93%E7%89%88%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/26/git%E4%BB%93%E5%BA%93%E6%8E%A8%E9%80%81%E8%84%9A%E6%9C%AC%EF%BC%88%E6%9C%AC%E5%9C%B0%E7%AE%80%E6%98%93%E7%89%88%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" index 42423c3a2..e166e16c2 100644 --- "a/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" +++ "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" @@ -211,4 +211,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/27/vue3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/27/vue3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" index b82e1a84b..c4e03ca0b 100644 --- "a/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" +++ "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" @@ -167,4 +167,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const acceptFileTypeArr: any = computed(() => { // 当前支持上传类型
    if (uploadType.value === 'image') {
    return 'image/*';
    }
    if (uploadType.value === 'file') {
    return '';
    }
    return '';
    });
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/17/%E5%AE%89%E5%8D%93%E5%BE%AE%E4%BF%A1%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%ADtype-file%E7%9A%84input%E6%A1%86%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/17/%E5%AE%89%E5%8D%93%E5%BE%AE%E4%BF%A1%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%ADtype-file%E7%9A%84input%E6%A1%86%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" index 83fbd3a06..1d186b9db 100644 --- "a/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" +++ "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" @@ -167,4 +167,4 @@

    1
    2
    3
    4
    5
    6
    7
    // 在main.ts中
    import Vue from 'vue';
    import Element from 'element-ui';
    Vue.use(Element, {
    size: 'small', // 组件的默认尺寸 mini、small、medium
    zIndex: 3000 // 弹窗默认层级初始值,默认2000
    });
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/26/%E4%BF%AE%E6%94%B9element-ui%E7%9A%84%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/26/%E4%BF%AE%E6%94%B9element-ui%E7%9A%84%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" index 945b430b1..5877e593a 100644 --- "a/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" +++ "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" @@ -169,4 +169,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // see document: https://github.com/fengyuanchen/viewerjs/blob/master/README.md
    import Viewer from 'viewerjs';
    import 'viewerjs/dist/viewer.css';
    let viewer: any;
    export function initImageViewer(thumbnail: string = '') {
    // 获取最新的消息框实例
    const msgDom: any = (document as any).getElementById('messageBox');
    // 已加载过
    if (viewer) {
    // 更新实例里的图片源
    viewer.update(msgDom);
    } else { // 第一次加载
    viewer = new Viewer(msgDom, {
    // 只筛选出图片消息
    filter(image: any) {
    const isImgMsg = image.className.indexOf('imageMsg') > -1;
    return isImgMsg;
    },
    // 去掉url中的缩略图参数
    url(image: any) {
    return image.src.replace(thumbnail, '');
    },
    });
    }
    }

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/06/viewerjs%E6%9F%A5%E7%9C%8B%E5%A4%A7%E5%9B%BE%E7%BB%84%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/06/viewerjs%E6%9F%A5%E7%9C%8B%E5%A4%A7%E5%9B%BE%E7%BB%84%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" index 087166b9f..08a19943d 100644 --- "a/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" +++ "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" @@ -170,4 +170,4 @@

    1
    2
    3
    <pre contenteditable="true">
    可以直接在这里输入.....
    </pre>
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/10/%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84n%E7%A7%8D%E5%BD%A2%E5%BC%8F/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/10/%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84n%E7%A7%8D%E5%BD%A2%E5%BC%8F/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" index 1a672c9cb..f71c42a15 100644 --- "a/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" +++ "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" @@ -177,4 +177,4 @@

    使用方法

    1
    2
    3
    4
    import { filterXSS } from '@/utils';

    var filterData = filterXSS(res.data);
    console.log(filterData);
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/02/%E9%A2%84%E9%98%B2XSS%E6%94%BB%E5%87%BB/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/02/%E9%A2%84%E9%98%B2XSS%E6%94%BB%E5%87%BB/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" index 8f9556d6f..70c117df6 100644 --- "a/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" +++ "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" @@ -343,4 +343,4 @@

    npm package
  • github repo
  • -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" index 03eed387d..63cea599c 100644 --- "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" +++ "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" @@ -581,4 +581,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html index 33f775bf1..eae0df6fc 100644 --- a/archives/2020/06/index.html +++ b/archives/2020/06/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html index 398f07109..d93c87a5b 100644 --- a/archives/2020/07/index.html +++ b/archives/2020/07/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html index 61541ad77..b6be1fd69 100644 --- a/archives/2020/08/index.html +++ b/archives/2020/08/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html index e75bbf348..38f797f3c 100644 --- a/archives/2020/10/index.html +++ b/archives/2020/10/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html index 839273680..750513abb 100644 --- a/archives/2020/11/index.html +++ b/archives/2020/11/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html index fa66283f9..3191f77fc 100644 --- a/archives/2020/12/index.html +++ b/archives/2020/12/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html index f2b086735..0cec0d87b 100644 --- a/archives/2020/index.html +++ b/archives/2020/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html index 21415e984..6ffef1aec 100644 --- a/archives/2020/page/2/index.html +++ b/archives/2020/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html index 24e6f383e..61630ba88 100644 --- a/archives/2021/01/index.html +++ b/archives/2021/01/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html index bdaf0f422..6a905e7aa 100644 --- a/archives/2021/02/index.html +++ b/archives/2021/02/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html index 3f5776dd9..eaf9cf3c4 100644 --- a/archives/2021/03/index.html +++ b/archives/2021/03/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html index 386889a95..9d60e3ddb 100644 --- a/archives/2021/04/index.html +++ b/archives/2021/04/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html index 994dfcd8d..ad2ed2691 100644 --- a/archives/2021/05/index.html +++ b/archives/2021/05/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html index fdf71151c..2898ee9cb 100644 --- a/archives/2021/07/index.html +++ b/archives/2021/07/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html index 1435f5343..14cc552a5 100644 --- a/archives/2021/index.html +++ b/archives/2021/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html index 3b1f1eae0..8590e21ed 100644 --- a/archives/2021/page/2/index.html +++ b/archives/2021/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2024/12/index.html b/archives/2024/12/index.html index 9b9bea3f2..a1c8b3dc0 100644 --- a/archives/2024/12/index.html +++ b/archives/2024/12/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html index 52005d44e..671c88467 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/index.html b/archives/index.html index ee0cdabe4..9867b6ce1 100644 --- a/archives/index.html +++ b/archives/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html index b1ccd5bb3..649971d02 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html index de10a8fb1..a2555ba70 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html index d81678edf..12b8bd004 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/CSS/index.html b/categories/CSS/index.html index 9699310ea..daf9c9a73 100644 --- a/categories/CSS/index.html +++ b/categories/CSS/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Git/index.html b/categories/Git/index.html index 53f2566bc..08815fea1 100644 --- a/categories/Git/index.html +++ b/categories/Git/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/JavaScript/index.html b/categories/JavaScript/index.html index 048f8ed2f..06762d0c6 100644 --- a/categories/JavaScript/index.html +++ b/categories/JavaScript/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/LeetCode/index.html b/categories/LeetCode/index.html index e774ec2c2..fb69dea59 100644 --- a/categories/LeetCode/index.html +++ b/categories/LeetCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Socket/index.html b/categories/Socket/index.html index d681f4d35..265d30f89 100644 --- a/categories/Socket/index.html +++ b/categories/Socket/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/VSCode/index.html b/categories/VSCode/index.html index fa48d6e18..536b38a0e 100644 --- a/categories/VSCode/index.html +++ b/categories/VSCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Vue/index.html b/categories/Vue/index.html index 5812f515e..dc3530882 100644 --- a/categories/Vue/index.html +++ b/categories/Vue/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Webpack/index.html b/categories/Webpack/index.html index e2bf13919..c8d40b1a0 100644 --- a/categories/Webpack/index.html +++ b/categories/Webpack/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index ce769a429..a373b7038 100644 --- a/categories/index.html +++ b/categories/index.html @@ -151,7 +151,7 @@
    +
    Archives @@ -236,4 +236,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/npm/index.html b/categories/npm/index.html index 43a4c8559..d166ccd4d 100644 --- a/categories/npm/index.html +++ b/categories/npm/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index fcc095393..acac71f61 100644 --- "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\345\276\256\345\211\215\347\253\257/index.html" "b/categories/\345\276\256\345\211\215\347\253\257/index.html" index ea15430f1..a95e304a4 100644 --- "a/categories/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/categories/\345\276\256\345\211\215\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\346\234\215\345\212\241\345\231\250/index.html" "b/categories/\346\234\215\345\212\241\345\231\250/index.html" index 172dbe1ed..88065e01f 100644 --- "a/categories/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/categories/\346\234\215\345\212\241\345\231\250/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\347\247\273\345\212\250\347\253\257/index.html" "b/categories/\347\247\273\345\212\250\347\253\257/index.html" index 9bf0a7af2..4a36b56d0 100644 --- "a/categories/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/categories/\347\247\273\345\212\250\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index 79f3ecf7b..87316f589 100644 --- "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\351\235\242\350\257\225/index.html" "b/categories/\351\235\242\350\257\225/index.html" index d26adea58..5a551be66 100644 --- "a/categories/\351\235\242\350\257\225/index.html" +++ "b/categories/\351\235\242\350\257\225/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/index.html b/index.html index 3331e34f9..efa6752a5 100644 --- a/index.html +++ b/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index 04ed4e04b..edef34307 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 126e5587b..2afe4752c 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index a6e637278..db01452a6 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/resume/index.html b/resume/index.html index e62e7a995..0c1949f7c 100644 --- a/resume/index.html +++ b/resume/index.html @@ -1,9 +1,9 @@ -个人简历 | 淳淳同学的个人博客 +个人简历 | 淳淳同学的个人博客 - + @@ -149,7 +149,7 @@
  • 姓名:李淳淳
  • 求职意向:前端开发想转全栈开发(对大数据、人工智能感兴趣)
  • 联系方式:15610045821
  • -
  • 电子邮箱:961150665@qq.com
  • +
  • 电子邮箱:961150665@qq.com
  • 个人博客:淳淳同学的个人博客
  • 技能掌握

    +
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/CSS/index.html b/tags/CSS/index.html index 21ea8d538..f892e848f 100644 --- a/tags/CSS/index.html +++ b/tags/CSS/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html index 99b79166b..cf41b5176 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html index 66503a573..bac26d633 100644 --- a/tags/JavaScript/index.html +++ b/tags/JavaScript/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/LeetCode/index.html b/tags/LeetCode/index.html index 44fa5e53a..2c782f9c1 100644 --- a/tags/LeetCode/index.html +++ b/tags/LeetCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Socket/index.html b/tags/Socket/index.html index a6e6d80a4..680706f19 100644 --- a/tags/Socket/index.html +++ b/tags/Socket/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/VSCode/index.html b/tags/VSCode/index.html index dd0e3ad44..cca465a70 100644 --- a/tags/VSCode/index.html +++ b/tags/VSCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Vue/index.html b/tags/Vue/index.html index 1cba101ea..5b0b7bd53 100644 --- a/tags/Vue/index.html +++ b/tags/Vue/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Webpack/index.html b/tags/Webpack/index.html index 2ea2f4054..c6945991a 100644 --- a/tags/Webpack/index.html +++ b/tags/Webpack/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 41089a073..ca58199f2 100644 --- a/tags/index.html +++ b/tags/index.html @@ -143,7 +143,7 @@ isHighlightShrink: false, isToc: false, pageType: 'page' -}
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/npm/index.html b/tags/npm/index.html index 1cb77d75f..67a99cea6 100644 --- a/tags/npm/index.html +++ b/tags/npm/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index e6dab2da1..09aebda46 100644 --- "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\345\276\256\345\211\215\347\253\257/index.html" "b/tags/\345\276\256\345\211\215\347\253\257/index.html" index 799ef48c3..0e7165d05 100644 --- "a/tags/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/tags/\345\276\256\345\211\215\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\346\234\215\345\212\241\345\231\250/index.html" "b/tags/\346\234\215\345\212\241\345\231\250/index.html" index db18579d5..d6828a5f1 100644 --- "a/tags/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/tags/\346\234\215\345\212\241\345\231\250/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\347\247\273\345\212\250\347\253\257/index.html" "b/tags/\347\247\273\345\212\250\347\253\257/index.html" index 4ebe5cd3a..b9b226b0a 100644 --- "a/tags/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/tags/\347\247\273\345\212\250\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index fde0c32d5..650c5dd4b 100644 --- "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" index 268752baa..ef3630004 100644 --- "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" +++ "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225/index.html" "b/tags/\351\235\242\350\257\225/index.html" index 8170b3be4..39f39231c 100644 --- "a/tags/\351\235\242\350\257\225/index.html" +++ "b/tags/\351\235\242\350\257\225/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file From 11d796fa0ab98a68df82ce81529ce498cb357d1d Mon Sep 17 00:00:00 2001 From: Edan's Win11 <961150665@qq.com> Date: Mon, 30 Dec 2024 14:24:44 +0800 Subject: [PATCH 4/5] Site updated: 2024-12-30 14:24:39 --- .../index.html" | 2 +- .../index.html" | 2 +- 2020/11/10/jsdelivr/index.html | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- CNAME | 1 - archives/2020/06/index.html | 4 ++-- archives/2020/07/index.html | 4 ++-- archives/2020/08/index.html | 4 ++-- archives/2020/10/index.html | 4 ++-- archives/2020/11/index.html | 4 ++-- archives/2020/12/index.html | 4 ++-- archives/2020/index.html | 4 ++-- archives/2020/page/2/index.html | 4 ++-- archives/2021/01/index.html | 4 ++-- archives/2021/02/index.html | 4 ++-- archives/2021/03/index.html | 4 ++-- archives/2021/04/index.html | 4 ++-- archives/2021/05/index.html | 4 ++-- archives/2021/07/index.html | 4 ++-- archives/2021/index.html | 4 ++-- archives/2021/page/2/index.html | 4 ++-- archives/2024/12/index.html | 4 ++-- archives/2024/index.html | 4 ++-- archives/index.html | 4 ++-- archives/page/2/index.html | 4 ++-- archives/page/3/index.html | 4 ++-- archives/page/4/index.html | 4 ++-- categories/CSS/index.html | 4 ++-- categories/Git/index.html | 4 ++-- categories/JavaScript/index.html | 4 ++-- categories/LeetCode/index.html | 4 ++-- categories/Socket/index.html | 4 ++-- categories/VSCode/index.html | 4 ++-- categories/Vue/index.html | 4 ++-- categories/Webpack/index.html | 4 ++-- categories/index.html | 4 ++-- categories/npm/index.html | 4 ++-- .../index.html" | 4 ++-- .../\345\276\256\345\211\215\347\253\257/index.html" | 4 ++-- .../\346\234\215\345\212\241\345\231\250/index.html" | 4 ++-- .../\347\247\273\345\212\250\347\253\257/index.html" | 4 ++-- .../index.html" | 4 ++-- "categories/\351\235\242\350\257\225/index.html" | 4 ++-- index.html | 4 ++-- page/2/index.html | 4 ++-- page/3/index.html | 4 ++-- page/4/index.html | 4 ++-- resume/index.html | 10 +++++----- tags/CSS/index.html | 4 ++-- tags/Git/index.html | 4 ++-- tags/JavaScript/index.html | 4 ++-- tags/LeetCode/index.html | 4 ++-- tags/Socket/index.html | 4 ++-- tags/VSCode/index.html | 4 ++-- tags/Vue/index.html | 4 ++-- tags/Webpack/index.html | 4 ++-- tags/index.html | 6 +++--- tags/npm/index.html | 4 ++-- .../index.html" | 4 ++-- "tags/\345\276\256\345\211\215\347\253\257/index.html" | 4 ++-- "tags/\346\234\215\345\212\241\345\231\250/index.html" | 4 ++-- "tags/\347\247\273\345\212\250\347\253\257/index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- "tags/\351\235\242\350\257\225/index.html" | 4 ++-- 72 files changed, 135 insertions(+), 136 deletions(-) delete mode 100644 CNAME diff --git "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" index 36acbd2c7..4bd97d035 100644 --- "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" +++ "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" @@ -1677,7 +1677,7 @@

    Webpa
  • vue-cli开启打包压缩和后台配合gzip访问 -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
  • 6. 相关链接
  • 7. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" index 63cea599c..343007f83 100644 --- "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" +++ "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" @@ -581,4 +581,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file diff --git a/CNAME b/CNAME deleted file mode 100644 index 3844da8d7..000000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -blog.leedebug.cn \ No newline at end of file diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html index eae0df6fc..7bba4467d 100644 --- a/archives/2020/06/index.html +++ b/archives/2020/06/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html index d93c87a5b..02f4f7bbd 100644 --- a/archives/2020/07/index.html +++ b/archives/2020/07/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html index b6be1fd69..157312ed8 100644 --- a/archives/2020/08/index.html +++ b/archives/2020/08/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html index 38f797f3c..cc203d06e 100644 --- a/archives/2020/10/index.html +++ b/archives/2020/10/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html index 750513abb..6898c57a8 100644 --- a/archives/2020/11/index.html +++ b/archives/2020/11/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html index 3191f77fc..45fde2b50 100644 --- a/archives/2020/12/index.html +++ b/archives/2020/12/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html index 0cec0d87b..c254ff371 100644 --- a/archives/2020/index.html +++ b/archives/2020/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html index 6ffef1aec..a4a57ed61 100644 --- a/archives/2020/page/2/index.html +++ b/archives/2020/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html index 61630ba88..491adf560 100644 --- a/archives/2021/01/index.html +++ b/archives/2021/01/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html index 6a905e7aa..58d25b20b 100644 --- a/archives/2021/02/index.html +++ b/archives/2021/02/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html index eaf9cf3c4..f87f72095 100644 --- a/archives/2021/03/index.html +++ b/archives/2021/03/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html index 9d60e3ddb..e1064b2e8 100644 --- a/archives/2021/04/index.html +++ b/archives/2021/04/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html index ad2ed2691..d04c86d00 100644 --- a/archives/2021/05/index.html +++ b/archives/2021/05/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html index 2898ee9cb..f6737409b 100644 --- a/archives/2021/07/index.html +++ b/archives/2021/07/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html index 14cc552a5..047e6ae3e 100644 --- a/archives/2021/index.html +++ b/archives/2021/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html index 8590e21ed..17e780d89 100644 --- a/archives/2021/page/2/index.html +++ b/archives/2021/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2024/12/index.html b/archives/2024/12/index.html index a1c8b3dc0..aeb2b5bfd 100644 --- a/archives/2024/12/index.html +++ b/archives/2024/12/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html index 671c88467..c92d8bedd 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/index.html b/archives/index.html index 9867b6ce1..400079ae4 100644 --- a/archives/index.html +++ b/archives/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html index 649971d02..910fba0a4 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html index a2555ba70..36cd6cc83 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 12b8bd004..8321477eb 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/CSS/index.html b/categories/CSS/index.html index daf9c9a73..a8eaf329f 100644 --- a/categories/CSS/index.html +++ b/categories/CSS/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Git/index.html b/categories/Git/index.html index 08815fea1..0920e23bd 100644 --- a/categories/Git/index.html +++ b/categories/Git/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/JavaScript/index.html b/categories/JavaScript/index.html index 06762d0c6..050a398a7 100644 --- a/categories/JavaScript/index.html +++ b/categories/JavaScript/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/LeetCode/index.html b/categories/LeetCode/index.html index fb69dea59..fba7d2def 100644 --- a/categories/LeetCode/index.html +++ b/categories/LeetCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Socket/index.html b/categories/Socket/index.html index 265d30f89..2c7d03825 100644 --- a/categories/Socket/index.html +++ b/categories/Socket/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/VSCode/index.html b/categories/VSCode/index.html index 536b38a0e..4ee38c6e4 100644 --- a/categories/VSCode/index.html +++ b/categories/VSCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Vue/index.html b/categories/Vue/index.html index dc3530882..398ba87b7 100644 --- a/categories/Vue/index.html +++ b/categories/Vue/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Webpack/index.html b/categories/Webpack/index.html index c8d40b1a0..af16bd049 100644 --- a/categories/Webpack/index.html +++ b/categories/Webpack/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index a373b7038..c6d63e4d8 100644 --- a/categories/index.html +++ b/categories/index.html @@ -151,7 +151,7 @@
    +
    Archives @@ -236,4 +236,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/npm/index.html b/categories/npm/index.html index d166ccd4d..6f6459bc2 100644 --- a/categories/npm/index.html +++ b/categories/npm/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index acac71f61..a82063656 100644 --- "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\345\276\256\345\211\215\347\253\257/index.html" "b/categories/\345\276\256\345\211\215\347\253\257/index.html" index a95e304a4..63421b2d0 100644 --- "a/categories/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/categories/\345\276\256\345\211\215\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\346\234\215\345\212\241\345\231\250/index.html" "b/categories/\346\234\215\345\212\241\345\231\250/index.html" index 88065e01f..169eed536 100644 --- "a/categories/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/categories/\346\234\215\345\212\241\345\231\250/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\347\247\273\345\212\250\347\253\257/index.html" "b/categories/\347\247\273\345\212\250\347\253\257/index.html" index 4a36b56d0..2f3199854 100644 --- "a/categories/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/categories/\347\247\273\345\212\250\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index 87316f589..69b123f94 100644 --- "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/categories/\351\235\242\350\257\225/index.html" "b/categories/\351\235\242\350\257\225/index.html" index 5a551be66..c906c52f8 100644 --- "a/categories/\351\235\242\350\257\225/index.html" +++ "b/categories/\351\235\242\350\257\225/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/index.html b/index.html index efa6752a5..ffde14fca 100644 --- a/index.html +++ b/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index edef34307..eb5ac2b55 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 2afe4752c..479366faa 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index db01452a6..862010943 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/resume/index.html b/resume/index.html index 0c1949f7c..b584819d0 100644 --- a/resume/index.html +++ b/resume/index.html @@ -1,9 +1,9 @@ -个人简历 | 淳淳同学的个人博客 +个人简历 | 淳淳同学的个人博客 - + @@ -149,7 +149,7 @@
  • 姓名:李淳淳
  • 求职意向:前端开发想转全栈开发(对大数据、人工智能感兴趣)
  • 联系方式:15610045821
  • -
  • 电子邮箱:961150665@qq.com
  • +
  • 电子邮箱:961150665@qq.com
  • 个人博客:淳淳同学的个人博客
  • 技能掌握

    +
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/CSS/index.html b/tags/CSS/index.html index f892e848f..f99463d69 100644 --- a/tags/CSS/index.html +++ b/tags/CSS/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html index cf41b5176..b1a241641 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html index bac26d633..611f44e97 100644 --- a/tags/JavaScript/index.html +++ b/tags/JavaScript/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/LeetCode/index.html b/tags/LeetCode/index.html index 2c782f9c1..f8e20f1d4 100644 --- a/tags/LeetCode/index.html +++ b/tags/LeetCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Socket/index.html b/tags/Socket/index.html index 680706f19..5fee65899 100644 --- a/tags/Socket/index.html +++ b/tags/Socket/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/VSCode/index.html b/tags/VSCode/index.html index cca465a70..d606a91d6 100644 --- a/tags/VSCode/index.html +++ b/tags/VSCode/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Vue/index.html b/tags/Vue/index.html index 5b0b7bd53..2fae265da 100644 --- a/tags/Vue/index.html +++ b/tags/Vue/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Webpack/index.html b/tags/Webpack/index.html index c6945991a..316d94a38 100644 --- a/tags/Webpack/index.html +++ b/tags/Webpack/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index ca58199f2..b7bae148f 100644 --- a/tags/index.html +++ b/tags/index.html @@ -143,7 +143,7 @@ isHighlightShrink: false, isToc: false, pageType: 'page' -}
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/npm/index.html b/tags/npm/index.html index 67a99cea6..792e900e5 100644 --- a/tags/npm/index.html +++ b/tags/npm/index.html @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index 09aebda46..2ae2b1d64 100644 --- "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\345\276\256\345\211\215\347\253\257/index.html" "b/tags/\345\276\256\345\211\215\347\253\257/index.html" index 0e7165d05..f7f404b1f 100644 --- "a/tags/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/tags/\345\276\256\345\211\215\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\346\234\215\345\212\241\345\231\250/index.html" "b/tags/\346\234\215\345\212\241\345\231\250/index.html" index d6828a5f1..7ff17f706 100644 --- "a/tags/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/tags/\346\234\215\345\212\241\345\231\250/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\347\247\273\345\212\250\347\253\257/index.html" "b/tags/\347\247\273\345\212\250\347\253\257/index.html" index b9b226b0a..06939c747 100644 --- "a/tags/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/tags/\347\247\273\345\212\250\347\253\257/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index 650c5dd4b..9ead49048 100644 --- "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" index ef3630004..180c32f13 100644 --- "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" +++ "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225/index.html" "b/tags/\351\235\242\350\257\225/index.html" index 39f39231c..c3456b9df 100644 --- "a/tags/\351\235\242\350\257\225/index.html" +++ "b/tags/\351\235\242\350\257\225/index.html" @@ -149,7 +149,7 @@
    +
    Archives @@ -234,4 +234,4 @@ -
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file From 140bfca272c23a6f3f8fda1ff034dc0fd881e7f9 Mon Sep 17 00:00:00 2001 From: Edan's Win11 <961150665@qq.com> Date: Mon, 30 Dec 2024 15:21:43 +0800 Subject: [PATCH 5/5] Site updated: 2024-12-30 15:21:38 --- .../index.html" | 4 ++-- 2020/06/10/js-md5/index.html | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 6 +++--- .../index.html" | 4 ++-- .../index.html" | 4 ++-- 2020/11/10/jsdelivr/index.html | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- 2020/12/15/GitHub-Corners/index.html | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- .../index.html" | 4 ++-- 2024/12/30/hello-world/index.html | 4 ++-- archives/2020/06/index.html | 10 +++++----- archives/2020/07/index.html | 10 +++++----- archives/2020/08/index.html | 10 +++++----- archives/2020/10/index.html | 10 +++++----- archives/2020/11/index.html | 10 +++++----- archives/2020/12/index.html | 10 +++++----- archives/2020/index.html | 10 +++++----- archives/2020/page/2/index.html | 10 +++++----- archives/2021/01/index.html | 10 +++++----- archives/2021/02/index.html | 10 +++++----- archives/2021/03/index.html | 10 +++++----- archives/2021/04/index.html | 10 +++++----- archives/2021/05/index.html | 10 +++++----- archives/2021/07/index.html | 10 +++++----- archives/2021/index.html | 10 +++++----- archives/2021/page/2/index.html | 10 +++++----- archives/2024/12/index.html | 10 +++++----- archives/2024/index.html | 10 +++++----- archives/index.html | 10 +++++----- archives/page/2/index.html | 10 +++++----- archives/page/3/index.html | 10 +++++----- archives/page/4/index.html | 10 +++++----- categories/CSS/index.html | 10 +++++----- categories/Git/index.html | 10 +++++----- categories/JavaScript/index.html | 10 +++++----- categories/LeetCode/index.html | 10 +++++----- categories/Socket/index.html | 10 +++++----- categories/VSCode/index.html | 10 +++++----- categories/Vue/index.html | 10 +++++----- categories/Webpack/index.html | 10 +++++----- categories/index.html | 10 +++++----- categories/npm/index.html | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../\351\235\242\350\257\225/index.html" | 10 +++++----- css/index.css | 18 ++++++++++-------- index.html | 10 +++++----- page/2/index.html | 10 +++++----- page/3/index.html | 10 +++++----- page/4/index.html | 10 +++++----- resume/index.html | 18 +++++++++--------- tags/CSS/index.html | 10 +++++----- tags/Git/index.html | 10 +++++----- tags/JavaScript/index.html | 10 +++++----- tags/LeetCode/index.html | 10 +++++----- tags/Socket/index.html | 10 +++++----- tags/VSCode/index.html | 10 +++++----- tags/Vue/index.html | 10 +++++----- tags/Webpack/index.html | 10 +++++----- tags/index.html | 10 +++++----- tags/npm/index.html | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- .../index.html" | 10 +++++----- "tags/\351\235\242\350\257\225/index.html" | 10 +++++----- 98 files changed, 389 insertions(+), 387 deletions(-) diff --git "a/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" index e5bf6b800..3d3e54c4d 100644 --- "a/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" +++ "b/2020/06/07/\344\273\2160\345\274\200\345\247\213\346\220\255\345\273\272Hexo\344\270\252\344\272\272\345\215\232\345\256\242/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    从0开始搭建Hexo个人博客

    +}

    从0开始搭建Hexo个人博客

    搭建个人博客是每个程序员成长的必经之路,不但可以记录与分享自己在学习过程中Get到的新技能、新知识,还能顺便提高一下自己的文采。

    Hexo简介

    Hexo是一款基于Node.js的静态博客框架,可方便快捷的托管于GitHub上,是搭建博客的首选框架。

    @@ -231,4 +231,4 @@

    1
    2
    3
    4
    5
    ---
    title: 标签
    date: 2018-01-05 00:00:00
    type: "tags"
    ---
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/07/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAHexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/07/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAHexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/2020/06/10/js-md5/index.html b/2020/06/10/js-md5/index.html index 4cd7f8aa1..8e7ba4023 100644 --- a/2020/06/10/js-md5/index.html +++ b/2020/06/10/js-md5/index.html @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    js-md5

    +}

    js-md5

    前端在用户登录时尝使用md5对用户的登录信息进行加密操作

    MD5简介

    MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

    @@ -171,4 +171,4 @@

    引入使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    md5(''); // d41d8cd98f00b204e9800998ecf8427e
    md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
    md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0

    // It also supports UTF-8 encoding
    md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07

    // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
    md5([]); // d41d8cd98f00b204e9800998ecf8427e
    md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e

    // Different output
    md5(''); // d41d8cd98f00b204e9800998ecf8427e
    md5.hex(''); // d41d8cd98f00b204e9800998ecf8427e
    md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
    md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
    md5.arrayBuffer(''); // ArrayBuffer
    md5.buffer(''); // ArrayBuffer, deprecated, This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
    md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/10/js-md5/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/10/js-md5/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" "b/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" index 615c50d31..88d0e7ff7 100644 --- "a/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" +++ "b/2020/06/15/\347\250\213\345\272\217\345\221\230\350\277\233\344\277\256\346\226\207\346\241\243/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    程序员进修文档

    +}

    程序员进修文档

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/15/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%BF%9B%E4%BF%AE%E6%96%87%E6%A1%A3/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/15/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%BF%9B%E4%BF%AE%E6%96%87%E6%A1%A3/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" "b/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" index d56157756..c8c93a430 100644 --- "a/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" +++ "b/2020/06/20/\345\211\215\347\253\257\344\270\252\344\272\272\345\255\246\344\271\240\347\254\224\350\256\260\344\270\216\351\241\271\347\233\256\350\247\204\350\214\203/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    前端个人学习笔记与项目规范

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Lee 更新于 2019-05-30

    以下是学习Vue的渐进路线,并非适合所有人但适合大多数人
    如果是计算机专业的话,而且有其他语言基础的,1~2天就可以过一遍
    如果是非计算机专业的话,可能要半个月左右,不会的一定要勤问(发扬不要脸的精神)
    看完之后别逗留太久,尽早跟着项目走,真正开始动手写点儿东西的时候,才是你刚开始入门的时候



    人生、工作的结果 = 思维方式 × 热情 × 能力

    --- 稻盛和夫《活法》
    +}

    前端个人学习笔记与项目规范

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Lee 更新于 2019-05-30

    以下是学习Vue的渐进路线,并非适合所有人但适合大多数人
    如果是计算机专业的话,而且有其他语言基础的,1~2天就可以过一遍
    如果是非计算机专业的话,可能要半个月左右,不会的一定要勤问(发扬不要脸的精神)
    看完之后别逗留太久,尽早跟着项目走,真正开始动手写点儿东西的时候,才是你刚开始入门的时候



    人生、工作的结果 = 思维方式 × 热情 × 能力

    --- 稻盛和夫《活法》

    Basic Document:

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/20/%E5%89%8D%E7%AB%AF%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%8E%E9%A1%B9%E7%9B%AE%E8%A7%84%E8%8C%83/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/20/%E5%89%8D%E7%AB%AF%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%8E%E9%A1%B9%E7%9B%AE%E8%A7%84%E8%8C%83/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" "b/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" index 12f0a8557..cadac00bf 100644 --- "a/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" +++ "b/2020/06/23/\343\200\212\345\211\215\347\253\257\345\206\205\345\217\202\343\200\213/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    《前端内参》读书笔记

    +}

    《前端内参》读书笔记

    做web前端开发也有两年的时间了,但技术层面一直很浅,特别是近期感觉遇到了知识瓶颈,还是因为看书少、不爱总结。本次笔记在参考Bob Ma大佬整理分享的《前端内参》的基础上,记录并整理下来一些自己平时不注意的知识点。

    壹.1.1.3 ES 8 新特性

    字符串追加

    在 ES 8 中String新增了两个实例函数String.prototype.padStartString.prototype.padEnd,允许将空字符串或其他字符串添加到原始字符串的开头或结尾。

    @@ -207,4 +207,4 @@

    正则表达式命名捕获组

    未看

    正则表达式后行断言

    未看

    正则表达式 Unicode 转义

    未看

    -

    壹.1.1.5 ES 10 新特性

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/23/%E3%80%8A%E5%89%8D%E7%AB%AF%E5%86%85%E5%8F%82%E3%80%8B/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    壹.1.1.5 ES 10 新特性

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/06/23/%E3%80%8A%E5%89%8D%E7%AB%AF%E5%86%85%E5%8F%82%E3%80%8B/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" "b/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" index 05add4979..a4d47b8d4 100644 --- "a/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" +++ "b/2020/07/01/LeetCode\345\270\270\350\247\201\351\242\230/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    LeetCode常见题

    +}

    LeetCode常见题

    算法对前端的重要性可以说至关重要,不可小觑。

    算法思想

      @@ -198,4 +198,4 @@

      - 排
    • 树与图:最近公共祖先、并查集
    • 字符串:前缀树(字典树) /后缀树
    -

    - 链表

    - 树

    - 栈和队列

    - 哈希表

    - 字符串

    - 数组与矩阵

    - 图

    - 位运算

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/01/LeetCode%E5%B8%B8%E8%A7%81%E9%A2%98/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    - 链表

    - 树

    - 栈和队列

    - 哈希表

    - 字符串

    - 数组与矩阵

    - 图

    - 位运算

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/01/LeetCode%E5%B8%B8%E8%A7%81%E9%A2%98/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" "b/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" index 537396e61..86019ce60 100644 --- "a/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" +++ "b/2020/07/06/Ubuntu-16-04-\351\203\250\347\275\262\345\221\275\344\273\244/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    Ubuntu 16.04 部署命令

    +}

    Ubuntu 16.04 部署命令

    现时代身为一名前端工程师,配置服务器、部署线上项目等技能是必不可少的。

    参考文档

      @@ -225,4 +225,4 @@

      新版项目启动代码

      1
      gunicorn -c ./gunicorn-config.py backend.wsgi
      -

      祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/06/Ubuntu-16-04-%E9%83%A8%E7%BD%B2%E5%91%BD%E4%BB%A4/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/06/Ubuntu-16-04-%E9%83%A8%E7%BD%B2%E5%91%BD%E4%BB%A4/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" "b/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" index 4f221ec0e..9f67806ae 100644 --- "a/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" +++ "b/2020/07/18/\344\275\240\344\270\215\347\237\245\351\201\223\347\232\204JavaScript\357\274\210\344\270\212\345\215\267\357\274\211/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    你不知道的JavaScript(上卷)

    +}

    你不知道的JavaScript(上卷)

    去年就想读这一套书,由于个人原因一直拖到现在,今天终于周末在家没事,看了5个小时才看了上卷的1/3(其实也就60页)。主要讲述了作用域和闭包的相关知识,可能是由于自己基础知识的匮乏,所以进度有些慢。总之,要提高阅读速度了。

    作用域和闭包

    作用域是什么

      @@ -408,4 +408,4 @@

      对象

      混合对象“类”

      原型

      行为委托

      祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/18/%E4%BD%A0%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84JavaScript%EF%BC%88%E4%B8%8A%E5%8D%B7%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    对象

    混合对象“类”

    原型

    行为委托

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/07/18/%E4%BD%A0%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84JavaScript%EF%BC%88%E4%B8%8A%E5%8D%B7%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" index 4bd97d035..49ffc92fc 100644 --- "a/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" +++ "b/2020/08/12/2020\345\211\215\347\253\257\351\235\242\350\257\225/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    2020前端面试

    +}

    2020前端面试

    今日裸辞,在投简历的过程中抽出一周集中复习前端知识,并做了此文以记录知识点。

    目 录

    [TOC]

    @@ -1677,7 +1677,7 @@

    Webpa
  • vue-cli开启打包压缩和后台配合gzip访问
      -
    • npm install –save-dev compression-webpack-plugin@1.1.11
    • +
    • npm install –save-dev compression-webpack-plugin@1.1.11
    • 打开 config/index.js ,找到 build 对象中的 productionGzip ,改成 true
    • 此时打包的文件会 新增 .gz 文件
    • 后台nginx开启gzip模式访问(gzip on;),浏览器访问项目,自动会找到 .gz 的文件
    • @@ -2301,4 +2301,4 @@

      祝君无Bug~

  • Author: 淳淳同学
    Link: https://leedebug.github.io/2020/08/12/2020%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/08/12/2020%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" "b/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" index a031ede98..896ed419c 100644 --- "a/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" +++ "b/2020/10/27/qiankun-2-0-24-\347\210\254\345\235\221\350\256\260\345\275\225/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    qiankun 2.0.24 爬坑记录

    +}

    qiankun 2.0.24 爬坑记录

    由于本次开发项目需要嵌入之前的老项目,由于考虑到iframe速度慢、css/js需要额外请求、阻塞页面加载、浏览器前进/后退等缺点,遂打算踩坑qiankun,为了更早的爬坑,整理此文。

    简介

    qiankun 是一个基于 single-spa微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

    @@ -306,4 +306,4 @@

    安全和性能的问题

    qiankun 将每个子项目的 js/css 文件内容都记录在一个全局变量中,如果子项目过多,或者文件体积很大,可能会导致内存占用过多,导致页面卡顿。

    另外,qiankun 运行子项目的 js,并不是通过 script 标签插入的,而是通过 eval 函数实现的,eval 函数的安全和性能是有一些争议的:MDN的eval介绍

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/10/27/qiankun-2-0-24-%E7%88%AC%E5%9D%91%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/10/27/qiankun-2-0-24-%E7%88%AC%E5%9D%91%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" index 936a1dc25..cb01eb6dd 100644 --- "a/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" +++ "b/2020/11/07/\344\270\255\345\244\256\344\272\213\344\273\266\346\200\273\347\272\277\346\217\222\344\273\266vue-bus-ts/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    中央事件总线插件vue-bus-ts

    +}

    中央事件总线插件vue-bus-ts

    项目中难免会遇到非父子组件之间的传参与通信问题,遂整理此文。

    简介

    vue-bus-ts 是一款支持在ts环境下使用的全局事件总线插件。

    @@ -180,4 +180,4 @@

    订阅事件?

    1
    2
    3
    4
    5
    6
    # *.vue

    let result = this.$bus.$subscribed('event_name')
    if (result) {
    // do something...
    }
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/07/%E4%B8%AD%E5%A4%AE%E4%BA%8B%E4%BB%B6%E6%80%BB%E7%BA%BF%E6%8F%92%E4%BB%B6vue-bus-ts/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/07/%E4%B8%AD%E5%A4%AE%E4%BA%8B%E4%BB%B6%E6%80%BB%E7%BA%BF%E6%8F%92%E4%BB%B6vue-bus-ts/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/2020/11/10/jsdelivr/index.html b/2020/11/10/jsdelivr/index.html index c75ce8eeb..d3d8642da 100644 --- a/2020/11/10/jsdelivr/index.html +++ b/2020/11/10/jsdelivr/index.html @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    jsdelivr

    +}

    jsdelivr

    本文概要

    CDN

    jsdelivr for GitHub

    需要配合PicGo图床使用

    @@ -190,4 +190,4 @@

    奇虎图床

    网页上传;不支持url复制;

    测试图片:
    奇虎图床

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/10/jsdelivr/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/11/10/jsdelivr/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" "b/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" index 3e805a37f..782d82e24 100644 --- "a/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" +++ "b/2020/12/11/Mac\351\205\215\347\275\256\345\244\232\344\270\252SSH-Key/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    Mac配置多个SSH-Key

    +}

    Mac配置多个SSH-Key

    随着项目与能力的提升与扩展,一台电脑上同时用着多个git仓库的情况越来越普遍,所以我们需要创建多个ssh key来对应不同的账号。本文以github为例

    本地配置ssh秘钥和公钥

    进入到ssh文件夹下

    1
    cd ~/.ssh/
    @@ -198,4 +198,4 @@

    1
    2
    → ssh -T git@github.com
    Hi LeeDebug! You've successfully authenticated, but GitHub does not provide shell access.

    到此,你的ssh-key已经可以正常使用,你可以使用ssh的方式去clone项目了

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/Mac%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AASSH-Key/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/Mac%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AASSH-Key/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" index 821339620..6d4008fcf 100644 --- "a/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" +++ "b/2020/12/11/git\346\216\250\351\200\201\345\220\216\346\262\241\346\234\211\350\264\241\347\214\256\350\256\260\345\275\225/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    git推送后没有贡献记录

    +}

    git推送后没有贡献记录

    github的contribution记录墙不展示问题

    问题背景

    最近打算把自己的项目同时部署到github、gitlab、gitee上,并且都改成了统一的email邮箱和username用户名,但是发现只有github没有任何的contribution记录。

    @@ -176,4 +176,4 @@

    1
    git config user.email "your github email"
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/git%E6%8E%A8%E9%80%81%E5%90%8E%E6%B2%A1%E6%9C%89%E8%B4%A1%E7%8C%AE%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/git%E6%8E%A8%E9%80%81%E5%90%8E%E6%B2%A1%E6%9C%89%E8%B4%A1%E7%8C%AE%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" "b/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" index 347fb8088..d82fa64e7 100644 --- "a/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" +++ "b/2020/12/11/node\346\211\223\345\214\205\345\206\205\345\255\230\346\272\242\345\207\272/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    node打包内存溢出

    +}

    node打包内存溢出

    vue项目利用webpack打包时提示内存堆栈溢出

    报错信息

    1
    FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
    @@ -167,4 +167,4 @@

    解决方案

    在build前,根据自己的项目大小设置一下最大分配内存空间,即可。

    1
    2
    3
    4
    5
    // 在package.json中
    "scripts": {
    ...
    "build": "node --max_old_space_size=4096 build/build.js"
    }
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/node%E6%89%93%E5%8C%85%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/11/node%E6%89%93%E5%8C%85%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" index a62e398be..74eeb6fe8 100644 --- "a/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" +++ "b/2020/12/14/git\350\264\241\347\214\256\345\242\231gitcalendar/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    git贡献墙 gitcalendar

    +}

    git贡献墙 gitcalendar

    公司为了访问便捷,大都使用gitlab或gitee,所以前两年的贡献度都在这两个仓库上。从今年打算转战github,多做项目、多做整理、多输出文章,旨在提升自己。所以本文的git贡献墙也以github为例

    诸多解决方案

    Github Official API

    参考地址:

    @@ -257,4 +257,4 @@

    步骤五:打包部署

    教程到此结束,打包部署即可查看效果。如有疑问请联系博主

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/14/git%E8%B4%A1%E7%8C%AE%E5%A2%99gitcalendar/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/14/git%E8%B4%A1%E7%8C%AE%E5%A2%99gitcalendar/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/2020/12/15/GitHub-Corners/index.html b/2020/12/15/GitHub-Corners/index.html index 4487f435f..e5f52ce17 100644 --- a/2020/12/15/GitHub-Corners/index.html +++ b/2020/12/15/GitHub-Corners/index.html @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    GitHub Corners

    +}

    GitHub Corners

    可以在你的博客或者自己的网站上增加一个github的标志链接

    GitHub Ribbons

    github repo是最初的角标链接,像丝带一样的长条形状,如下图所示:

    @@ -172,4 +172,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <a href="https://your-url" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#70B7FD; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
    <style>
    .github-corner:hover .octo-arm{
    animation:octocat-wave 560ms ease-in-out;
    }
    @keyframes octocat-wave{
    0%,100%{
    transform:rotate(0);
    }
    20%,60%{
    transform:rotate(-25deg);
    }
    40%,80%{
    transform:rotate(10deg);
    }
    }
    @media (max-width:500px){
    .github-corner:hover .octo-arm{
    animation:none;
    }
    .github-corner .octo-arm{
    animation:octocat-wave 560ms ease-in-out;
    }
    }
    </style>
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/15/GitHub-Corners/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/15/GitHub-Corners/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" "b/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" index d156c28a9..ea2b52529 100644 --- "a/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" +++ "b/2020/12/19/qiankun\347\232\204css\346\262\231\347\256\261\351\232\224\347\246\273\350\247\243\345\206\263\346\226\271\346\241\210/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    qiankun的css样式污染解决方案

    +}

    qiankun的css样式污染解决方案

    在使用qiankun框架做微前端开发的过程中,遇到了诸多难题,比如路由重定向、变量名及事件名冲突、挂载注销机制及生命周期、keep-alive等,目前遇到的比较难解决的问题可能就是css样式污染问题了。这次抽出了几天时间研究了一下,遂总结此文

    问题概述

    在qiankun加载子应用后,主子应用的样式之间会产生污染,常见的css样式污染有以下几种情况:

    @@ -202,4 +202,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/19/qiankun%E7%9A%84css%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/19/qiankun%E7%9A%84css%E6%B2%99%E7%AE%B1%E9%9A%94%E7%A6%BB%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" index e94e36f75..fb1d8dffa 100644 --- "a/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" +++ "b/2020/12/26/git\344\273\223\345\272\223\346\216\250\351\200\201\350\204\232\346\234\254\357\274\210\346\234\254\345\234\260\347\256\200\346\230\223\347\211\210\357\274\211/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    git仓库推送脚本(本地简易版)

    +}

    git仓库推送脚本(本地简易版)

    由于每次写完代码都要执行一大堆命令来将本地代码推送至远程仓库,所以索性写一个sh脚本

    新建push.sh文件:

    在项目主目录,即/git所在目录新建push.sh文件,并复制以下内容:

    @@ -167,4 +167,4 @@

    运行脚本

    每次推送时,在当前目录运行sh push.sh命令即可,接下来会提示你输入要提交的信息,输入完点击回车即可

    注:如果加入了hexo项目的构建部署命令,每次推送时也会帮你完成部署

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/26/git%E4%BB%93%E5%BA%93%E6%8E%A8%E9%80%81%E8%84%9A%E6%9C%AC%EF%BC%88%E6%9C%AC%E5%9C%B0%E7%AE%80%E6%98%93%E7%89%88%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/26/git%E4%BB%93%E5%BA%93%E6%8E%A8%E9%80%81%E8%84%9A%E6%9C%AC%EF%BC%88%E6%9C%AC%E5%9C%B0%E7%AE%80%E6%98%93%E7%89%88%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" index 149e0de43..190e418f5 100644 --- "a/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" +++ "b/2020/12/27/vue3\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237\351\222\251\345\255\220/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    vue3的生命周期钩子

    +}

    vue3的生命周期钩子

    vue3的生命周期钩子与vue2的差不多,只是命名和调用上有一些诧异,详见下文

    与 2.x 版本生命周期相对应的 Composition API

    @@ -211,4 +211,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/27/vue3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2020/12/27/vue3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" "b/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" index abbaa5669..9cbfec03e 100644 --- "a/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" +++ "b/2021/01/08/copy-webpack-plugin\345\244\204\347\220\206\345\215\225\347\213\254js\346\226\207\344\273\266/index.html" @@ -159,11 +159,11 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    copy-webpack-plugin处理单独js文件

    +}

    copy-webpack-plugin处理单独js文件

    当文件在static或public目录下但又想对文件进行编译处理,即可在此插件中进行配置

    使用说明

    copy-webpack-plugin是webpack自带的插件,本意是将某个文件/文件夹,从dir1处复制到dist下,即当你在运行npm run build时,static或public目录下的文件就是走的此插件

    配置信息

    因为我使用的是基于@vue/cli-servicevue3.x,所以是在vue.config.js中设置(如果是vue2.x的版本,请在webpack.base.js中设置)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // 引入
    const CopyWebpackPlugin = require('copy-webpack-plugin')
    const UglifyJS = require('uglify-js')

    // 使用
    let config = {
    // ...others,
    configureWebpack: config => {
    config.plugins.push(
    // see document: https://www.npmjs.com/package/copy-webpack-plugin/v/5.1.2
    new CopyWebpackPlugin([
    {
    from: resolve('./public/handle.js'), // 文件名或目录
    to: './[name].[contenthash].[ext]', // 文件名后添加hash值
    transform(content, path) { // 修改文件内容
    const code = UglifyJS.minify(content.toString()).code;
    return code;
    },
    transformPath(targetPath, absolutePath) { // 修改文件路径:目标路径、源路径
    newHashPath = targetPath;
    return targetPath;
    },
    },
    {
    from: resolve('./public/index2.html'),
    to: './[name].[ext]',
    transform(content, path) {
    let code = UglifyJS.minify(content.toString()).code;
    return code;
    },
    force: true, // 覆盖已经存在的文件
    },
    ])
    );
    },
    }
    module.exports = config;
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/08/copy-webpack-plugin%E5%A4%84%E7%90%86%E5%8D%95%E7%8B%ACjs%E6%96%87%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/08/copy-webpack-plugin%E5%A4%84%E7%90%86%E5%8D%95%E7%8B%ACjs%E6%96%87%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" index c4e03ca0b..744c651e8 100644 --- "a/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" +++ "b/2021/01/17/\345\256\211\345\215\223\345\276\256\344\277\241\346\265\217\350\247\210\345\231\250\344\270\255type-file\347\232\204input\346\241\206\346\227\240\346\263\225\344\275\277\347\224\250/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    安卓微信浏览器中type=file的input框无法使用

    +}

    安卓微信浏览器中type=file的input框无法使用

    如果使用html的input框设为type=file来选择文件,在安卓的微信中打开页面时,会提示暂无可使用应用等错误提示

    解决方案

    若要选择图片,需将input框的accept属性设为image/*;若要选择文件,需将此属性设为

    @@ -167,4 +167,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const acceptFileTypeArr: any = computed(() => { // 当前支持上传类型
    if (uploadType.value === 'image') {
    return 'image/*';
    }
    if (uploadType.value === 'file') {
    return '';
    }
    return '';
    });
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/17/%E5%AE%89%E5%8D%93%E5%BE%AE%E4%BF%A1%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%ADtype-file%E7%9A%84input%E6%A1%86%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/17/%E5%AE%89%E5%8D%93%E5%BE%AE%E4%BF%A1%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%ADtype-file%E7%9A%84input%E6%A1%86%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" index 1d186b9db..70100e69e 100644 --- "a/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" +++ "b/2021/01/26/\344\277\256\346\224\271element-ui\347\232\204\345\205\250\345\261\200\351\205\215\347\275\256/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    修改element-ui的全局配置

    +}

    修改element-ui的全局配置

    项目因使用qiankun嵌入了子项目,且都使用了element-ui的弹窗样式,遂导致子应用中插入到父应用body的弹窗因层级过低无法展示

    配置信息

    element-ui的弹窗默的z-index层级默认是从2000开始的,并且打开多个弹窗时z-index会逐步递增,所以若主子应用不做区分的话,很可能会导致有的弹窗被遮挡

    @@ -167,4 +167,4 @@

    1
    2
    3
    4
    5
    6
    7
    // 在main.ts中
    import Vue from 'vue';
    import Element from 'element-ui';
    Vue.use(Element, {
    size: 'small', // 组件的默认尺寸 mini、small、medium
    zIndex: 3000 // 弹窗默认层级初始值,默认2000
    });
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/26/%E4%BF%AE%E6%94%B9element-ui%E7%9A%84%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/01/26/%E4%BF%AE%E6%94%B9element-ui%E7%9A%84%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" index 4e665b0ec..6807c3019 100644 --- "a/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" +++ "b/2021/02/06/viewerjs\346\237\245\347\234\213\345\244\247\345\233\276\347\273\204\344\273\266/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    viewerjs查看大图组件

    +}

    viewerjs查看大图组件

    因为项目没有使用element-ui,所以不能使用自带的el-image组件进行大图查看,遂找了一个单独的组件

    安装

    1
    npm install viewerjs
    @@ -169,4 +169,4 @@

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // see document: https://github.com/fengyuanchen/viewerjs/blob/master/README.md
    import Viewer from 'viewerjs';
    import 'viewerjs/dist/viewer.css';
    let viewer: any;
    export function initImageViewer(thumbnail: string = '') {
    // 获取最新的消息框实例
    const msgDom: any = (document as any).getElementById('messageBox');
    // 已加载过
    if (viewer) {
    // 更新实例里的图片源
    viewer.update(msgDom);
    } else { // 第一次加载
    viewer = new Viewer(msgDom, {
    // 只筛选出图片消息
    filter(image: any) {
    const isImgMsg = image.className.indexOf('imageMsg') > -1;
    return isImgMsg;
    },
    // 去掉url中的缩略图参数
    url(image: any) {
    return image.src.replace(thumbnail, '');
    },
    });
    }
    }

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/06/viewerjs%E6%9F%A5%E7%9C%8B%E5%A4%A7%E5%9B%BE%E7%BB%84%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/06/viewerjs%E6%9F%A5%E7%9C%8B%E5%A4%A7%E5%9B%BE%E7%BB%84%E4%BB%B6/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" index 08a19943d..8a38c2429 100644 --- "a/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" +++ "b/2021/02/10/\345\256\236\347\216\260\350\276\223\345\205\245\346\241\206\347\232\204n\347\247\215\345\275\242\345\274\217/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    实现输入框的n种形式

    +}

    实现输入框的n种形式

    开发过程中遇到的新方案

    textarea

    最常见的就是这种形式,不多赘述。代码如下

    @@ -170,4 +170,4 @@

    1
    2
    3
    <pre contenteditable="true">
    可以直接在这里输入.....
    </pre>
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/10/%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84n%E7%A7%8D%E5%BD%A2%E5%BC%8F/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/10/%E5%AE%9E%E7%8E%B0%E8%BE%93%E5%85%A5%E6%A1%86%E7%9A%84n%E7%A7%8D%E5%BD%A2%E5%BC%8F/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" "b/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" index 0250223fa..ceb2a99cf 100644 --- "a/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" +++ "b/2021/02/17/navigator.userAgent\350\216\267\345\217\226\345\275\223\345\211\215\350\256\276\345\244\207\344\277\241\346\201\257/index.html" @@ -159,11 +159,11 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    navigator.userAgent获取当前设备信息

    +}

    navigator.userAgent获取当前设备信息

    获取当前是何设备,来区分不同的事件及渲染模式

    navigator.userAgent

    封装好函数直接调用,利用switch直接进行判断即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    export function currDevice() {
    const u = navigator.userAgent;
    const app = navigator.appVersion; // appVersion 可返回浏览器的平台和版本信息。该属性是一个只读的字符串。
    const browserLang = (navigator.browserLanguage || navigator.language).toLowerCase(); //获取浏览器语言
    const deviceBrowser = (() => {
    return {
    trident: u.indexOf('Trident') > -1, // IE内核
    presto: u.indexOf('Presto') > -1, // opera内核
    webKit: u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核
    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, // 火狐内核
    mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端
    ios: !!u.match(/\(i[^;]+;( U;)? CPU.Mac OS X/), // ios终端
    android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // android终端或者uc浏览器
    iPhone: u.indexOf('iPhone') > -1, // 是否为iPhone或者QQHD浏览器
    iPad: u.indexOf('iPad') > -1, // 是否iPad
    webApp: u.indexOf('Safari') === -1, // 是否web应用程序,没有头部和底部
    weixin: u.indexOf('MicroMessenger') > -1, // 是否微信
    qq: u.match(/\sQQ/i) === "qq", // 是否QQ
    };
    })();
    return deviceBrowser;
    }
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/17/navigator.userAgent%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/17/navigator.userAgent%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" "b/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" index 6c8158970..83665aa2a 100644 --- "a/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" +++ "b/2021/02/21/linear-gradient\345\207\275\346\225\260\345\256\236\347\216\260\347\272\277\346\200\247\346\270\220\345\217\230/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    linear-gradient函数实现线性渐变

    +}

    linear-gradient函数实现线性渐变

    当tab标签超出滚动时,在侧边增加一个渐变透明的框,会使视觉上更加明显,让用户感知到该处可以滑动

    效果对比展示

    原本样式:

    @@ -174,4 +174,4 @@

    渐变透明的小方块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .tab_scroll:before {
    content: '';
    position: absolute;
    right: 0;
    float: right;
    /* border: 1px solid red; */
    height: 66px;
    width: 60px;
    background: linear-gradient(to right, transparent, white);
    }
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/21/linear-gradient%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%E7%BA%BF%E6%80%A7%E6%B8%90%E5%8F%98/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/02/21/linear-gradient%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%E7%BA%BF%E6%80%A7%E6%B8%90%E5%8F%98/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" "b/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" index ecc5c9be9..908245212 100644 --- "a/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" +++ "b/2021/03/01/\346\237\245\347\234\213\344\273\243\347\240\201\350\241\214\346\225\260/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    查看代码行数

    +}

    查看代码行数

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/01/%E6%9F%A5%E7%9C%8B%E4%BB%A3%E7%A0%81%E8%A1%8C%E6%95%B0/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/01/%E6%9F%A5%E7%9C%8B%E4%BB%A3%E7%A0%81%E8%A1%8C%E6%95%B0/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" "b/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" index 8cad010b8..3be9f7c9a 100644 --- "a/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" +++ "b/2021/03/08/\345\212\240\350\275\275\350\201\212\345\244\251\345\216\206\345\217\262\350\256\260\345\275\225\345\271\266\344\277\235\347\225\231\346\273\232\345\212\250\346\235\241\345\275\223\345\211\215\344\275\215\347\275\256/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    加载聊天历史记录并保留滚动条当前位置

    +}

    加载聊天历史记录并保留滚动条当前位置

    在聊天框中,加载历史消息肯定是往消息的上面去加载,即对应数组的Array.unshift()操作,此时默认滚动条会回到顶部,所以我们需要重置滚动条的位置

    Vue中代码实现

    首先记录加载历史前,滚动条的位置scrollHeight

    @@ -175,4 +175,4 @@

    jQuery代码实现

    原理同上,直接上代码

    1
    2
    var scrollHeight = document.getElementById("messageBox").scrollHeight;
    $("#messageBox").scrollTop(document.getElementById("messageBox").scrollHeight - scrollHeight);
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/08/%E5%8A%A0%E8%BD%BD%E8%81%8A%E5%A4%A9%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%B9%B6%E4%BF%9D%E7%95%99%E6%BB%9A%E5%8A%A8%E6%9D%A1%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/08/%E5%8A%A0%E8%BD%BD%E8%81%8A%E5%A4%A9%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%B9%B6%E4%BF%9D%E7%95%99%E6%BB%9A%E5%8A%A8%E6%9D%A1%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" "b/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" index 4190a0708..0a6e3c2c3 100644 --- "a/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" +++ "b/2021/03/17/\347\234\213\345\256\214\350\256\251\344\275\240\345\275\273\345\272\225\346\220\236\346\207\202Websocket\345\216\237\347\220\206/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    【转】看完让你彻底搞懂Websocket原理

    +}

    【转】看完让你彻底搞懂Websocket原理

    最近在学习websocket的时候,从知乎的《WebSocket 是什么原理?为什么可以实现持久连接?》问题下看到了这个回帖,对我的帮助比较大,遂转载到自己的博客

    WebSocket 和 Http

    WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解

    @@ -252,4 +252,4 @@

    点击查看原文

    来源:知乎

    -
    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/17/%E7%9C%8B%E5%AE%8C%E8%AE%A9%E4%BD%A0%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82Websocket%E5%8E%9F%E7%90%86/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +
    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/17/%E7%9C%8B%E5%AE%8C%E8%AE%A9%E4%BD%A0%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82Websocket%E5%8E%9F%E7%90%86/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" "b/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" index 9e8b2add1..c2752156b 100644 --- "a/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" +++ "b/2021/03/25/VSCode\346\263\250\351\207\212\351\253\230\344\272\256\346\217\222\344\273\266BetterComments/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    VSCode注释高亮插件 Better Comments

    +}

    VSCode注释高亮插件 Better Comments

    本文概要

    安装插件

    打开VSCode的插件市场,搜索Better Comments,点击install

    @@ -170,4 +170,4 @@

    使用效果如下所示:

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/25/VSCode%E6%B3%A8%E9%87%8A%E9%AB%98%E4%BA%AE%E6%8F%92%E4%BB%B6BetterComments/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/03/25/VSCode%E6%B3%A8%E9%87%8A%E9%AB%98%E4%BA%AE%E6%8F%92%E4%BB%B6BetterComments/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" index f71c42a15..b37d571bd 100644 --- "a/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" +++ "b/2021/04/02/\351\242\204\351\230\262XSS\346\224\273\345\207\273/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    预防XSS攻击插件 js-xss

    +}

    预防XSS攻击插件 js-xss

    在面向客户开发时,特别是根据客户输入的内容进行入库试,无法预计会输入什么,所以需要对客户输入的内容进行过滤,以免引起不必要的bug甚至数据库崩掉

    参考网站

      @@ -177,4 +177,4 @@

      使用方法

      1
      2
      3
      4
      import { filterXSS } from '@/utils';

      var filterData = filterXSS(res.data);
      console.log(filterData);
      -

      祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/02/%E9%A2%84%E9%98%B2XSS%E6%94%BB%E5%87%BB/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/02/%E9%A2%84%E9%98%B2XSS%E6%94%BB%E5%87%BB/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" "b/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" index 35842b8bd..f86474a69 100644 --- "a/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" +++ "b/2021/04/08/JavaScript\350\277\220\347\256\227\347\254\246\344\274\230\345\205\210\347\272\247/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    JavaScript运算符优先级

    +}

    JavaScript运算符优先级

    运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。

    优先级汇总表

    下面的表将所有运算符按照优先级的不同从高(20+)到低(1)排列。

    @@ -473,4 +473,4 @@

    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    A && B
    // 若A为true,则return B。若A为false,return A

    A || B
    // 若A为true,return A。若A为false,则return B

    false || 3 && 2
    // ||的左侧为false,所以返回(3 && 2)的结果;
    // 又,3为true,所以直接返回2
    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/08/JavaScript%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/04/08/JavaScript%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" "b/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" index 2a966d972..b6ee7c553 100644 --- "a/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" +++ "b/2021/05/24/2021\345\211\215\347\253\257\351\235\242\350\257\225\346\200\273\347\273\223/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    2021前端知识点总结

    +}

    2021前端知识点总结

    目录

    [TOC]

    JavaScript

      @@ -393,4 +393,4 @@

    1. -

      祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/24/2021%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E6%80%BB%E7%BB%93/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/24/2021%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E6%80%BB%E7%BB%93/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" index 869164076..947744a2e 100644 --- "a/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" +++ "b/2021/05/27/Vue3\350\275\256\346\222\255\347\273\204\344\273\266-v3-carousel/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    【个人开源】Vue3 轮播组件: v3-carousel

    +}

    【个人开源】Vue3 轮播组件: v3-carousel

    引水方知开源不易

    与朋友首次开源了一个轮播插件,希望大家积极品尝

    @@ -343,4 +343,4 @@

    npm package
  • github repo
  • -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/05/27/Vue3%E8%BD%AE%E6%92%AD%E7%BB%84%E4%BB%B6-v3-carousel/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" index 343007f83..048f24b06 100644 --- "a/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" +++ "b/2021/07/05/Vue\346\272\220\347\240\201\350\247\243\350\257\273\357\274\210\347\237\245\350\257\206\347\202\271\346\200\273\347\273\223\357\274\211/index.html" @@ -159,7 +159,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    Vue源码解读(知识点总结)

    +}

    Vue源码解读(知识点总结)

    为了方便自己对知识点的巩固和理解,整理了李永宁大佬 12 篇《Vue源码解读》的文末知识点总结,在这里可以一览天下。如果想看详细文章,可点击标题下方的“阅读原文”即可。

    (1)前言

    阅读原文

    @@ -581,4 +581,4 @@

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2021/07/05/Vue%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB%EF%BC%88%E7%9F%A5%E8%AF%86%E7%82%B9%E6%80%BB%E7%BB%93%EF%BC%89/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    Announcement
    This is my Blog
    Contents
    1. 1. (1)前言
    2. 2. (2)Vue 初始化过程
      1. 2.0.1. Vue 的初始化过程(new Vue(options))都做了什么?
  • 3. (3)响应式原理
    1. 3.0.1. Vue 响应式原理是怎么实现的?
    2. 3.0.2. methods、computed 和 watch 有什么区别?
  • 4. (4)异步更新
    1. 4.0.1. Vue 的异步更新机制是如何实现的?
    2. 4.0.2. Vue 的 nextTick API 是如何实现的?
  • 5. (5)全局 API
    1. 5.0.1. Vue.use(plugin) 做了什么?
    2. 5.0.2. Vue.mixin(options) 做了什么?
    3. 5.0.3. Vue.component(compName, Comp) 做了什么?
    4. 5.0.4. Vue.directive(‘my-directive’, {xx}) 做了什么?
    5. 5.0.5. Vue.filter(‘my-filter’, function(val) {xx}) 做了什么?
    6. 5.0.6. Vue.extend(options) 做了什么?
    7. 5.0.7. Vue.set(target, key, val) 做了什么?
    8. 5.0.8. 面试官 问:Vue.delete(target, key) 做了什么?
    9. 5.0.9. Vue.nextTick(cb) 做了什么?
  • 6. (6)实例方法
    1. 6.0.1. 面试官 问:vm.$set(obj, key, val) 做了什么?
    2. 6.0.2. vm.$delete(obj, key) 做了什么?
    3. 6.0.3. vm.$watch(expOrFn, callback, [options]) 做了什么?
    4. 6.0.4. vm.$on(event, callback) 做了什么?
    5. 6.0.5. vm.$emit(eventName, […args]) 做了什么?
    6. 6.0.6. vm.$off([event, callback]) 做了什么?
    7. 6.0.7. vm.$once(event, callback) 做了什么?
    8. 6.0.8. vm._update(vnode, hydrating) 做了什么?
    9. 6.0.9. vm.$forceUpdate() 做了什么?
    10. 6.0.10. vm.$destroy() 做了什么?
    11. 6.0.11. vm.$nextTick(cb) 做了什么?
    12. 6.0.12. vm._render 做了什么?
  • 7. (7)Hook Event
    1. 7.0.1. 什么是 Hook Event?
    2. 7.0.2. Hook Event 是如果实现的?
  • 8. (8)编译器 之 解析
    1. 8.0.1. 面试官 问:简单说一下 Vue 的编译器都做了什么?
    2. 8.0.2. 详细说一说编译器的解析过程,它是怎么将 html 字符串模版变成 AST 对象的?
  • 9. (9)编译器 之 优化
    1. 9.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 9.0.2. 详细说一下静态标记的过程
    3. 9.0.3. 什么样的节点才可以被标记为静态节点?
  • 10. (10)编译器 之 生成渲染函数
    1. 10.0.1. 简单说一下 Vue 的编译器都做了什么?
    2. 10.0.2. 详细说一下渲染函数的生成过程
    3. 10.0.3. 碎碎念
  • 11. (11)render helper
    1. 11.0.1. 一个组件是如何变成 VNode?
  • 12. (12)patch
    1. 12.0.1. 你能说一说 Vue 的 patch 算法吗?
    2. 12.0.2. 碎碎念
  • 13. 作者介绍
  • 14. 祝君无Bug~
  • Recent Posts
    \ No newline at end of file diff --git a/2024/12/30/hello-world/index.html b/2024/12/30/hello-world/index.html index 735a963be..47a4ffd15 100644 --- a/2024/12/30/hello-world/index.html +++ b/2024/12/30/hello-world/index.html @@ -158,7 +158,7 @@ isHighlightShrink: false, isToc: true, pageType: 'post' -}

    Hello World

    Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    +}

    Hello World

    Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    Quick Start

    Create a new post

    1
    $ hexo new "My New Post"

    More info: Writing

    @@ -171,4 +171,4 @@

    Deploy to remote sites

    1
    $ hexo deploy

    More info: Deployment

    -

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2024/12/30/hello-world/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file +

    祝君无Bug~

    Author: 淳淳同学
    Link: https://leedebug.github.io/2024/12/30/hello-world/
    Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
    \ No newline at end of file diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html index 7bba4467d..38c274643 100644 --- a/archives/2020/06/index.html +++ b/archives/2020/06/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html index 02f4f7bbd..6ecf87f22 100644 --- a/archives/2020/07/index.html +++ b/archives/2020/07/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html index 157312ed8..858c66c83 100644 --- a/archives/2020/08/index.html +++ b/archives/2020/08/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 1
    2020
    2020前端面试
    2020前端面试
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html index cc203d06e..94dbe0422 100644 --- a/archives/2020/10/index.html +++ b/archives/2020/10/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 1
    2020
    qiankun 2.0.24 爬坑记录
    qiankun 2.0.24 爬坑记录
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html index 6898c57a8..29f50c1a5 100644 --- a/archives/2020/11/index.html +++ b/archives/2020/11/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 2
    2020
    jsdelivr
    jsdelivr
    中央事件总线插件vue-bus-ts
    中央事件总线插件vue-bus-ts
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html index 45fde2b50..011cd59f1 100644 --- a/archives/2020/12/index.html +++ b/archives/2020/12/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html index c254ff371..eee081ba2 100644 --- a/archives/2020/index.html +++ b/archives/2020/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html index a4a57ed61..aeffa35cf 100644 --- a/archives/2020/page/2/index.html +++ b/archives/2020/page/2/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html index 491adf560..b691a9555 100644 --- a/archives/2021/01/index.html +++ b/archives/2021/01/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html index 58d25b20b..f1fe75ac0 100644 --- a/archives/2021/02/index.html +++ b/archives/2021/02/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html index f87f72095..f7c2232a5 100644 --- a/archives/2021/03/index.html +++ b/archives/2021/03/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html index e1064b2e8..3bc4ec6c4 100644 --- a/archives/2021/04/index.html +++ b/archives/2021/04/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 2
    2021
    JavaScript运算符优先级
    JavaScript运算符优先级
    预防XSS攻击插件 js-xss
    预防XSS攻击插件 js-xss
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html index d04c86d00..d6d2ae20d 100644 --- a/archives/2021/05/index.html +++ b/archives/2021/05/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html index f6737409b..fe4ae5f45 100644 --- a/archives/2021/07/index.html +++ b/archives/2021/07/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 1
    2021
    Vue源码解读(知识点总结)
    Vue源码解读(知识点总结)
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html index 047e6ae3e..89b3099ff 100644 --- a/archives/2021/index.html +++ b/archives/2021/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html index 17e780d89..79e75ff42 100644 --- a/archives/2021/page/2/index.html +++ b/archives/2021/page/2/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/2024/12/index.html b/archives/2024/12/index.html index aeb2b5bfd..44cfb350c 100644 --- a/archives/2024/12/index.html +++ b/archives/2024/12/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 1
    2024
    Hello World
    Hello World
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html index c92d8bedd..c17e9189d 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -5,10 +5,10 @@ - + -
    All Articles - 1
    2024
    Hello World
    Hello World
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/archives/index.html b/archives/index.html index 400079ae4..7c7089f42 100644 --- a/archives/index.html +++ b/archives/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html index 910fba0a4..ab4b6bf46 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html index 36cd6cc83..c0759b3ae 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 8321477eb..e3a3c2a87 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/categories/CSS/index.html b/categories/CSS/index.html index a8eaf329f..250039f73 100644 --- a/categories/CSS/index.html +++ b/categories/CSS/index.html @@ -5,10 +5,10 @@ - + -
    Category - CSS
    2021
    linear-gradient函数实现线性渐变
    linear-gradient函数实现线性渐变
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/categories/Git/index.html b/categories/Git/index.html index 0920e23bd..47c355a90 100644 --- a/categories/Git/index.html +++ b/categories/Git/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/categories/JavaScript/index.html b/categories/JavaScript/index.html index 050a398a7..9913f4627 100644 --- a/categories/JavaScript/index.html +++ b/categories/JavaScript/index.html @@ -5,10 +5,10 @@ - + -
    Category - JavaScript
    2021
    JavaScript运算符优先级
    JavaScript运算符优先级
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/categories/LeetCode/index.html b/categories/LeetCode/index.html index fba7d2def..2ef66fc38 100644 --- a/categories/LeetCode/index.html +++ b/categories/LeetCode/index.html @@ -5,10 +5,10 @@ - + -
    Category - LeetCode
    2020
    LeetCode常见题
    LeetCode常见题
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/categories/Socket/index.html b/categories/Socket/index.html index 2c7d03825..2cbf3fe0f 100644 --- a/categories/Socket/index.html +++ b/categories/Socket/index.html @@ -5,10 +5,10 @@ - + -
    Category - Socket
    2021
    【转】看完让你彻底搞懂Websocket原理
    【转】看完让你彻底搞懂Websocket原理
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/categories/VSCode/index.html b/categories/VSCode/index.html index 4ee38c6e4..7b5602f88 100644 --- a/categories/VSCode/index.html +++ b/categories/VSCode/index.html @@ -5,10 +5,10 @@ - + -
    Category - VSCode
    2021
    VSCode注释高亮插件 Better Comments
    VSCode注释高亮插件 Better Comments
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/categories/Vue/index.html b/categories/Vue/index.html index 398ba87b7..0917bdb11 100644 --- a/categories/Vue/index.html +++ b/categories/Vue/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/categories/Webpack/index.html b/categories/Webpack/index.html index af16bd049..ca68610d9 100644 --- a/categories/Webpack/index.html +++ b/categories/Webpack/index.html @@ -5,10 +5,10 @@ - + -
    Category - Webpack
    2021
    copy-webpack-plugin处理单独js文件
    copy-webpack-plugin处理单独js文件
    2020
    node打包内存溢出
    node打包内存溢出
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index c6d63e4d8..7f91d7f2b 100644 --- a/categories/index.html +++ b/categories/index.html @@ -5,12 +5,12 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/categories/npm/index.html b/categories/npm/index.html index 6f6459bc2..292ce5bc2 100644 --- a/categories/npm/index.html +++ b/categories/npm/index.html @@ -5,10 +5,10 @@ - + -
    Category - npm
    2020
    js-md5
    js-md5
    Announcement
    This is my Blog
    \ No newline at end of file diff --git "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index a82063656..6749675ce 100644 --- "a/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/categories/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/categories/\345\276\256\345\211\215\347\253\257/index.html" "b/categories/\345\276\256\345\211\215\347\253\257/index.html" index 63421b2d0..9e95c0223 100644 --- "a/categories/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/categories/\345\276\256\345\211\215\347\253\257/index.html" @@ -5,10 +5,10 @@ - + -
    Category - 微前端
    2020
    qiankun的css样式污染解决方案
    qiankun的css样式污染解决方案
    qiankun 2.0.24 爬坑记录
    qiankun 2.0.24 爬坑记录
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/categories/\346\234\215\345\212\241\345\231\250/index.html" "b/categories/\346\234\215\345\212\241\345\231\250/index.html" index 169eed536..b472298a8 100644 --- "a/categories/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/categories/\346\234\215\345\212\241\345\231\250/index.html" @@ -5,10 +5,10 @@ - + -
    Category - 服务器
    2020
    Ubuntu 16.04 部署命令
    Ubuntu 16.04 部署命令
    Announcement
    This is my Blog
    \ No newline at end of file diff --git "a/categories/\347\247\273\345\212\250\347\253\257/index.html" "b/categories/\347\247\273\345\212\250\347\253\257/index.html" index 2f3199854..8b247040a 100644 --- "a/categories/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/categories/\347\247\273\345\212\250\347\253\257/index.html" @@ -5,10 +5,10 @@ - + -
    Category - 移动端
    2021
    navigator.userAgent获取当前设备信息
    navigator.userAgent获取当前设备信息
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index 69b123f94..9f6dd17df 100644 --- "a/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/categories/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -5,10 +5,10 @@ - + -
    Category - 读书笔记
    2020
    你不知道的JavaScript(上卷)
    你不知道的JavaScript(上卷)
    《前端内参》读书笔记
    《前端内参》读书笔记
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/categories/\351\235\242\350\257\225/index.html" "b/categories/\351\235\242\350\257\225/index.html" index c906c52f8..2a4a600df 100644 --- "a/categories/\351\235\242\350\257\225/index.html" +++ "b/categories/\351\235\242\350\257\225/index.html" @@ -5,10 +5,10 @@ - + -
    Category - 面试
    2021
    2021前端知识点总结
    2021前端知识点总结
    2020
    2020前端面试
    2020前端面试
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/css/index.css b/css/index.css index 727fc47d1..e9a4ad22a 100644 --- a/css/index.css +++ b/css/index.css @@ -1395,6 +1395,16 @@ body { input::placeholder { color: var(--font-color); } +#web_bg { + position: fixed; + z-index: -999; + width: 100%; + height: 100%; + background-attachment: local; + background-position: center; + background-size: cover; + background-repeat: no-repeat; +} h1, h2, h3, @@ -3339,7 +3349,6 @@ figure.highlight pre .javascript .function { #page-header { position: relative; width: 100%; - background-color: #49b1f5; background-position: center center; background-size: cover; background-repeat: no-repeat; @@ -3349,13 +3358,6 @@ figure.highlight pre .javascript .function { -ms-transition: all 0.5s; transition: all 0.5s; } -#page-header:not(.not-top-img):before { - position: absolute; - width: 100%; - height: 100%; - background-color: var(--mark-bg); - content: ''; -} #page-header.full_page { height: 100vh; background-attachment: fixed; diff --git a/index.html b/index.html index ffde14fca..ea7bc83b7 100644 --- a/index.html +++ b/index.html @@ -5,10 +5,10 @@ - + -
    【个人开源】Vue3 轮播组件: v3-carousel
    Hello World
    Vue源码解读(知识点总结)
    2021前端知识点总结
    JavaScript运算符优先级
    预防XSS攻击插件 js-xss
    VSCode注释高亮插件 Better Comments
    【转】看完让你彻底搞懂Websocket原理
    加载聊天历史记录并保留滚动条当前位置
    查看代码行数
    Announcement
    This is my Blog
    Recent Posts
    +}
    【个人开源】Vue3 轮播组件: v3-carousel
    Hello World
    Vue源码解读(知识点总结)
    2021前端知识点总结
    JavaScript运算符优先级
    预防XSS攻击插件 js-xss
    VSCode注释高亮插件 Better Comments
    【转】看完让你彻底搞懂Websocket原理
    加载聊天历史记录并保留滚动条当前位置
    查看代码行数
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index eb5ac2b55..7a4fbf1f6 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -5,10 +5,10 @@ - + -
    linear-gradient函数实现线性渐变
    navigator.userAgent获取当前设备信息
    实现输入框的n种形式
    viewerjs查看大图组件
    修改element-ui的全局配置
    安卓微信浏览器中type=file的input框无法使用
    copy-webpack-plugin处理单独js文件
    vue3的生命周期钩子
    git仓库推送脚本(本地简易版)
    qiankun的css样式污染解决方案
    Announcement
    This is my Blog
    Recent Posts
    +}
    linear-gradient函数实现线性渐变
    navigator.userAgent获取当前设备信息
    实现输入框的n种形式
    viewerjs查看大图组件
    修改element-ui的全局配置
    安卓微信浏览器中type=file的input框无法使用
    copy-webpack-plugin处理单独js文件
    vue3的生命周期钩子
    git仓库推送脚本(本地简易版)
    qiankun的css样式污染解决方案
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 479366faa..c991793f9 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -5,10 +5,10 @@ - + -
    GitHub Corners
    git贡献墙 gitcalendar
    Mac配置多个SSH-Key
    node打包内存溢出
    git推送后没有贡献记录
    jsdelivr
    中央事件总线插件vue-bus-ts
    qiankun 2.0.24 爬坑记录
    2020前端面试
    你不知道的JavaScript(上卷)
    Announcement
    This is my Blog
    Recent Posts
    +}
    GitHub Corners
    git贡献墙 gitcalendar
    Mac配置多个SSH-Key
    node打包内存溢出
    git推送后没有贡献记录
    jsdelivr
    中央事件总线插件vue-bus-ts
    qiankun 2.0.24 爬坑记录
    2020前端面试
    你不知道的JavaScript(上卷)
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index 862010943..464ebbe67 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -5,10 +5,10 @@ - + -
    Ubuntu 16.04 部署命令
    LeetCode常见题
    《前端内参》读书笔记
    前端个人学习笔记与项目规范
    程序员进修文档
    js-md5
    从0开始搭建Hexo个人博客
    Announcement
    This is my Blog
    Recent Posts
    +}
    Ubuntu 16.04 部署命令
    LeetCode常见题
    《前端内参》读书笔记
    前端个人学习笔记与项目规范
    程序员进修文档
    js-md5
    从0开始搭建Hexo个人博客
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/resume/index.html b/resume/index.html index b584819d0..28676cbd1 100644 --- a/resume/index.html +++ b/resume/index.html @@ -1,16 +1,16 @@ -个人简历 | 淳淳同学的个人博客 +个人简历 | 淳淳同学的个人博客 - + - + -

    壹。 自我介绍

    个人信息

    +
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/CSS/index.html b/tags/CSS/index.html index f99463d69..b132302ae 100644 --- a/tags/CSS/index.html +++ b/tags/CSS/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html index b1a241641..b628f2152 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html index 611f44e97..051b8fc11 100644 --- a/tags/JavaScript/index.html +++ b/tags/JavaScript/index.html @@ -5,10 +5,10 @@ - + -
    Tag - JavaScript
    2021
    JavaScript运算符优先级
    JavaScript运算符优先级
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/tags/LeetCode/index.html b/tags/LeetCode/index.html index f8e20f1d4..72447ef3c 100644 --- a/tags/LeetCode/index.html +++ b/tags/LeetCode/index.html @@ -5,10 +5,10 @@ - + -
    Tag - LeetCode
    2020
    LeetCode常见题
    LeetCode常见题
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/tags/Socket/index.html b/tags/Socket/index.html index 5fee65899..8530ca001 100644 --- a/tags/Socket/index.html +++ b/tags/Socket/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/VSCode/index.html b/tags/VSCode/index.html index d606a91d6..a71d45cd5 100644 --- a/tags/VSCode/index.html +++ b/tags/VSCode/index.html @@ -5,10 +5,10 @@ - + -
    Tag - VSCode
    2021
    VSCode注释高亮插件 Better Comments
    VSCode注释高亮插件 Better Comments
    Announcement
    This is my Blog
    \ No newline at end of file diff --git a/tags/Vue/index.html b/tags/Vue/index.html index 2fae265da..4c91f59ef 100644 --- a/tags/Vue/index.html +++ b/tags/Vue/index.html @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    +}
    \ No newline at end of file +
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git a/tags/Webpack/index.html b/tags/Webpack/index.html index 316d94a38..fb983d497 100644 --- a/tags/Webpack/index.html +++ b/tags/Webpack/index.html @@ -5,10 +5,10 @@ - + -
    Tag - Webpack
    2021
    copy-webpack-plugin处理单独js文件
    copy-webpack-plugin处理单独js文件
    2020
    node打包内存溢出
    node打包内存溢出
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index b7bae148f..9f2e2dedf 100644 --- a/tags/index.html +++ b/tags/index.html @@ -5,12 +5,12 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git a/tags/npm/index.html b/tags/npm/index.html index 792e900e5..08005d71a 100644 --- a/tags/npm/index.html +++ b/tags/npm/index.html @@ -5,10 +5,10 @@ - + -
    Tag - npm
    2020
    js-md5
    js-md5
    Announcement
    This is my Blog
    \ No newline at end of file diff --git "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" index 2ae2b1d64..88e9ff954 100644 --- "a/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" +++ "b/tags/\344\270\252\344\272\272\346\226\207\346\241\243/index.html" @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/tags/\345\276\256\345\211\215\347\253\257/index.html" "b/tags/\345\276\256\345\211\215\347\253\257/index.html" index f7f404b1f..7c601c428 100644 --- "a/tags/\345\276\256\345\211\215\347\253\257/index.html" +++ "b/tags/\345\276\256\345\211\215\347\253\257/index.html" @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/tags/\346\234\215\345\212\241\345\231\250/index.html" "b/tags/\346\234\215\345\212\241\345\231\250/index.html" index 7ff17f706..1e6ad985a 100644 --- "a/tags/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/tags/\346\234\215\345\212\241\345\231\250/index.html" @@ -5,10 +5,10 @@ - + -
    Tag - 服务器
    2020
    Ubuntu 16.04 部署命令
    Ubuntu 16.04 部署命令
    Announcement
    This is my Blog
    \ No newline at end of file diff --git "a/tags/\347\247\273\345\212\250\347\253\257/index.html" "b/tags/\347\247\273\345\212\250\347\253\257/index.html" index 06939c747..a5a416342 100644 --- "a/tags/\347\247\273\345\212\250\347\253\257/index.html" +++ "b/tags/\347\247\273\345\212\250\347\253\257/index.html" @@ -5,10 +5,10 @@ - + -
    Tag - 移动端
    2021
    navigator.userAgent获取当前设备信息
    navigator.userAgent获取当前设备信息
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" index 9ead49048..7b812d796 100644 --- "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" +++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" @@ -5,10 +5,10 @@ - + -
    Announcement
    This is my Blog
    Recent Posts
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" index 180c32f13..53ed9d4b6 100644 --- "a/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" +++ "b/tags/\351\235\242\350\257\225-Vue-JavaScript/index.html" @@ -5,10 +5,10 @@ - + -
    Tag - 面试,Vue,JavaScript
    2021
    2021前端知识点总结
    2021前端知识点总结
    Announcement
    This is my Blog
    Recent Posts
    Website Info
    Article Count :
    37
    Unique Visitors :
    Page Views :
    Last Update :
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225/index.html" "b/tags/\351\235\242\350\257\225/index.html" index c3456b9df..4513292cd 100644 --- "a/tags/\351\235\242\350\257\225/index.html" +++ "b/tags/\351\235\242\350\257\225/index.html" @@ -5,10 +5,10 @@ - + -
    Tag - 面试
    2020
    2020前端面试
    2020前端面试
    Announcement
    This is my Blog
    \ No newline at end of file