个人开发知识库(239-283)

· knowledge-base

239. 代码提交规范

代码要每天都提交一次!不要按功能完成再提交,确保 服务器能备份到最新的代码,确保本地不会因为硬盘坏了而丢失代码(即使是万分之一的概率)。

提交的时候只要确保基本的编译不会出错就可以了,只是提交到你的 feature 分支,不会影响到 master 分支的完整性的。 到时候一个功能开发完成了再通过测试后

再合并到主分支就可以了。

参考 devOps 的操作流程。

CI / CD 持续集成 / 持续部署(交付) continuous integration

continuous deployment(delivery)

240. 命名规范

命名: 数组: menus menuList Nodes records

对象: data menuInfo menuDict

Map: menuMap

Set: menuSet

241. img标签的 onerror 事件处理

用 img标签的 **onerror(@error)事件 **解决图片的src地址访问不到报错(或者图片裂开)的问题

原生:

VUE:

242. 可拖拽的视口

cursor: col-resize;

243. 获取外部样式的方法

window.getComputedStyle( ele ) 获取该元素的所有外部样式对象 (有width属性 …) // 返回值是 整数

ele.getBoundingClientRect( ).top / bottom / left / right 返回一个矩形对象,包含那4个属性 // 返回值是 精确 的 带小数点的

ele.offsetWidth / offsetHeight / offsetLeft / offsetTop // 返回的是 整数

244. package.json 文件中的依赖类型区别

package.json 文件中的 dependencies(项目的依赖) 和 devDependencies(开发所需要的模块) 和 peerDependencies 的区别:

(1)、如果没有发布 npm 包, 那么依赖放在哪里没有区别;

(2)、为了规范,如果是一直使用的包(项目中会一直用,如 ant-design-vue、day.js等),放到 dependencies 中; (这里的依赖是一定会被下载的)

如果是开发时需要用到,上线后(线上环境)不会用到的,如 webpack、eslint、prettier、各种-loader、stylelint等…,放到 devDependencies 中

(3)、peerDependencies 解决核心库被下载多次,统一核心库的版本问题 (项目依赖了 vuex 和 vant 这两个子库,而这两个依赖又都同时依赖了 vue 这个框架。在字库中分别声明 peerDependencies 防止重复安装 vue)

(4)、peerDependenciesMeta 对 peerDependencies 的修饰, 增加一些可选项的配置

245. CSS 字体 font-weight 属性的跨平台差异

关于 css 字体 的一些学问 font-weight 属性在不同操作系统(常见win和mac)上的显示效果的不同

(0)、关于 win 和 mac 的默认字体 (不设置font-family属性,会自动读取操作系统的默认字体来显示的)

(1)、win上 :600为分界线。600往前一个效果,600往后一个效果

  mac上:每一个值显示的效果都不一样

(2)、因为操作系统和浏览器的原因,字体在不同操作系统设备上显示的粗细会有所不同。这是 font-weight 这个属性存在的兼容性问题

(3)、使用 @font-face 引入自定义字体,font-family 使用该字体名称 (字体后缀名 .ttf .otf .fnt )

246. Vue 中多个组件使用 window.onresize 的问题

vue 中 多个组件使用 window.onresize,只有一个生效,导致其他的给覆盖。

247. JavaScript 引擎和编译器

js引擎(spiderMonkey、V8 …) (js解析器) 和 js编译器 (babel (es6 转 es5,转化 jsx 语法,兼容旧版浏览器,ts语法)、 tsc (typescript compiler)、 swc (speedy web compiler))

248. CommonJS 和 ES Module 的区别

commonJS (服务端 node) 和 ES Module 的区别:

(1)、require 和 import 的

(2)、CommonJS 的思路就是将函数当作模块

249. JS的对象遍历是无序的

JS的对象遍历是无序的(因为对象本身就没有存储顺序)。但是数组是有的,有index索引,记录每个元素的顺序。

250. JS(V8)垃圾回收机制

JS(V8)垃圾回收机制: GC -----> Garbage Collecton 垃圾回收 垃圾收集器 (自动回收机制) (C / C++ 就没有)

标识无用变量方法(GC 跟踪每个变量是否有用,无用变量打上标记,回收其占用内存): 标记清除 (V8) 和 引用计数

标记清除会导致内存空间分配不连续(内存碎片)、分配速度慢

标记整理:

引用计数( 跟踪记录每个值被引用的次数。

上面 即 循环引用的 例子

回收

251. Vue 动态绑定属性名

vue 动态绑定属性名

252. Vue 中 v-for 支持的类型

vue 中 v-for 支持的类型 (比原生的 for 屌很多的) in / of 这两个都可以,作用完全一样(跟原生是不一样的)

1、遍历 数组(字符串)

2、遍历对象 value - key - index

         (键值对索引)

3、遍历数字

4、遍历 itarable(可迭代)对象

**key 属性 ** )

Vue3.x 新增 自动生成唯一的 key 值

**Vue2.x 必须写key **

VNode 虚拟节点

template中的每一个标签元素 vue 都会转化成 一个个的 VNode

template -> VNode -> 真实DOM

虚拟DOM ? 可以干嘛?

(1)、做 diff 算法 (绑定 v-for 的 key)

(2)、跨平台。vue 可以写 PC Web / 移动端 / H5 / 小程序 / 甚至 桌面端 / 安卓 / IOS … 靠的是 VDOM 的 转换

253. position: fixed 的定位特性

position: fixed; 一般都是相对于 屏幕视窗 (浏览器窗口) 来进行 定位 。(屏幕尺寸大小)

所以 设置 width 要动态计算 calc()函数 除非

254. Vue 组件库相关

Vue 组件库 相关

(1)、直接用

main.js 文件
// 组件库
import Element from 'element-ui'

Vue.use(Element) // 使用组件库的所有组件(全部加载,不管用没用到)

(2)、lazy-use ** 按需引入**

main.js 文件
// 组件库
import './lazy_use' // use lazy load components

lazy_use.js 文件
import Vue from 'vue'
import { Input, List, Dropdown, Tooltip ... } from 'ant-design-vue' // 按需引入

Vue.use(Input)
Vue.use(List)
Vue.use(Dropdown)
Vue.use(Tooltip)
...

如果仅仅是完成上面的操作,还是不能实现真正的按需加载的。

需要下载 babel-plugin-component 插件 并且 在 babel.config.js 文件中进行对应的插件配置(按需引入的组件库和按需引入的样式)

以上,就可以做到按需引入了。

重写组件库样式:

1、建element-ui.scss文件在style文件夹中,在index.scss中@import引入,然后在 App.vue 文件的 style 中 @import 引入

2、建global.less文件重写 antdv 样式,在 main.js 中直接 import 该文件

这样就可以 了。

element-ui 的 layout 布局 中的 响应式布局

<el-col :lg="{span:'12-25'}"></el-col>
.el-col-lg-12-25 {
    width: 48%;
}

:lg=“{span:‘12-25’}” 和 .el-col-lg-12-25 =======> 即 el-col-lg-12-25 设置的 width 就是 :lg=“{span:‘12-25’}” 对应的宽度 (12-25 就是从第12列到第25列 的意思 )

255. property 和 attribute 的区别

property 和 attribute 的 区别 (类似 $attr 和 $props)

1、 property(如 style,className,childNodes,classList …

(1)、 指的是操作 DOM 的属性 像获取到DOM后设置 xxx.style.color、xxx.className、xxx.childNodes、xxx.firstChild …

(2)、值只能是字符串(操作JS)

(3)、长属性名是驼峰写法

2、 attribute(如 id,class,src,title,alt …

(1)、 指的是操作 HTML 的属性 像设置和获取DOM元素的属性 xxx.getAttribute(‘class’)、xxx.setAttribute(‘title’, ‘cusTitle’)

(2)、值可以是 数组/ 对象等(HTML)

(3)、属性名

e.g.

$listeners (vue3 deprecated)

v-bind=“$attrs” v-on=“$listeners” $options ===> options API 整个 获取自定义属性

事件监听的具体使用:

父组件:

子组件:

这里的v-on=“$listeners” 就相当于 继承了 父组件中的除了 @run 之外的所有事件监听了(也就是红框框出来的那些事件)

也相当于:

替代了 手动写$emit 事件 。

所以,这个 @run 在 父组件定义就行了。 在子组件这里再次定义的话就相当于 你执行了 两次 run 了。

256. Vue 的 install

257. flex 和 grid 布局

flex (一维 / 单行) grid ( 二(多)维 / 多行 )

让最后一行列表左对齐

(1)、grid

 display: grid;
 justify-content: space-around;
 grid-template-columns: repeat(auto-fill, 30%);

// 子元素
width: 30%;
height: 100px;
background: pink;
margin: 12px;

(1)、flex

  1. 粗暴点,直接给最后一个 margin-right

  2. 在后面套两个

    (空元素占位)

258. JSON Schema

JSON Schema

JSON : JavaScript Object Notation js对象(万物皆对象)注释

JSON 是一种语法,用来序列化对象、数组、数值、字符串、布尔值和 null 。key 和 value 都是 字符串

JSON Schema 是一套 JSON规范,用于校验JSON的工具。(格式有点类似于AST?) 就是一份JSON文件的说明文档,叼一点,可以生成form表单(插件支持)和做数据(字段)校验

包含了「表单数据描述」和 「表单校验」功能。

基本格式:

json格式是不支持注释的,所以可以用 json schema 来定义json,在json文件里加个description字段就可以了。title是定义标题的。

field widget 组件

语法: 定义了一系列的规则(关键字) ajv: JSON Schema 的校验器

组成:

1、schema: 用于描述表单数据的 JSON Schema

2、ui-schema: (ui 也可直接配置在 schema 中) 用于配置表单展示样式

3、error-schema :用于配置表单校验错误文案信息

关键字:

1、$schema 关键字:声明了针对哪个版本的JSON Schema标准编写模式。

2、$id 属性:为JSON Schema实例声明一个唯一标识符;声明了一个解析$ref 的URI时的基础URI

3、$ref 属性:引用同一个JSON Schema文件或其他JSON Schema文件中的JSON Schema实例片段。这个属性的值通常是一个相对或者绝对URI,# 符号后面的部分是JSON指针

4、dependencies 关键字:属性依赖:如果JSON实例拥有对应的属性名name,则也必须有name对应的propertyset数组内的所有属性名

5、definitions 关键字:这个关键字可以在JSON Schema实例中定义一个可以在这个JSON Schema实例中被引用的JSON子模式。

259. position 和 flex 的冲突

同一个盒子同时使用 position 和 flex 会产生 冲突 (flex居中 和 子元素 position: absolute 之间产生的冲突), 给盒子外面再套一层 div,相对 div 定位

260. 声明式编程

声明式编程 (函数式编程 是 其中一种) 与之对应的是 命令式编程

261. React

React

(1)、开发 web 页面

(2)、React Native 开发 移动端跨平台

(3)、React VR 开发 虚拟现实web应用

依赖包: react / react-dom( 渲染到不同平台的依赖,比如 react web 和 react native ) / babel

vue只要数据更新,会自动进行render,视图上显示的是最新的数据。

而react默认不会自动执行render (可以是 html元素 或 组件--------类组件和函数式组件)的,要在数据更行后手动执行一下render拿到最新数据

script标签中加 type=“text/babel” 为了能让 babel 解析 jsx 代码

函数的返回值默认是 undefined (没写 return 的话)

es6的 class 默认是 绑定的严格模式下的,所以 class 里的 this 如果原本是指向 window 的,会变成 undefined (使用 babel 转换的代码也是,默认都是开启严格模式)

262. 禁止移动端的触摸事件

禁止移动端的触摸事件(touch event),可以强制不显示浏览器的滚动条(比如 safari 会自动显示滚动条)

** touch-event: none;**

263. VUE_BASE_API 配置

VUE_BASE_API 在 .env等 配置文件 中 :

(1)、完整的 url : 那就是 **base_url **+ api文件 中的 ** request_url **

本地(开发)环境 和 测试环境 都是 这个的话,那访问的 api 就是

生产环境 的 api

(2)、单纯写 /api 这个是在 nginx.config 配置文件中进行 配置的。 (nginx是部署在服务器上面的,不是在后端代码中的。nginx 服务 配置项目)

1、如果是在 开发环境 中,那么访问的 baseUrl 就是 http://172.21.44.15:8080 + requestUrl 就是 /api/user/search

(如果没在vue.config.js文件中的devServer的proxy中设置 ‘/api’ 代理的话,那就会报 404 not found 错误。要改VUE_BASE_API的)

2、如果是在 测试环境 中,那么访问的 baseUrl 就是 http://api-test.xd0760.com + requestUrl 就是 /api/user/search

3、如果是在 生产(正式)环境 中,那么访问的 baseUrl 就是 https://api.xd0760.com + requestUrl 就是 /api/user/search

同理,VUE_BASE_API_UPLOAD 也一样,设置 不同环境下的服务器存储文件(图片、视频等)的地址,如果是配置的 /uploads 的话,要注意对应环境,如果是测试环境 就会报错了

264. 随机生成颜色

随机生成颜色

const createRandomColor = () => #${Math.random().toString(16).slice(-6)}

265. 监听本地存储变化

原生方法 监听 本地存储 (localStorage)的变化:

window.addEventListener(‘storage’, (event) => {

console.log(‘storage changed’, event)

})

var orignalSetItem = localStorage.setItem

localStorage.setItem = function(key,newValue) { var setItemEvent = new Event(“setItemEvent”) setItemEvent.newValue = newValue window.dispatchEvent(setItemEvent) orignalSetItem.apply(this,arguments) }

window.addEventListener(“setItemEvent”, function (e) { alert(e.newValue) }) localStorage.setItem(“name”,“wang”)

266. 修改 node_modules 代码

修改 node_modules 上的代码: 用 patch-package (依赖 git diff 实现的 patches 文件夹) 呀

注意: 要改动的包在 package.json 中必须声明确定的版本,不能有~或者^的前缀。

(1)、安装patch-package

npm i patch-package --save-dev

(2)、修改完依赖后,运行patch-package创建patch文件 npx 执行 node_modules 文件夹 下面的 .bin 可执行文件

npx patch-package 依赖名称
例子: npx patch-package element-ui

(3)、修改package.json的内容,在scripts中加入”postinstall”: “patch-package”,这个是为了npm install的时候自动为依赖包打上我们改过的依赖

 "scripts": {
  ...
  "**postinstall**": "patch-package"
  }

267. Vue 的各版本对比

vue 的 各版本 对比:

268. 编程英语

编程英语:

pseudo-element: 伪元素

locale: 特定语言环境的(当地的) ‘zh-CN’ ‘en-US’ (‘ar-EG’ 阿拉伯语言) toLocaleString() toLocaleLowerCase()

SDK: **software development kit **软件开发工具包

accessibility: 无障碍 (a11y) ----视 / 听 / 行动 / 理解

patch: 打补丁

bundler: 打包(工具)(webpack / browserify)

chunk: 块

bundle: 束

vendor: 供应商(第三方库)

我们直接写出来的是 module,webpack 处理时是 chunk,最后生成浏览器可以直接运行的 bundle。(不是多少个 chunk 就会对应生成多少个 bundle , (虽然大部分情况下会是一一对应) )

invoke: 调用 (函数调用等)

revoke: 撤销

implicit: 隐式的…

explicit: 显式的…

hoisting: 变量提升 (var关键字声明才会有)

indicate: 表明,显示

anonymous: 匿名的…

nested: 嵌套的..

polygon: 多边形

immutable: 不可变的 (immer 一直如此 immer.js)

coupon: 优惠券

trie:字典树

traverse: 遍历

linked list: 链表

expanse : 花费 (消耗 expansive 贵的)

manifest: 清单文件()

fallback: 兜底

estimate: 估算

diagnostics: 诊断

concurrent: 并发

shims: 垫片 shims.vue.ts

Polyfill: 填充器

关于符号:(prettie)

semi: 末尾加不加分号 (“false” “true”)一行的结束

semicolon: 分号

semi-spacing: 强制分号间隔;分号前后是否空格

brackets: 括号

comma: 逗号

trailingComma:多行输入尾部加不加逗号

单引号: singleQoute

双引号: doubleQoute

wrap: 换行 (nowrap --- 一行显示 white-space 只有一行文字的时候) wrapper: 包装器

269. 浏览器使用 export / import 语法

浏览器使用 export / import 语法: 异步方法

默认是在 webpack/cli、 babel 等 脚手架/编译 工具 中有集成 / 做了代码转换

(1)、使用 type=“module” (静态引入)

(2)、动态引入

(3)、解构(async / await)

270. 前端模块化

前端模块化 (js 模块化规范) ---- UMD / CMD / AMD / ES Module (esm ) / CommomJS(cjs)

一、 CommonJS

用 module.exports 导出模块, 用 require 加载模块

CSS 模块化(防止 文件命名/样式 冲突):

命名规范(BEM[ block__element—modifier ]、OOCSS [ 原子类 类似 tailwind 思想 ]、SMACSS、ITCSS…)、

CSS Modules(主要 react 在用)、

CSS-in-JS (styled-components react在用,相当于 vue 的 style scoped) 【 html-in-js: JSX 】 “all in js”

emotion 排名第二的维护者 Sam 所在公司弃用了 css-in-js 方案,使用css-modules的解决方案,主要是出于性能考虑。还有增加了包体积

271. Div+contenteditable 实现富文本输入框

Div+contenteditable 实现 可插入自定义内容(标签) 的输入框 (简单的富文本输入框)

272. jenkins 和 docker 的区别

jenkins 是 java开发,用于自动化构建(打包)和部署项目 --- 配置命令,自动跑

docker 是 go开发,是个虚拟机,是容器

273. 第三方统一登录SSO

第三方统一登录SSO

带参数跳转回调会自己项目中。

274. chrome devtools

chrome devtools 开发者文档 实用小技巧:

// $_ (获取控制台上一次的结果)

// $ 1-4 (获取 $0 的 previous 元素)

// $(’ 类名/id/属性名 ’) **$(‘.main’)** === document.querySelector(‘.main’) $ 就是 document.querySelector() 的别名(语法糖)

// :has() :contains()

// table / dir / clear() 代替 console.table / dir console.clear()

**// **监听事件 ? 像 vue 一样 在方法中打印 当前元素的DOM对象事件 (e) / ($event) ? 使用 monitorEvents 这个 api 啊

// monitor 相当于 vue 中的 watch 了 ,对函数做监听 ?? 取消就 unmonitor 了

// :has() 选择器 和 :contains() 选择器

  1. 选中并删除所有带”关键字”的评论 $(‘.reply-wrap**:contains(关键字)**‘).remove()

  2. 选中并删除所有用户等级在三级以上的评论 $(‘.reply-wrap**:has(.l3),.reply-wrap:has(.l4),.replay-wrap:has(.l5),reply-wrap:has(.l6)**‘).remove()

275. hash 和 history 区别

(浏览器的 /# 重定向 问题)

(1)、如果是 带 #/ 的话,要编码一下的, 用 encodeURIComponent 转一下,再传过去,不然会报错。(可能接口做了处理,特殊字符(#、等)传过去可能不被正常接收 / 浏览器处理?)

history 可以配置 nginx 文件

(2)、加相对路径:

不然会这样

(3)、部署:

276. 地图定位

地图定位( ip获取范围(省市区),再用 region城市 限制范围 调用获取搜索关键字提示 达到效果 )

277. vue-cli 改造 nuxt

vue 中的 全局变量

278. 数据埋点 - 访问数据来源

【直接访问】:直接输入网站 url(网址) 进行访问

【搜索引擎】:关键字搜索跳转

【外部链接】:通过别人的网址跳转(带来源标识 from / source)

279. 跨域解决

浏览器会先发一个 option 预请求, 不行就报错了

(1)、jsonp 发起标签 script请求,利用script标签的src不受同源的限制

(2)、vue.config.js / webpack 配置文件 修改 devServer 的 proxy 的指向

(3)、(服务端 / node 端)nginx 的 配置文件修改

nginx:------- 负载均衡 / 反向代理 / 动静分离 / http服务器 (高性能 / 轻量级)

负载均衡: nginx代理服务器 转发请求到各个服务器(每个服务器都有各自的端口号唯一识别),利用空闲的服务器协调工作,做到资源利用最大化

动静分离: nginx将 静态资源 和 动态资源 进行分离,给对应的服务器去解析,降低单个服务器的压力,加速解析

模块配置:

配置文件 xxx.config

工程化 CI/CD项目部署和自动化打包

流程:

1、服务器安装 jenkins,然后配置一个项目

2、然后构建规则,轮询配置

3、然后构建,配置构建命令,然后ssh到服务器指定的目录中

4、接着服务器安装nginx,然后配置 location 的 root 为上面的 remote directory,然后完事。就能享受 jenkins 自动化部署,直接访问就能看到新的代码变化了。

280. v-html 的本质

v-html 的 本质就是 设置元素原生的innerHTML

dom 的 innerHTML : 选所有子元素进行显示 (子元素包括标签在内的字符串形式) : — 文本带标签的显示为带标签后的样式,普通字符串就显示普通字符串内容

dom 的 innerText : 选所有子元素的所有文字进行显示 (字符串像是) : — 文本是什么就显示什么(不认标签的)

281. markdown 语法中的锚点定位

markdown 语法 中的 锚点定位

(1)、 text content … ------ text content …

(2)、 text content… ----- the anchor target

(3)、[[toc]] --- table of contents

**showndown --- **用 JavaScript 编写的双向 Markdown 到 HTML 到 Markdown 转换器

showndown-toc ---- [toc] 语法 生成 导航锚点定位

  1. 会把文章中所有的 heading 信息,通过闭包的形式传达到上层域

  2. markdown 中写 [toc],即可生成 toc 到 markdown 的相应位置中

一般的md编辑器(vue的 v-md-editor)就有集成了。使用的时候直接配置就行了。

282. B站弹幕不遮挡人脸

B站弹幕不遮挡人脸?

AI生成图片,然后给图片设置 -webkit-mask-image: url(xxx) 属性,文字 绝对定位, 图片相对定位。

mask-image CSS属性用于设置元素上遮罩层的图像。

283. 前端问题排查与调试技巧

常用排查方法

排除法:逐步注释代码块,缩小问题范围

打印日志:在关键节点添加调试信息

猜测法:根据经验猜测最可能出问题的地方

debugger:使用浏览器开发者工具断点调试

插件调试法:利用专业调试工具(Vue DevTools等)

看缓存数据:检查 storage / vuex 等存储状态

看源码调试:深入第三方库源码分析问题

重要提醒

有的时候代码没发现出问题,可能不是代码本身的问题 (有可能受限于不同浏览器的各种策略,导致有的浏览器正常 有的设备上显示不正常)

换个思路,可能是载体做了限制 源码没问题

或者是 api 不同浏览器做了限制,需要换种实现方法 来兼容 不同的设备 !!

小程序生命周期

onLoad 只在页面加载的时候更新一次

onShow 每次页面更新的时候都会调用

代码优化技巧

index > -1 (已经有if … else … 判断在了) 就相当于 index > -1 ? true : false

简化写法:直接返回布尔值结果,避免冗余的条件判断

_HBin Zhuang_ 📝