前端局域网部署一直都是我跑shell脚本,每次都要手动输入密码,偶然间看到了滴滴团队在掘金的文章,在打包完成后,使用scp2 进行代码上传,过程非常丝滑!
代码
新建文件 scp2.js
|
|
npm scripts
|
|
BrainStorming
前端局域网部署一直都是我跑shell脚本,每次都要手动输入密码,偶然间看到了滴滴团队在掘金的文章,在打包完成后,使用scp2 进行代码上传,过程非常丝滑!
新建文件 scp2.js
|
|
|
|
老知识点常学常新
call()
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数。
function.call(thisArg, arg1, arg2, ...)
thisArg
可选,在 function 函数运行时使用的 this 值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。arg1, arg2, ...
指定的参数列表call()
允许为不同的对象分配和调用属于一个对象的函数/方法。
call()
提供新的 this 值给当前调用的函数/方法。你可以使用 call 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。
在一个子构造函数中,你可以通过调用父构造函数的 call 方法来实现继承,类似于 Java 中的写法。下例中,使用 Food 和 Toy 构造函数创建的对象实例都会拥有在 Product 构造函数中添加的 name 属性和 price 属性,但 category 属性是在各自的构造函数中定义的。
|
|
业务上有一个需求是检测工作流模板是否是DAG图,DAG图即有向无环图,常见的解决方法是拓扑排序,如果存在环路,则不能进行拓扑排序。
拓扑排序是有向无环图所有顶点的线性序列。
满足两个条件:
例如下图存在环路
|
|
|
|
|
|
|
|
删除start之后的 graph 与 node
|
|
graph中,key代表线的出点,value代表线的入点,将value去重后,与nodeSet 取差集就得到下一批入度为0的节点。
|
|
|
|
|
|
Set
类似数组,但是成员的值唯一。
数组去重
[...new Set(array)]
并集
new Set([...a, ...b])
交集
new Set([...a].filter(x => b.has(x)))
差集
new Set([...a].filter(x => !b.has(x)))
Map
类似对象,也是键值对的集合。但是"键"不限于字符串,各种类型都可以做为键。
Map的遍历方法
公司搞了一套Devops流程,在生产环境构建的时候遇到了一系列坑
|
|
在指定下载源后,发现node-gyp 总是会去node官网下载node-v12.18.0-headers.tar.gz
这个包,没有从指定的源下载,所以一直失败。
后来在github查到了相关
issue
先把node-v12.18.0-headers.tar.gz
下载好放到机器上
|
|
ECMAScript中所有函数的参数都是按值传递的。
|
|
修改前:
栈内存 | 堆内存 | |
---|---|---|
value | 1 | |
v | 1 |
修改后:
栈内存 | 堆内存 | |
---|---|---|
value | 1 | |
v | 2 |
|
|
修改前:
栈内存 | 堆内存 | |
---|---|---|
obj,o | 指针地址 | {value: 1} |
修改后:
栈内存 | 堆内存 | |
---|---|---|
obj,o | 指针地址 | {value: 2} |
|
|
修改前:
栈内存 | 堆内存 | |
---|---|---|
obj,o | 指针地址 | {value: 1} |
修改后:
栈内存 | 堆内存 | |
---|---|---|
obj,o | 指针地址 | {value: 1} |
o | 2 |
摘抄一些Vue的小技巧
使用 @hook
即可监听组件生命周期。同样的, created 、 updated 等也可以使用此方法。
|
|
在组件销毁时要移除侦听器,肯定写过以下代码。this.timer 唯一的作用只是为了能够在 beforeDestroy 内取到计时器序号,除此之外没有任何用处。
|
|
可以通过 $on 或 $once 监听页面生命周期销毁来解决这个问题:
|
|
样式穿透在css预处理器中使用才生效。
/deep/
|
|
::v-deep
|
|
>>>
|
|
|
|
将路由的 props 属性设置为 true 后,组件内可通过 props 接收到 params 参数。
|
|
另外还可以通过函数模式来返回 props
|
|
$event
是事件对象的特殊变量,在一些场景能给我们实现复杂功能提供更多可用的参数
|
|
|
|
|
|
watch 是在监听属性改变时才会触发,有些时候,我们希望在组件创建后 watch 能够立即执行
|
|
在监听对象时,对象内部的属性被改变时无法触发 watch ,我们可以为其设置深度监听
|
|
使用数组可以设置多项,形式包括字符串、函数、对象
|
|
后台用node来解析前端上传的CSV文件,由于不同系统CSV文件编码格式不同,导致后台解析出现乱码。
找出CSV编码格式 —> 用该编码方式解码 —> csv-parse解析内容
NPM库 jschardet
可以识别出一个Buffer数据所使用的编码格式。
用法如下
|
|
支持如下编码
|
|
在探索如何实践的最佳方法时,我们想出了一个十分有趣的原型:从一个充满颗粒的旋转球开始。
See the Pen render-3d-in-2d-canvas by yuchenyao (@yuchenyao) on CodePen.
文本为翻译计划的第一篇文章,原文地址
ES2019最近已完成制定,这意味着JavaScript将有很多新特性供大家学习。这些特性目前可以在Chrome 73中使用。
遗憾的是,在写此文的时候还没有基于V8 7.3的Node.js版本,目前的Node.js 12 仍然是基于V8 7.1。然而,V8 v7.0已经包含了ES2019的大部分特性,如下图所示。本文中我们仍然使用Node.js 11.6(V8 v7.0.276)。
Array#flat()
和Array#flatMap()
flat()
和 flatMap()
在Chrome 69 和 V8 6.9 中是可用的,因此你需要 Node.js 11。
Array#flat()
跟Lodash的_.flattenDepth()
方法类似。flat()
方法接受一组嵌套数组,并将该嵌套数组扁平化。
|
|
默认情况下,flat()
仅扁平化一层:
|
|
但是,flat()
接收一个表示深度的参数来确定你想要扁平化的深度。
|
|
新的flatMap()
方法相当于在使用map()
之后调用flat()
。如果你的map()
返回一个数组,这将非常方便。
|
|
因为flatMap()
的回调参数返回了一个数组,flatMap()
扁平化了该数组。上面的方法类似于:
|
|
使用flatMap()
时有一个优雅的小技巧,你可以一步实现filter()
和map()
。 你可以在flatMap()
回调中通过返回一个空数组过滤掉一个参数。
|
|
Object.fromEntries()
Object.fromEntries()
方法目前在所有版本的Node.js中都无法使用,你可以npm安装 object.fromentries
polyfill。
Object.fromEntries()
试图使Map到Object的转换变得简单。
|
|
一个灵巧的副作用是你可以把键值对数组转化为JavaScipt对象。
|
|
该方法的主要功能是将map类型转换为object类型,但是键值对的转换仍然是有帮助的。
例如,MangoDB 不允许用.
符号来存储key。在MangoDB中存储带有.
的key时要使用键值对数组。 Object.fromEntries()
和它的反函数 Object.entries()
使对象与键值对数组之间的转换变得容易了很多。
|
|
Symbol#description
Symbol 首次出现在ES2015中,用来解决属性间的命名冲突。一个Symbol对象内的属性名都是独一无二的。
|
|
Symbol()
的第一个参数被称为description。description不是id,多个symbol对象可以拥有相同的description并且互相之间没有冲突。symbol对象的description完全是为了调试功能。
在ES2019之前,如果你想访问symbol对象的description,只能使用.tostring()
。
|
|
在 Node.js 11中你可以这么访问:
|
|
description
属性是不可写的。
|
|
catch
绑定在Node.js 8中,使用try/catch
时你总是需要在catch中声明一个变量,即使你用不到该变量。
|
|
ES2019中可选的catch
绑定能让你跳过在catch中定义变量。可选的catch
绑定在Node.js 10和Chrome 66以上版本中是可用的。
|
|
对象的扩展运算符,用于去除参数对象的所有可遍历属性,拷贝到当前对象之中。
|
|
克隆一个对象有两种写法
|
|
|
|