├── .gitignore
├── posts
├── Vue源码学习
│ └── mvvm.png
├── babel
│ ├── babel.png
│ └── babel-parse-1.png
├── 【面试题】http
│ ├── 三次握手.png
│ ├── 四次挥手.png
│ ├── https.webp
│ └── osi七层模型.jpeg
├── 【面试题】浏览器
│ └── part1.png
├── 【面试题】设计模式
│ ├── mvc.webp
│ ├── mvp.webp
│ └── mvvm.webp
├── 算法学习-递归
│ ├── 96_BST.png
│ └── merge_ex1.jpg
├── graphql入门
│ └── graphql.png
├── 【面试题】node
│ └── libuv.png
├── 【面试题】服务端渲染
│ └── reactSSR.png
├── 算法学习-链表
│ ├── remove_ex1.jpg
│ └── single_link.png
├── webpack的树摇功能使用
│ ├── after.png
│ └── before.png
├── 【js高级程序】变量、作用域与内存
│ ├── 值复制.png
│ └── 引用复制.png
├── 【面试题】js基础
│ └── object-push.png
├── 个人通用js方法库d-js-utils
│ └── bg.png
├── 个人网站2-0版本总结个未来规划
│ ├── html1.0.jpg
│ └── html2.0.jpg
├── 提升页面性能的n种方法
│ ├── defer&async.jpeg
│ └── preconnect.webp
├── hooks的学习和使用
│ └── useLayoutEffect.png
├── javascript事件循环
│ └── event-loop.jpg
├── 【面试题】微前端.md
├── Content-Security-Policy
│ ├── meta1.png
│ ├── meta_error.png
│ ├── style_src.png
│ ├── config_result.jpg
│ ├── nginx_csp_self.png
│ └── res_nginx_conf.png
├── 前端跨域的处理方案.md
├── typescript-泛型.md
├── 【面试题】vue.md
├── IOS快速获取验证信息重复显示的问题.md
├── 一句话调试你的CSS层.md
├── html页面在360极速浏览器兼容模式显示问题解决方法.md
├── webpack4-0-安装-extract-text-webpack-plugin-报错.md
├── 【面试题】web安全.md
├── web安全-SQL注入.md
├── h5新标签学习.md
├── web安全-点击劫持.md
├── code格式校验.md
├── 一个vue搭建的history模式的活动页项目.md
├── 伪数组.md
├── 关于ruby安装-sass-compass报错的问题.md
├── 2020总结.md
├── 【面试题】设计模式.md
├── 2019总结.md
├── 关于移动端按钮点击的交互.md
├── 【面试题】面试题相关文章地址收集.md
├── css3的blur如何消除边缘透明效果.md
├── 对象实例化的时候经历了什么?.md
├── webpack的树摇功能使用.md
├── h5的后台切换到前台的数据更新.md
├── 正则学习.md
├── 递归.md
├── 【面试题】服务端渲染.md
├── TypeScript初识.md
├── web安全-XSS.md
├── web安全-CSRF.md
├── 关于闭包.md
├── babel-plugin-transform-runtime与-babel-plugin-external-helpers.md
├── English learning record.md
├── 个人网站2-0版本总结个未来规划.md
├── 个人通用js方法库d-js-utils.md
├── 【js高级程序】工作者线程-SharedWorker.md
├── typescript发布npm包添加代码提示.md
├── 【面试题】异步.md
├── javascript事件循环.md
├── TypeScript接口,类,函数.md
├── 如何减少webpack4打包时长.md
├── 【面试题】css.md
├── Vue源码学习.md
├── 手写一个简单的发布订阅者模式.md
├── 常用的排序方式有哪些?.md
├── 手写call,apply,bind方法.md
├── docker学习记录.md
├── 关于cookie.md
├── 前端模块化规范.md
├── 【js高级程序】错误处理与调试.md
├── 【面试题】node.md
├── d-video.js视频播放器.md
├── DOM & BOM.md
├── 提升页面性能的n种方法.md
├── 【面试题】typescript.md
├── 对象的继承方式.md
├── 【js高级程序】DOM扩展.md
├── javascript异步编程.md
├── javascript需要注意的this指向问题.md
├── 【js高级程序】模块.md
├── js数据类型转换.md
├── Content-Security-Policy.md
├── 【js高级程序】变量、作用域与内存.md
├── 面试中的那些手写代码题目.md
├── 日志监控.md
├── 算法学习-递归.md
├── 【js高级程序】客户端检测.md
├── css-module.md
└── graphql入门.md
├── pnpm-lock.yaml
├── package.json
├── init.js
└── readme.md
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
--------------------------------------------------------------------------------
/posts/Vue源码学习/mvvm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Vue源码学习/mvvm.png
--------------------------------------------------------------------------------
/posts/babel/babel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/babel/babel.png
--------------------------------------------------------------------------------
/posts/【面试题】http/三次握手.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】http/三次握手.png
--------------------------------------------------------------------------------
/posts/【面试题】http/四次挥手.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】http/四次挥手.png
--------------------------------------------------------------------------------
/posts/【面试题】浏览器/part1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】浏览器/part1.png
--------------------------------------------------------------------------------
/posts/【面试题】设计模式/mvc.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】设计模式/mvc.webp
--------------------------------------------------------------------------------
/posts/【面试题】设计模式/mvp.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】设计模式/mvp.webp
--------------------------------------------------------------------------------
/posts/算法学习-递归/96_BST.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/算法学习-递归/96_BST.png
--------------------------------------------------------------------------------
/posts/graphql入门/graphql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/graphql入门/graphql.png
--------------------------------------------------------------------------------
/posts/【面试题】http/https.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】http/https.webp
--------------------------------------------------------------------------------
/posts/【面试题】node/libuv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】node/libuv.png
--------------------------------------------------------------------------------
/posts/【面试题】设计模式/mvvm.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】设计模式/mvvm.webp
--------------------------------------------------------------------------------
/posts/算法学习-递归/merge_ex1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/算法学习-递归/merge_ex1.jpg
--------------------------------------------------------------------------------
/posts/babel/babel-parse-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/babel/babel-parse-1.png
--------------------------------------------------------------------------------
/posts/【面试题】http/osi七层模型.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】http/osi七层模型.jpeg
--------------------------------------------------------------------------------
/posts/【面试题】服务端渲染/reactSSR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】服务端渲染/reactSSR.png
--------------------------------------------------------------------------------
/posts/算法学习-链表/remove_ex1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/算法学习-链表/remove_ex1.jpg
--------------------------------------------------------------------------------
/posts/算法学习-链表/single_link.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/算法学习-链表/single_link.png
--------------------------------------------------------------------------------
/posts/webpack的树摇功能使用/after.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/webpack的树摇功能使用/after.png
--------------------------------------------------------------------------------
/posts/webpack的树摇功能使用/before.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/webpack的树摇功能使用/before.png
--------------------------------------------------------------------------------
/posts/【js高级程序】变量、作用域与内存/值复制.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【js高级程序】变量、作用域与内存/值复制.png
--------------------------------------------------------------------------------
/posts/【js高级程序】变量、作用域与内存/引用复制.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【js高级程序】变量、作用域与内存/引用复制.png
--------------------------------------------------------------------------------
/posts/【面试题】js基础/object-push.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/【面试题】js基础/object-push.png
--------------------------------------------------------------------------------
/posts/个人通用js方法库d-js-utils/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/个人通用js方法库d-js-utils/bg.png
--------------------------------------------------------------------------------
/posts/个人网站2-0版本总结个未来规划/html1.0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/个人网站2-0版本总结个未来规划/html1.0.jpg
--------------------------------------------------------------------------------
/posts/个人网站2-0版本总结个未来规划/html2.0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/个人网站2-0版本总结个未来规划/html2.0.jpg
--------------------------------------------------------------------------------
/posts/提升页面性能的n种方法/defer&async.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/提升页面性能的n种方法/defer&async.jpeg
--------------------------------------------------------------------------------
/posts/提升页面性能的n种方法/preconnect.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/提升页面性能的n种方法/preconnect.webp
--------------------------------------------------------------------------------
/posts/hooks的学习和使用/useLayoutEffect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/hooks的学习和使用/useLayoutEffect.png
--------------------------------------------------------------------------------
/posts/javascript事件循环/event-loop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/javascript事件循环/event-loop.jpg
--------------------------------------------------------------------------------
/posts/【面试题】微前端.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】微前端
3 | date: 2021-03-29 18:51:32
4 | categories: 微前端
5 | tags: [微前端, 面试]
6 | ---
7 |
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/meta1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/meta1.png
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/meta_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/meta_error.png
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/style_src.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/style_src.png
--------------------------------------------------------------------------------
/posts/前端跨域的处理方案.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 前端跨域的处理方案
3 | date: 2019-10-22 17:07:47
4 | categories: JavaScript
5 | tags: ['js']
6 | ---
7 |
8 |
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/config_result.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/config_result.jpg
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/nginx_csp_self.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/nginx_csp_self.png
--------------------------------------------------------------------------------
/posts/Content-Security-Policy/res_nginx_conf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IFmiss/blog/master/posts/Content-Security-Policy/res_nginx_conf.png
--------------------------------------------------------------------------------
/posts/typescript-泛型.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: typescript 泛型
3 | date: 2019-11-20 22:03:39
4 | categories: typescript
5 | tags: [ts]
6 | ---
7 |
8 | ### 关于泛型
9 | 泛型是很多程序语言的一大特点,泛型在强类型程序代码中做的一种数据类型规范,javascript并不支持范型,但是ts支持
10 |
--------------------------------------------------------------------------------
/posts/【面试题】vue.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】Vue
3 | date: 2021-04-14 20:55:49
4 | categories: typescript
5 | tags: [typescript, 面试]
6 | ---
7 |
8 | ### 双向绑定原理
9 |
10 | ### 模版编译原理
11 |
12 | ### diff 算法
13 |
14 | ### 2.0 数组如何实现监听
15 |
16 | ### computed 原理,与 `wathcher` 的区别
17 |
18 | ### nextTick 原理
19 |
20 | ### keep-alive 原理
21 |
--------------------------------------------------------------------------------
/posts/IOS快速获取验证信息重复显示的问题.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: IOS快速获取验证信息重复显示的问题
3 | date: 2019-03-08 22:49:21
4 | categories: javascript
5 | tags: [小技巧, js]
6 | ---
7 |
8 | IOS下在获取手机号短信验证码的时候,ios在键盘上会自动显示验证码内容,以达到快速填写的功能,但是正常的input输入框会重复显示
9 | -
10 | 解决方法
11 | ```html
12 |
13 | ```
14 | input的maxlength属性设置一个最大值,4 或者 6 等等,验证码多少位值设置为多少
15 |
--------------------------------------------------------------------------------
/posts/一句话调试你的CSS层.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 一句话调试你的CSS层
3 | date: 2017-10-12 12:08:46
4 | categories: javascript
5 | tags: [小技巧]
6 | ---
7 |
8 | 这是我在网上看到的一篇文章这段代码是谷歌“名猿”Addy Osmani放出来的
9 | ```js
10 | [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) }); //选取所有的元素,给每个元素加个边框(随机色)
11 | ```
12 | 执行所有的dom元素添加一个随机的outline
13 |
--------------------------------------------------------------------------------
/posts/html页面在360极速浏览器兼容模式显示问题解决方法.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: html页面在360极速浏览器兼容模式显示问题解决方法
3 | date: 2016-9-13 12:51:37
4 | categories: html
5 | tags: [小技巧]
6 | ---
7 |
8 | 自己在写一个页面的时候,涉及到一些css3动画的效果,在360极速兼容模式上显示出现问题:
9 | ```html
10 |
11 |
12 | ```
13 | 这样就基本上解决了大多在360极速模式上出现的问题!
14 |
--------------------------------------------------------------------------------
/posts/webpack4-0-安装-extract-text-webpack-plugin-报错.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: webpack4.0 安装 extract-text-webpack-plugin 报错
3 | date: 2018-3-16 11:59:00
4 | categories: 环境配置
5 | tags: [webpack, npm]
6 | ---
7 |
8 | 最近研究webpack相关配置在搭建通用的webpack项目时候用到extract-text-webpack-plugin,npm install extract-text-webpack-plugin –save-dev之后run 这个项目的时候发现服务启动出错,查找原因后发现,由于webpack升级到4.0以后,extract-text-webpack-plugin默认安装的是3.几的版本,于是执行下面命令行
9 |
10 | ``` npm
11 | npm install extract-text-webpack-plugin@next
12 | ```
13 |
14 | 再次尝试运行项目就可以成功跑起来了
15 |
--------------------------------------------------------------------------------
/posts/【面试题】web安全.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】web安全
3 | date: 2021-03-29 18:49:43
4 | categories: web安全
5 | tags: [web安全, 面试]
6 | ---
7 |
8 | ### 你知道哪些攻击方式?
9 |
10 | - [XSS,跨站脚本攻击](https://www.daiwei.site/blog/detail?tid=2f3c39e2-7361-11eb-aac6-00163e0aa4af)
11 | - [CSRF,跨站点请求伪造](https://www.daiwei.site/blog/detail?tid=2f3c3a54-7361-11eb-aac6-00163e0aa4af)
12 | - [XSS,点击劫持](https://www.daiwei.site/blog/detail?tid=2f3c3ac6-7361-11eb-aac6-00163e0aa4af)
13 | - [XSS,SQL 注入](https://www.daiwei.site/blog/detail?tid=2f3c3b3c-7361-11eb-aac6-00163e0aa4af)
14 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.3
2 |
3 | specifiers:
4 | chalk: ^5.0.0
5 | dateformat: ^5.0.2
6 |
7 | devDependencies:
8 | chalk: 5.0.0
9 | dateformat: 5.0.2
10 |
11 | packages:
12 |
13 | /chalk/5.0.0:
14 | resolution: {integrity: sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==}
15 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
16 | dev: true
17 |
18 | /dateformat/5.0.2:
19 | resolution: {integrity: sha512-h9vywpuz+ReixnJTwFx5JLtZpS8eLCbRm8shwwKkCKOZA547N6yoMtD3W91Z6+NFZ8wOaZlcaCcK/w+kELhSVg==}
20 | engines: {node: '>=12.20'}
21 | dev: true
22 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dw-blog",
3 | "version": "1.0.0",
4 | "description": "daiwei's blog",
5 | "main": "init.js",
6 | "type": "module",
7 | "scripts": {
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/IFmiss/blog.git"
13 | },
14 | "author": "",
15 | "license": "ISC",
16 | "bugs": {
17 | "url": "https://github.com/IFmiss/blog/issues"
18 | },
19 | "homepage": "https://github.com/IFmiss/blog#readme",
20 | "devDependencies": {
21 | "chalk": "^5.0.0",
22 | "dateformat": "^5.0.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/posts/web安全-SQL注入.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: web安全-SQL注入
3 | date: 2020-10-14 16:07:57
4 | categories: web安全
5 | tags: [web安全]
6 | ---
7 |
8 | ### 举例
9 | 例如登陆请求
10 | 输入用户名和密码登陆用户信息,基本上会执行这个sql语句
11 | ```sql
12 | select * from tb_user_info Where 'username' = 'dw' and 'password' = '123'
13 | ```
14 | 但是如果输入
15 | username: `'' or 1 = 1 --`
16 | password: `''`
17 |
18 | ```sql
19 | select * from tb_user_info Where 'username' = '' or 1 = 1 and 'password' = ''
20 | ```
21 |
22 | ### 原理
23 | 主要是攻击者,利用被攻击页面的一些漏洞,改变数据库执行的SQL语句,从而达到获取“非授权信息”的目的。
24 |
25 | ### SQL防御方式
26 | ##### 转义符号
27 | 针对前端在表单提交之前进行数据格式校验
28 |
29 | ##### 服务端sql转译
30 | 后端采用sql语句预编译和绑定变量,是防御sql注入的最佳方法
31 |
--------------------------------------------------------------------------------
/posts/h5新标签学习.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: h5新标签学习
3 | date: 2020-10-18 19:51:30
4 | categories: html
5 | tags: [html5]
6 | ---
7 |
8 | 由于平时业务中基本所有元素,感觉h5很多新元素都没有被使用而且也不是特别熟悉,这篇文章则是学习一下html标签
9 |
10 | ### article
11 | 标签规定独立的自包含内容。比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本。亦或是来自其他外部源内容。
12 | ```html
13 |
14 | G2 3 比 0 战胜 GEN.G
15 | G2 也太强了
16 |
17 | ```
18 |
19 | ### aside
20 | 标签定义其所处内容之外的内容。
21 | - 其中的内容可以是与当前文章有关的相关资料、名次解
22 | - 在article元素之外使用作为页面或站点全局的附属信息部分
23 | > <aside> 的内容可用作文章的侧栏。
24 |
25 | ### audio
26 | 音频播放标签,比较常用
27 |
28 | ### bdi
29 | 标签允许您设置一段文本,使其脱离其父元素的文本方向设置。
30 |
31 | ```html
32 |
你好,html5
33 | 你好,html5
34 | ```
35 | > 了解下Unicode双向算法
36 |
37 | ###
38 |
39 |
40 |
--------------------------------------------------------------------------------
/posts/web安全-点击劫持.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: web安全-点击劫持
3 | date: 2020-10-14 16:04:12
4 | categories: web安全
5 | tags: [web安全]
6 | ---
7 |
8 | ### 点击劫持
9 | 通过覆盖不可见的框架误导受害者点击,比如页面上放置一个frame页面,并设置透明度为0,用户点击按钮的时候(该按钮被攻击者精心准备过,模拟原网页的按钮,诱导用户点击)
10 |
11 | ### 实现原理
12 | `iframe` 透明嵌入到网页中,诱导用户点击
13 |
14 | ### 应对方法
15 | #### 针对`iframe`内嵌可以设置 `X-Frame-Options`
16 | X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, <iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
17 |
18 | ```nginx
19 | add_header x-frame-options SAMEORIGIN;
20 | ```
21 | 请求头设置 `SAMEORIGIN`
22 | - `DENY`
23 | 不允许在frame中展示,即便是在相同域名的页面中嵌套也不允许
24 | - `SAMEORIGIN`
25 | 该页面可以在相同域名页面的frame中展示
26 | - `ALLOW-FROM uri`
27 | 指定来源的frame中展示,逗号分割设置多选域名
28 | ```nginx
29 | add_header X-Frame-Options "ALLOW-FROM http://w1.daiwei.com/,https://www.daiwei.site";
30 | ```
31 |
--------------------------------------------------------------------------------
/posts/code格式校验.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: code格式校验
3 | date: 2020-12-22 13:32:40
4 | categories: 工程化
5 | tags: [工程化]
6 | ---
7 |
8 | ### 代码美化工具 prettier
9 | 全局或者本地安装
10 | ```code
11 | npm i prettier -g
12 | ```
13 | or
14 | ```code
15 | npm i prettier --save-dev
16 | ```
17 |
18 | 目录下配置 `prettier.config.js`
19 | ```js
20 | module.exports = {
21 | // 多行时使用尾后逗号,默认为"es5" "none" | "es5" | "all"
22 | trailingComma: "es5",
23 | // 缩进宽度
24 | tabWidth: 2,
25 | // 是否使用分号,默认为true
26 | semi: true,
27 | // 是否使用单引号包裹字符串,默认为false
28 | singleQuote: true,
29 | // 列宽,默认为80
30 | printWidth: 80,
31 | };
32 | ```
33 | 更多配置见: https://prettier.io/docs/en/options.html
34 |
35 | #### prettier vscode
36 | vscode 安装 prettier - code formatter 根据 vscode 配置 `Editor: Format On Save` 为true 支持保存自动格式话代码
37 | > vs code 优先按项目根目录配置进行格式化,没有则使用vs code 安装 prettier 的默认配置
38 |
39 | #### prettier script 配置
40 |
41 | > prettier 专注格式美化,不做代码质量校验,所以eslint 该用还得用
42 |
43 | ### eslint 校验
44 |
45 |
--------------------------------------------------------------------------------
/posts/一个vue搭建的history模式的活动页项目.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 一个vue搭建的history模式的活动页项目
3 | date: 2019-03-08 23:06:58
4 | categories: vue
5 | tags: [vue]
6 | ---
7 |
8 | vue单页面应用我一直觉得适合做移动端项目,尤其是微信端的活动页那种活动
9 | 原因是
10 |
11 | - vue有通用的cli脚手架,有vue全家桶, 虽然当下的主流框架都有,但是vue应该是最容易上手的一个了
12 | - vue适合这种小型的项目,页面10个一下,少量的状态管理,稍微复杂的条件显示机制以及状态判断
13 |
14 | 可是我就是在用vue去写微信h5的时候遇到了一些坑。。。
15 |
16 | #### 1.移动端适配
17 | 移动端适配对于前端已经是不能再熟悉的了,比较主流的就是动态设置html的字体大小,以rem的单位来写页面,但是这有个问题,ipad上怎么做兼容,屏幕越大,显示越大,文字越大,图片也达到本身宽度导致显示模糊
18 |
19 | #### 2.路由模式
20 | 这次项目使用的是history模式,运维那边已经配置好了nginx代理,所有指向当前目录下的子目录都会指向index.html,但是前端打包发布一直没法达到真正的效果,页面不显示,最后是打包的配置,以及路由的base属性没有设置导致的
21 |
22 | #### 3.微信授权
23 | 在这之前,我做的微信授权都是后端处理的,做跳转的,所有授权操作后端一个人完成,现在是用微信跳转获取code,code请求接口种植session来验证用户信息
24 |
25 | #### 4.微信分享
26 | vue的微信分享还是很坑的,正常的情况在获取微信jssdk授权之后,分享应该是可以调用的,但是作为但页面应用,微信授权在ios下会出现签名失败的情况,网上也搜索了很多方法,方法就是记录第一次的页面地址,之后每次初始化分享的时候,获取微信jssdk授权地址为第一次的入口地址即可
27 |
28 | #### 5.路由拦截
29 | 涉及到不同页面的状态进入不同页面,虽然主入口都一样,但是需要在进入之前就判断跳转到哪个页面就需要用到路由拦截,配合各种条件执行不同的next()
30 |
--------------------------------------------------------------------------------
/posts/伪数组.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 伪数组
3 | date: 2019-10-15 14:58:29
4 | categories: javascript
5 | tags: [js]
6 | ---
7 |
8 | ### 什么是伪数组
9 | - 拥有数组的length属性
10 | - 没有Array的方法 (slice, pop, push...)
11 | - 使用索引存储数据
12 | - `Array.isArray` 返回false
13 |
14 | ### 伪数组存在的场景
15 | - 函数参数 (返回一个 Arguments的伪数组)
16 | ```ts
17 | function TestArray () {
18 | console.log(arguments)
19 | return arguments
20 | }
21 |
22 | TestArray(1, 2, 3, 4)
23 | ```
24 |
25 | - Dom 元素 (返回一个 HTMLCollection的伪数组)
26 | ```ts
27 | document.getElementsByTagName('div')
28 | ```
29 |
30 | ### 伪数组转换正常数组的方法
31 | - Array.prototype.slice.call
32 | ```ts
33 | Array.prototype.slice.call(TestArray(1, 2, 3, 4))
34 | [].slice.call(TestArray(1, 2, 3, 4))
35 | ```
36 |
37 | - Array.from
38 | ```ts
39 | Array.from(TestArray(1, 2, 3, 4))
40 | ```
41 |
42 | - Array.prototype.push.apply
43 | ```ts
44 | const newArr = Array.prototype.push.apply(TestArray(1, 2, 3, 4))
45 | const newArr = [].push(TestArray(1, 2, 3, 4))
46 | ```
47 |
--------------------------------------------------------------------------------
/posts/关于ruby安装-sass-compass报错的问题.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 关于ruby安装 sass compass报错的问题
3 | date: 2016-11-20 12:03:28
4 | categories: css相关
5 | tags: [css]
6 | ---
7 |
8 | 最近硬盘损坏系统被迫重做,之前所有的代码环境,都得重新配置,其中在安装sass compass需要用到ruby的情况下就一直没办法安装成功,真的三个晚上的研究,终于找到真相了!
9 | 之前报错原因如下:
10 | ```js
11 | Error fetching https://ruby.taobao.org/:
12 | SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://gems.ruby-china.org/specs.4.8.gz)
13 | ```
14 |
15 | 网上查了下,说是被墙了,解决方法就是,把之前的源给删除掉,用淘宝的源:
16 | ```npm
17 | gem sources –remove https://rubygems.org/ // 删除原来的地址
18 | ```
19 |
20 | ```npm
21 | gem sources -a https://ruby.taobao.org/
22 | ```
23 |
24 | 换完了之后我以为这样就可以了, gem install sass还是报错
25 |
26 | ```js
27 | Error fetching http://ruby.taobao.org/:
28 | bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
29 | ```
30 |
31 | 找了好久发现:
32 | taobao Gems 源已停止维护,现由 ruby-china 提供镜像服务
33 | 最后就是换了一个源地址
34 | ```code
35 | gem sources -a https://gems.ruby-china.org/
36 | ```
37 | 就可以了,就成功了,所以源地址已经更新到 ruby-china 了
--------------------------------------------------------------------------------
/posts/2020总结.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 2020总结
3 | date: 2021-02-04 14:44:54
4 | categories: 总结
5 | tags: [总结]
6 | ---
7 |
8 | 2020年实际已过去一个多月,下个星期也就是大年三十了。总结一下 20年的经历,以及21年的准备
9 |
10 | ### 2020年
11 | 一言难尽,2020年,是工作最辛苦,最累的一年,累的不是技术难度,而是一对多的开发,和工作交流。主要业务开发:
12 | - 虎扑 新版本 PC开发
13 | - app 帖子详情开发 + 优化
14 | - 各个活动页开发
15 | - 组件开发
16 |
17 | ### 个人
18 | - 基于Next.js 的个人网站
19 | - 28 篇学习文档
20 | - github 637 代码提交
21 | - 学习 JavaScript 高级程序 55%
22 | - 尝试搭建简单的[脚手架](https://github.com/IFmiss/tiga-cli)
23 |
24 | ### 去年2020年定的目标
25 | - 坚持写总结,博客,预计 1~2 周一篇博客,不单纯是写,而是总结,加深印象 (100%,28篇文档,平均两周一篇)
26 | - 深入学习 TypeScript (10%,项目会用,单还不够深入)
27 | - 个人网站 UI 重新改版,将原本的 php 接口 使用 node 重写, 网站页面风格改版, 以及 接入 SSR, 接入用户登陆,最好是 github 账号登陆 (70% 登录未实现,Next.js + Koa接口请求)
28 | - 学习 React 源码,深入了解 React 原理 (0% 未完成)
29 | - 实现一个简单的 React (0% 未完成)
30 | - 巩固 JS 基础知识 (40% 学习js 高级程序设计,基础学起)
31 | - 开发一个自己的脚手架 (80%)
32 | - 维护 d-utils工具库 (0% 未完成)
33 | - 学习数据结构,了解常用算法 (10% 未完成)
34 | - 好用的组件抽象,封装,写 5 个组件 (30% 未完成)
35 | - 有可能的话,个人网站后台管理重写 (0% 未完成)
36 |
37 | ### 2021年目标
38 | - [ ] 学习
39 | - [ ] 工作
40 | - [ ] 找个对象 ?
41 | - [ ] 学位考试
42 |
43 |
--------------------------------------------------------------------------------
/posts/【面试题】设计模式.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】设计模式
3 | date: 2021-04-13 12:27:59
4 | categories: 设计模式
5 | tags: [设计模式, 面试]
6 | ---
7 |
8 | ### 说说 MVC,MVP,MVVM
9 |
10 | **MVC**
11 |
12 | 
13 |
14 | - **Model: 数据模型** (用于处理应用程序数据逻辑的部分,如数据库)
15 | - **View: 视图** (用于渲染页面, 通常视图是依据模型数据创建的)
16 | - **Controller: 控制器** (业务逻辑, 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。)
17 |
18 | **MVP**
19 |
20 | 
21 |
22 | - **Model** 负责提供数据
23 | - **View** 负责显示页面视图
24 | - **Presenter** 用于负责 Model 与 View 之间的通信,负责逻辑的处理
25 |
26 | **MVVM**
27 |
28 | 
29 |
30 | - **Model: 数据模型** 代表数据模型,数据和业务逻辑都在 Model 层中定义
31 | - **ViewModel** 负责监听 Model 中数据的改变并且控制视图的更新
32 | - **View: 视图** 代表 UI 视图,负责数据的展示
33 |
34 | ### 前端常用的设计模式
35 |
36 | 1. 单例模式
37 | 2. 工厂模式
38 | 3. 策略模式
39 | 4. 代理模式
40 | 5. 观察者模式
41 | 6. 模块模式
42 | 7. 构造函数模式
43 | 8. 混合模式
44 |
45 | [前端需要了解的 9 种设计模式](https://www.jianshu.com/p/4f3014fb8b8b)
46 | [前端常用设计模式](https://www.jianshu.com/p/4f3014fb8b8b)
47 |
--------------------------------------------------------------------------------
/posts/2019总结.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 2019总结
3 | date: 2020-01-17 16:28:42
4 | categories: 总结
5 | tags: [总结]
6 | ---
7 |
8 | 按照农历来算,2019年就快结束了,总结一下这一年做的事,和来年要做的事
9 |
10 | ### 2019年
11 | #### 公司
12 | 2019年经历两家公司,第一家做教育的公司凉凉,现在在一个做媒体行业的公司
13 |
14 | 上半年算是很忙成狗的时期,但是到了后面,公司基本没啥要做的业务又突然很闲,这种强烈的反差虽然不太适应,但是在刚来的那段时间还是学习到了一些东西
15 | - React 在项目中的应用
16 | - 微信公众号开发,绝大部分场景
17 | - 小程序开发
18 | - 代码风格
19 |
20 | #### 个人
21 | 虽然又在学习,但是和刚做前端那段时间的学习劲,真的没法比,感觉还是太懒散了,2019个人做的事
22 | - 写了 26 篇小总结
23 | - 基于 React + React hooks + mobx 构建个人的第三版本网站
24 | - 学习服务端基本配置 esc主机基于center os 安装不同环境,并使用(mysql, pm2, nginx ...)
25 | - github 639次提交,创建 14 个 repo
26 | - 看了js犀牛书,但是并没有看完
27 |
28 | #### 2020年
29 | 以下是我2020年度要做的事,记录以下,明年再总结
30 | - [ ] 坚持写总结,博客,预计 1~2 周一篇博客,不单纯是写,而是总结,加深印象
31 | - [ ] 深入学习 TypeScript
32 | - [ ] 个人网站 UI 重新改版,将原本的 php 接口 使用 node 重写, 网站页面风格改版, 以及 接入 SSR, 接入用户登陆,最好是 github 账号登陆
33 | - [ ] 学习 React 源码,深入了解 React 原理
34 | - [ ] 实现一个简单的 React
35 | - [ ] 巩固 JS 基础知识
36 | - [x] 开发一个自己的脚手架
37 | - [ ] 维护 d-utils工具库
38 | - [ ] 学习数据结构,了解常用算法
39 | - [ ] 好用的组件抽象,封装,写 5 个组件
40 | - [ ] 有可能的话,个人网站后台管理重写
41 |
42 | ### 总结
43 | 19年虽然有在学习,但是学习的不系统,效率不够高,比较懒散,20年要重拾当初做前端学习的心,好好学习,奥力给!!!
44 |
--------------------------------------------------------------------------------
/posts/关于移动端按钮点击的交互.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 关于移动端按钮点击的交互
3 | date: 2019-04-08 22:07:09
4 | categories: css
5 | tags: [css, 移动端, less]
6 | ---
7 |
8 | 在做移动端项目的时候,通常按钮的点击事件 IOS 下默认会有灰色遮罩层,虽然网上很多在找这种遮罩层的去除方法,但是个人觉得这个东西还是很人性化的
9 |
10 | ios下影响到遮罩层的css属性为
11 | ```css
12 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); // 设置颜色
13 | ```
14 | 就是当点击的时候元素按下的区域背景色设置为透明
15 |
16 | 虽然从样式上看,没有遮罩层看起来舒服,但是,遮罩层显示代表的是用户的一个点击行为事件,当用户点击了(点击事件需要网络请求,这时候在网络较弱的场景下,没有点击之后的反应),也就是没有交互效果,会让用户觉得点击失败而多次点击
17 |
18 | 但是这个css只支持ios Ipad等移动设备
19 | 安卓下并不能实现这种交互效果
20 |
21 | 需求影响,自己写了一个通用的less方法,兼容ios和安卓的点击效果
22 | ```less
23 | // @color 参数 默认 rgba(0,0,0,0.3)
24 | .active(@color: rgba(0,0,0,0.3)) {
25 | -webkit-tap-highlight-color: @color;
26 | // 伪类
27 | &:active {
28 | // 伪元素
29 | &::before {
30 | content: '';
31 | position: absolute;
32 | left: -0.06rem;
33 | top: -0.06rem;
34 | right: -0.06rem;
35 | bottom: -0.06rem;
36 | background: @color;
37 | border-radius: 0.1rem;
38 | }
39 | }
40 | }
41 | ```
42 | 由于安卓不兼容`-webkit-tap-highlight-color`,而且ios不兼容`:active`的点击效果(本人测试没有效果),从而兼容IOS和安卓,两者解决方案合并完成这个less方法
43 |
--------------------------------------------------------------------------------
/posts/【面试题】面试题相关文章地址收集.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】面试题相关文章地址收集
3 | date: 2021-04-13 17:44:44
4 | categories:
5 | tags:
6 | ---
7 |
8 | ### 面试相关文章地址,网上搜集。
9 |
10 | - [完全理解 React Fiber](http://www.ayqy.net/blog/dive-into-react-fiber/)
11 | - [浅谈 instanceof 和 typeof 的实现原理](https://juejin.cn/post/6844903613584654344)
12 | - [字节跳动最爱考的前端面试题:计算机网络基础](https://juejin.cn/post/6939691851746279437)
13 | - [前端年后真题](https://bitable.feishu.cn/app8Ok6k9qafpMkgyRbfgxeEnet?from=logout&table=tblEnSV2PNAajtWE&view=vewJHSwJVd)
14 | - [精读《Webpack5 新特性 - 模块联邦》](https://zhuanlan.zhihu.com/p/115403616)
15 | - [hash 和 history 两种模式的区别](https://www.jianshu.com/p/3fcae6a4968f?open_source=weibo_search)
16 | - [TypeScript 高级特性](https://mp.weixin.qq.com/s/VWggn-5JdbJon6ZzxHPqHw)
17 | - [Chrome Performance 常见名词解释(FP, FCP, LCP, DCL, FMP, TTI, TBT, FID, CLS)](https://blog.csdn.net/c_kite/article/details/104237256)
18 | - [理解 require 原理和实现一个 require](https://zhuanlan.zhihu.com/p/75563307)
19 | - [Http2.0 和 Http3.0](https://www.cnblogs.com/roy1/p/13721842.html)
20 | - [对 babel-transform-runtime,babel-polyfill 的一些理解](https://www.jianshu.com/p/7bc7b0fadfc2)
21 | - [webpack 是如何实现动态导入的
22 | ](https://juejin.cn/post/6844903888319954952)
23 |
--------------------------------------------------------------------------------
/posts/css3的blur如何消除边缘透明效果.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: posts
3 | title: css3的blur如何消除边缘透明效果
4 | date: 2018-12-03 10:02:47
5 | categories: css相关
6 | tags: [css]
7 | ---
8 |
9 | 我们都知道css3的功能强大之处,大多数也用过blur的属性去模拟ios的磨砂效果,web页面中,ios有自带磨砂效果的css属性,那就是
10 | ```css
11 | backdrop-filter:blur(10px);
12 | ```
13 | 但是该css属性并不支持ios以外的设备,所以我们能做的只是通过blur来实现类似的显示效果
14 | ```css
15 | filter: blur(10px);
16 | -webkit-filter: blur(10px);
17 | ```
18 | 但是
19 | **该属性是有一个问题的,当blur的数值很大的时候,其元素周边会有半透明的效果,底部的背景色会被看到**,前一段时间在做这个效果的时候看到一个解决方法,觉得确实很灵性,代码如下
20 | ```scss
21 | // 添加blur模糊效果
22 | // 如果不是绝对定位,父元素需要设置相对定位
23 | // $blur 为模糊的数值
24 | // $height 区域的高度
25 | // $position 为位置 默认50%
26 | @mixin blur($blur, $height: auto, $position: 50%, $scale: 1.5) {
27 | position: absolute;
28 | top: 0;
29 | left: 0;
30 | right: 0;
31 | background-repeat: no-repeat;
32 | background-size: cover;
33 | background-position: $position;
34 | -webkit-filter: blur($blur);
35 | filter: blur($blur);
36 | -webkit-transform: scale($scale);
37 | transform: scale($scale);
38 | overflow: hidden;
39 | @if ($height == auto) {
40 | bottom: 0;
41 | }
42 | @else {
43 | height: $height;
44 | }
45 | }
46 | ```
47 | 比如我想让class为test-blur的元素设置背景虚化效果(该元素的夫元素必须要设置超出隐藏)
48 | ```scss
49 | .test-blur {
50 | @include blur(20px);
51 | }
52 | ```
--------------------------------------------------------------------------------
/posts/对象实例化的时候经历了什么?.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 对象实例化的时候经历了什么?
3 | date: 2019-05-13 22:29:44
4 | categories: javascript
5 | tags: [js, "面试"]
6 | ---
7 |
8 | 我们都知道 js 是浏览器端的脚本语言,基本上大多数语言就是面向对象的编程模式,javascript 也是有这类编程模式(OOP),一切皆为对象,而这种场景适用于组件的封装,以及很多场景,比如,如果我想写一个 dog 的构造函数,那我们需要继承于动物的父类,也叫做基类,但是呢今天我们不说对象的继承,单纯的说说对象的实例化
9 |
10 |
11 |
12 | 就拿时间对象 Date 来说,我们在想获取当前的时间信息的时候需要
13 |
14 | ```js
15 | const date = new Date();
16 | ```
17 |
18 | 此时我们可以调用 Date.prototype 上的各种属性和方法
19 |
20 | ```js
21 | date.getTime();
22 | date.getFullYear();
23 | ```
24 |
25 | 实例化完成之后,date 就是 Date 对象的实例,判断一个变量是否是某一个对象的实例
26 |
27 | ```js
28 | date instanceof Date; // true
29 | ```
30 |
31 | 也就是说 date.**proto**属性指向 Date.prototype
32 |
33 | ```js
34 | date.__proto__ === Date.prototype; // true
35 | ```
36 |
37 | **如果我们还要实例化一个对象**
38 |
39 | ```js
40 | const date1 = new Date();
41 | date === date1; // false
42 | (date.__proto__ === date1.__proto__) === Date.prototype; // true
43 | ```
44 |
45 | **由于 this 的指向不同,date 并不等于 date1**
46 | 但是,他们走了同样的实例化步骤
47 |
48 | - 实例化的时候,会创建一个新的对象 {}
49 | - 将构造函数的 this 的值赋给新的对象,也就是 this 的指向指向新的对象
50 | - 在构造函数内执行代码,constructor 的初始化,也就是 new Object() 括号里的参数内容,设置对象的自定义属性和方法
51 | - 设置新对象的**proto**属性指向构造函数的 prototype 对象
52 | - 返回一个新对象
53 |
54 | 所以我们发现两个实例化的对象不相等,但是实例化的对象的**proto**是想等的,这就是原因
55 | 以上就是实例化对象的过程了
56 |
--------------------------------------------------------------------------------
/init.js:
--------------------------------------------------------------------------------
1 | import chalk from 'chalk';
2 | import { exec } from 'child_process';
3 | import fs from 'fs';
4 | import path from 'path';
5 | import { fileURLToPath } from 'url';
6 | import dateFormat, { masks } from "dateformat";
7 |
8 | const __filename = fileURLToPath(import.meta.url);
9 | const __dirname = path.dirname(__filename);
10 | const pathPosts = path.join(__dirname, "posts");
11 |
12 | const n = (process.argv.slice(2)[0] || "").trim();
13 | const noDir = process.argv.slice(3)[0] === '-n'
14 |
15 | if (n) {
16 | try {
17 | const now = new Date();
18 | !noDir && fs.mkdirSync(`${pathPosts}/${n}`)
19 | fs.writeFileSync(`${pathPosts}/${n}.md`, (`
20 | ---
21 | title: '${n}'
22 | date: ${dateFormat(now, "yyyy-mm-dd HH:MM:ss")}
23 | categories:
24 | tags: []
25 | ---
26 | `)
27 | .replace(/^\n/, '').replace(new RegExp(
28 | `^${' '.repeat(6)}`,
29 | 'gm'
30 | ), '')
31 | .replace(/(\x20*)$/gm, ''));
32 |
33 | console.info(`${chalk.green("Create Success:")} ${chalk.underline(`${pathPosts}/${n}.md`)}`)
34 | exec(`code ${pathPosts}/${n}.md`)
35 | } catch (e) {
36 | if (e.errno === -17) {
37 | console.info(chalk.yellow("File already exists, create failed."))
38 | } else {
39 | console.error(e);
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/posts/webpack的树摇功能使用.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: webpack的树摇功能使用
3 | date: 2019-06-24 16:03:50
4 | categories: javascript
5 | tags: [webpack, js]
6 | ---
7 |
8 | webpack2.0之后就开始支持树摇的操作,树摇的意思就是摇掉不需要或者未使用的代码,之前在写 d-utils 库的时候发现,当方法越来越多,代码越来越多的时候,在项目中引入之后打包,发现打包的js达到300kb,然而对于我实际上用的方法也就5个左右,这会造成打入了很多无用的代码,于是优化开始了
9 |
10 |
11 | tree shaking 是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。这个术语和概念实际上是由 ES2015 模块打包工具 rollup 普及起来的。
12 |
13 | ### 如何让自己的代码支持tree-shaking?
14 | - 使用 ES2015 模块语法(即 import 和 export)
15 | - 通过将 mode 选项设置为 production,启用 minification(代码压缩) 和 tree shaking。
16 | - 无副作用的代码
17 | - class包装方法无法tree-shaking
18 |
19 | ### 优化的方式
20 | ```ts
21 | // a.ts
22 | export default class A {
23 | func1 () {},
24 | func2 () {}
25 | }
26 |
27 | // main.ts
28 | import A from 'a'
29 | A.func1()
30 | ```
31 | 此时打包该项目的时候会发现,我并没有使用的func2也被打进包里,如果想移除func2只能这样
32 |
33 | ```ts
34 | // a.ts
35 | export const func1 = () => {}
36 | export function func2 () {}
37 |
38 | // main.ts
39 | import { func1 } from 'a'
40 | func1()
41 | ```
42 | 这时候是可以成功移除掉func2的代码的,至于为什么class不可以 https://github.com/rollup/rollup/issues/349
43 |
44 | ### 结果
45 | 将部分文件的代码优化成方法的export导出形式,对一个项目的同样代码进行打包查看结果,
46 | 优化之前:
47 | 
48 | 优化之后:
49 | 
50 |
--------------------------------------------------------------------------------
/posts/h5的后台切换到前台的数据更新.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: h5的后台切换到前台的数据更新
3 | date: 2019-04-03 23:08:52
4 | categories: html
5 | tags: [js, html]
6 | ---
7 |
8 | ### 背景
9 |
10 | 今天遇到了一个需求,严格来说应该是一个 bug,因为页面是一个倒计时,倒计时结束之后页面会进入正在直播的状态,但是有人反馈在锁屏一段时间之后,实际显示的倒计时时长有问题,实际上就相当于从锁屏时候继续执行倒计时,到导致实际数据与显示数据会有误差(以及开始直播了,页面还在倒计时的状态)
11 |
12 | ### 技术分析
13 |
14 | ios 的后台下 js 的代码执行会被挂起,这个是由于 ios 系统的后台机制决定的,从前台切到后台的时候,app 会被挂起假死状态,代码也不会被继续执行,对于网页来说 js 的代码是无法继续执行的,所以需要找到从后台切换到前台的触发条件,再执行重新初始化的操作
15 |
16 | ### visibilitychange
17 |
18 | visibilitychange 是一个网页可见不可见的触发机制,pc 端主要是浏览器标签页 tab 切换的触发条件,假如用户在 A 页面添加该事件
19 |
20 | ```js
21 | // A
22 | document.addEventListener("visibilitychange", function () {
23 | document.title = document.hidden ? "你切到其他页面了" : "终于来了你";
24 | });
25 | ```
26 |
27 | 用户切到其他页面的时候 visibilitychange 事件触发,显示对应文案,切到 A 页面也会执行该事件绑定的方法
28 |
29 | 移动端上也跑了以下发现该事件可以被触发(IOS 下)
30 | 触发条件:微信在打开网页且未关闭的时候
31 |
32 | - 微信网页打开,手机锁屏再解锁,执行该事件
33 | - 按 HOME 键返回桌面,点击进入微信,执行该事件、
34 | - APP 之间的切换,切回微信的时候,执行该事件
35 |
36 | 代码实现
37 |
38 | ```ts
39 | private componentDidmount () {
40 | // 第一次进入页面初始化
41 | this.initTiktok()
42 | document.addEventListener('visibilitychange', function () {
43 | console.log(document.visibilityState);
44 | // 清除定时器再重新初始化定时器
45 | this.initTiktok()
46 | })
47 | }
48 |
49 | private initTiktok () {
50 | // ****
51 | }
52 | ```
53 |
54 | 此时再继续看倒计时流程的时候,后台切换到前台之后会重新获取数据之后重新初始化倒计时,这时候时间就可以实时对应的上了
55 |
--------------------------------------------------------------------------------
/posts/正则学习.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 正则学习(一)
3 | date: 2019-07-17 22:54:43
4 | categories: javascript
5 | tags: js
6 | ---
7 |
8 | 正则表达是基本在所有的计算机语言中都会用到。因为项目中不太常用,而且基本的正则校验都已经写成通用代码,满足基本的业务场景,但是却没有真正用心去学过,遂开始学习了解
9 |
10 |
11 | ### 常用的正则表达式字符
12 |
13 | #### 元字符
14 | | 名称 | 含义 |
15 | |:---|:---------|
16 | |`.`|匹配除换行符以外的所有字符|
17 | |`\s`|任意空白符(换行符,制表符,空格)|
18 | |`\S`|匹配任意非空字符串|
19 | |`\b`|匹配单词边界,匹配单词的开头和结尾|
20 | |`\B`|匹配非单词边界|
21 | |`\d`|匹配数字0-9,等同于[0-9]|
22 | |`\D`|匹配除换行符以外的所有字符|
23 | |`\w`|匹配数字下划线,字母,且包含大小写,等同于[A-Za-z0-9_]|
24 | |`\W`|匹配数字下划线,字母,且包含大小写以外的字符|
25 | |`^`|匹配输入字符串的开始位置,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'|
26 | |`$`|匹配输入字符串的结束位置,/A$/ 会匹配 "an A" 中的 'A',但是不会匹配 "An E" 中的 'A'|
27 |
28 | #### 分组符
29 | | 名称 | 含义 |
30 | |:---|:---------|
31 | |`()`|用小括号来指定子表达式|
32 | |`[]`|字符集合,[a-z0-9A-C]|
33 | |`{}`|表示范围,{0, 1}|
34 |
35 | #### 修饰符
36 | | 名称 | 含义 |
37 | |:---|:---------|
38 | |`i`|忽略大小写|
39 | |`g`|全局匹配|
40 | |`m`|多次匹配|
41 |
42 | #### 量词
43 | | 名称 | 含义 |
44 | |:---|:---------|
45 | |`*`|匹配任意次数,等同于{0,}|
46 | |`+`|匹配一次或多次,至少一次,等同于{1,}|
47 | |`?`|匹配0或1次,等同于{0,1}|
48 | |`{m,n}`|匹配m到n次|
49 |
50 | ### 代码实测
51 | ```ts
52 | const Exp1 = /\bhi\b/
53 | // \b 匹配单词的开始或结束
54 | LogUtils.logInfo(Exp1.test('hi')) // true
55 | LogUtils.logInfo(Exp1.test('hi2')) // false 结尾不是i结尾
56 |
57 | const Exp2 = /\bhi\b.\bLucy\b/
58 | LogUtils.logInfo(Exp2.test('hi Lucy'))
59 | LogUtils.logInfo(Exp2.test('hi aaa Lucy'))
60 | ```
61 |
--------------------------------------------------------------------------------
/posts/递归.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 递归
3 | date: 2019-03-13 22:24:33
4 | categories: javascript
5 | tags: ['js']
6 | ---
7 |
8 | 递归
9 |
10 | ### 概念
11 | - 方法自己调用自己
12 | - 有终止条件
13 |
14 | ### 初识
15 | Q:获取1-100的累加总和
16 | 方法为sum(100) 100为累计的数值点
17 | 那么,总和就是
18 | ```js
19 | function sum (n) {
20 | if (n === 1) return 1
21 | return n + sum(n-1)
22 | }
23 | sum(100) // 5050
24 | ```
25 |
26 | Q: 获取1-100能被5整除的元素的集合
27 | ```js
28 | function sum5 (n) {
29 | console.log(n)
30 | if (n <= 0) return 0
31 | if (n % 5 === 0) return n + sum5(n - 5)
32 | return sum5(n - 1)
33 | }
34 | sum5(100) // 1050
35 | ```
36 |
37 | ### 规律
38 | 不满足条件直接跳出递归
39 | 总是自身调用自身
40 | ```js
41 | sum(5) = 5 + sum(5 - 1) // 15
42 | = 5 + 4 + sum(4 - 1)
43 | = 5 + 4 + 3 + sum(3 - 1)
44 | = 5 + 4 + 3 + 2 + sum(2 - 1)
45 | = 5 + 4 + 3 + 2 + 1 + sum(1 - 1)
46 | ```
47 | 其中 sum(0) = 0 结果为5 + 4 + 3 + 2 + 1 = 15
48 |
49 | ### 使用场景
50 | - 多层数据操作
51 |
52 | ### 尾递归
53 | 就拿刚刚的sum方法来说,在浏览器执行sum(100000)
54 | 会发现报错:`Maximum call stack size exceeded`
55 | 这会导致堆栈溢出
56 | 而解决方法就是 **`尾递归`**
57 | ```js
58 | function sum (n, total = 0) {
59 | if (n === 0) return total
60 | return sum(n - 1, n + total)
61 | }
62 | ```
63 | 而之前的sum5方法也可以使用尾递归计算
64 | ```js
65 | function sum5 (n, total = 0) {
66 | if (n === 0 ) return total
67 | if (n % 5 !== 0) return sum5(n - 1, total)
68 | return sum5(n - 5, n + total)
69 | }
70 | ```
71 |
72 | ##### 但是我也执行了一下发现好像都会堆栈溢出。。。
73 | > 原因: JS的解释器很少对尾递归的优化实现
--------------------------------------------------------------------------------
/posts/【面试题】服务端渲染.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 【面试题】服务端渲染
3 | date: 2021-03-29 18:50:12
4 | categories: 服务端渲染
5 | tags: [服务端渲染, 面试]
6 | ---
7 |
8 | ### 什么是服务端渲染
9 |
10 | 通俗的说就是 服务端生成 html 资源,在客户端样式渲染,注册挂载事件。
11 |
12 | ### React SSR 实现过程?原理?注意事项?
13 |
14 | 
15 |
16 | - 客户端访问 `/home` 页面
17 | - koa router 引入 react home 组件
18 | - renderToString 将组件转换为 html 字符串。
19 | - 服务端返回 html 字符串,返回类型 html
20 | - 在服务端直出带数据的页面时,将 store 存储在全局变量中,为前端 store 数据获取做准备的过程叫做数据注水。
21 | - 客户端渲染页面,同时加载 js 资源
22 | - 前端获取来自全局变量中的数据并填充自身,用于页面数据渲染的过程叫数据脱水。
23 | - 客户端通过 `hydrate` 重新 render page 组件,生成虚拟 dom,之后操作和客户端渲染一致。
24 |
25 | ### SSR 比 CSR 快吗?
26 |
27 | 首屏渲染 SSR 比 CSR 快,加载其他页面时,SSR 会从头重新加载,而 SPA 则只加载一部分模块,甚至提前与加载组件。
28 |
29 | ### 为什么 SSR 首屏渲染快
30 |
31 | 主要体现在 http 请求数量上,ssr 只需要请求一个 html 文件就能展现出页面,虽然在服务器上会调取接口,但服务器之间的通信要远比客户端快,甚至是同一台服务器上的本地接口调取。
32 |
33 | ### ReactDom.render 与 ReactDom.hydrate
34 |
35 | - React16 的 `hydrate` `时,hydrate` 的策略与 `render` 的策略不一样,其并不会对整个 dom 树做 dom patch,其只会对 text Content 内容做 patch
36 |
37 | - `render` 如果初始 DOM 和当前 DOM 之间存在差异,则可能会更改您的节点。`hydrate`将仅附加事件处理程序。
38 |
39 | ### renderToString 和 renderToStaticMarkup 的区别。
40 |
41 | - `renderToString` 方法渲染的时候带有 `data-reactid` 属性. (render 方法会使用 innerHTML 的方法重写 #react-target 里的内容)
42 | - `renderToStaticMarkup` 则没有 `data-reactid` 属性, 可以节省一点流量。(前端 react.js 会认识之前服务端渲染的内容, 不会重新渲染 DOM 节点, 前端 react.js 会接管页面,执行 componentDidMout 绑定浏览器事件等。)
43 |
44 | `data-reactid` 简单的说就是 react 组件 的一个唯一标示 id。
45 |
--------------------------------------------------------------------------------
/posts/TypeScript初识.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: TypeScript初识
3 | date: 2019-03-28 23:22:27
4 | categories: typescript
5 | tags: [js, ts]
6 | ---
7 |
8 | ### 背景
9 | JavaScript是一种弱类型语言,也就是所有的变量命名都是var来定义,es6多了const,和let来定义变量,所有类型的变量都是这几种方式定义,不做类型限制会导致代码在执行的时候会有执行错误如:
10 | ```js
11 | let a = 1
12 | a.toFixed()
13 |
14 | // 此时如果a被赋值了一个字符串
15 | a = '1'
16 | a.toFixed() // 此时则会报错 因为String对象下并没有toFixed方法
17 | ```
18 | 如果使用typescript定义一个变量为number类型,则不会允许字符串替换之前的number变量,所以`很大程度上避免`了这个问题
19 | ```ts
20 | let a: number = 1;
21 | a.toFixed()
22 |
23 | a = '1' // 此时就会提示错误,用户则会知道字符串无法替换,同样,也不存在toFixed方法
24 | ```
25 | 很大程度上避免是指在开发时候遇到静态数据替换的时候可以避免,当有动态数据赋值的时候,好像还是没法做到限制
26 |
27 | 以下只是常用的地方的记录
28 |
29 | ### 变量类型定义
30 | ```ts
31 | const ts: number = 1;
32 | const ts: string = 2;
33 | const ts: any = 3;
34 | const ts: boolean = true;
35 | const ts: string[] = ['1', '2', '3'];
36 | const ts: any[] = ['1', 1, undefind];
37 | const ts: number = [1, 2, 3];
38 | const ts: Array = [1, 2, 3];
39 | enum Type {
40 | YES, // 0
41 | NO // 1
42 | }
43 | function test (): void {}; // 没有返回值的方法
44 | function test (): number {
45 | return 1 // 返回值为1的方法
46 | };
47 | const ts: null = null;
48 |
49 | // 对象的定义 比如定义一个学生,有性别,名字,年龄
50 | interface IUserInfo {
51 | name: string; // 中文或者英文
52 | sex: number; // 0 1
53 | age: number; // 12
54 | }
55 | const user: IUserInfo = {
56 | name: 'dw',
57 | age: 26,
58 | sex: 1
59 | }
60 | ```
61 |
62 | ----------
63 | ps: 记录自己在做项目开发中使用到typescript感受到方便实用的地方
64 |
65 | 未完待续
66 |
--------------------------------------------------------------------------------
/posts/web安全-XSS.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: web安全-XSS
3 | date: 2020-10-11 16:47:23
4 | categories: web安全
5 | tags: [web安全]
6 | ---
7 |
8 | ### 一起学习了解一下 web安全相关的知识
9 |
10 | ### XSS(Cross Site Scripting)跨站脚本攻击
11 |
12 | 使用注入的js,html代码导致页面样式出入,功能缺失,植入广告,甚至用户信息泄露的问题
13 |
14 | ### XSS 类型
15 | - 基于反射的XSS攻击
16 | 比如访问一个搜索商品的,如果搜索没有内容,页面显示 XXX 不存在
17 | 1. 用户输入带有参数的url => http://a.com?name=
18 | 2. js 处理 url 中 name 的值 字符串
19 | 3. 直接显示商品名称 写入html 进行页面渲染 js被执行
20 |
21 | - 基于存储型的XSS攻击
22 | 1. 用户输入带有参数的url => http://a.com?name=
23 | 2. js 处理 url 中 name 的值 字符串
24 | 3. 数据通过后端存储之后,回显的时候展示返回name值
25 | 4. 直接显示商品名称 写入html 进行页面渲染 js被执行
26 |
27 | - DOM XSS
28 | document.write, eval, img 等等
29 |
30 | ### 举例
31 |
32 | ```html
33 |
38 | ```
39 |
40 |
41 | ```html
42 |
43 |
44 |
45 |
46 |
47 |