html2canvas

html2canvas

基本使用

npm install html2canvas
import html2canvas from 'html2canvas'
// 语法
// html2canvas(element, options)

html2canvas(document.body).then(function(canvas) {
// document.body.appendChild(canvas)
let dataURL = canvas.toDataURL('image/png') // dataURL 为 base64 图片
// var img = new Image()
// img.src = dataURL
// document.body.appendChild(img)
})

常用配置使用示例

var options = {
dpi: 192,
scale: 2, // 放大
// logging: true, //日志开关,便于查看html2canvas的内部执行流程
useCORS: true // 开启跨域配置, (跨域图片,转换的时候会将跨域图片识别为空白,因此需要开启此选项)
}
html2canvas(document.querySelector('#app'), options).then(canvas => {
document.body.appendChild(canvas)
})

html2canvas 生成图片模糊问题

  1. html2canvas 第二个参数配置 scaledpi, 参考
  2. 如果要生成的 dom 中有背景图片,将背景图片换成 div 包裹 img 标签形式,不要通过css设置成background

dom-to-image

dom-to-image

基本使用

npm install dom-to-image
/* in ES 6 */
import domtoimage from 'dom-to-image'
/* in ES 5 */
var domtoimage = require('dom-to-image')
var node = document.getElementById('my-node')

domtoimage
.toPng(node)
.then(function(dataUrl) {
var img = new Image()
img.src = dataUrl
document.body.appendChild(img)
})
.catch(function(error) {
console.error('oops, something went wrong!', error)
})

将 base64 转换成 file 对象用于上传到服务器

b64ToFile(dataurl)  {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
let file = new File([u8arr], 'filename.png', {type:mime})
}

dux 主题默认使用 Google Code Prettify 实现代码高亮

下载

highlight 官网下载 js 和 css 文件

可以使用官网提供的 CDN 链接,也可以根据需要定制自己需要的语言

选择自己喜欢的主题,在这里进行下载

highlight.main.js 文件放到主题的 /js/libs/ 文件夹中

编辑主题文件

编辑 /js/loader.js 文件,将 highlight.min.js 引入

tbquire.config({
baseUrl: jsui.uri + '/js',
urlArgs: 'ver=' + jsui.ver,
paths: {
'swiper' : 'libs/swiper.min',
'jquery.cookie' : 'libs/jquery.cookie.min',
'jsrender' : 'libs/jsrender.min',
'router' : 'libs/router.min',
'lazyload' : 'libs/lazyload.min',
'prettyprint' : 'libs/prettyprint',
+ 'highlight' : 'libs/highlight.min',
'ias' : 'libs/ias.min',
'main' : 'main',
'comment' : 'comment',
'user' : 'user'
}
})

编辑 /js/main.js 注释掉 prettyprint 部分

/*
* prettyprint
* ====================================================
*/

-$('pre').each(function(){
- if( !$(this).attr('style') ) $(this).addClass('prettyprint')
-})

-if( $('.prettyprint').length ){
- tbquire(['prettyprint'], function(prettyprint) {
- prettyPrint()
- })
-}

+/*
+ * highlight
+ * ====================================================
+*/
+
+$('pre code').forEach((block) => {
+ tbquire(['highlight'], function() {
+ hljs.highlightBlock(block)
+})

此时 highlight 脚本已经生效,接下来就是应用 highlight 样式

应用 highlight 样式

你可以选择将下载好的 css 文件打开,将样式拷贝到 /libs/css/main.css 文件中

也可以在 wordpress后台-外观-自定义-添加额外css 中为主题定义样式

若行首为 ([/+-,会与上一行代码相接,此时需要在行首添加分号
++--在上下两行都不加分号的情况下,与下一行代码相接
return 语句在执行时会在末尾加分号

主要区分 +0-0NaNNaN 在不同情况下的相等性区别

== ===

console.log(+0 === -0) // true
console.log(NaN == NaN) // false NaN 不与任何值相等,包括自身
console.log(undefined == null) // true
console.log(undefined === null) // false
console.log(NaN === NaN) // false
console.log(Number.NaN === NaN) // false

Object.is() 方法判断两个值是否是相同的值。比较时不会做类型转换,这与 == === 运算符的判定方式都不一样

Object.is(+0, -0) // false
Object.is(0, -0) // false
Object.is(0, +0) // true
Object.is(-0, -0) // true

Object.is(undefined, undefined) // true
Object.is(null, null) // true
Object.is(Number.NaN, Number.NaN) // true
Object.is(Number.NaN, NaN) // true
Object.is(NaN, NaN) // true
Object.is(NaN, 0 / 0) // true

在 Set, Map 内部,两个 NaN 是相等, +0 和 -0 也是相等的

let a = [NaN, NaN, undefined, undefined, +0, -0, {}, {}]
let b = new Set(a) // {NaN, undefined, 0, {}, {}}

总结:

  • 比较运算符中 +0-0 是相等的、NaNNaN是不等的
  • Object.is() 方法中 +0-0 是不相等的、NaNNaN是相等的
  • 在 Set, Map 内部, +0-0 是相等的、NaNNaN 也是相等的

MDN上关于 setTimeout 介绍

语法

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...])
// delay 可选 默认 0
// param1, ..., paramN 可选 ,附加参数,一旦定时器到期,他会作为参数传递给 function
// 返回值timeoutID是一个正整数,表示定时器的编号

应用

for (var i = 1; i <= 5; i++) {
setTimeout(
function timer(j) {
console.log(j)
},
i * 1000,
i
)
}
// 会立即返回一个 timeid
// 1
// 2
// 3
// 4
// 5

wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py
# 添加权限
chmod a+rx speedtest.py
# 简单的使用方法
python speedtest.py
# 生成一张图片,并分享给其他人
python speedtest.py --share
# 在默认情况下,SpeedTest是选择离测试机最近的一个节点进行测试的,如果你想要自定义测试到某个地区的上传/下载速率,那首先列出目前可用的SpeedTest服务器:
python speedtest.py --list
# 此时会列出所有的服务器(按照距离远近进行排列)
# 如果想一点一点的列出服务器,请输入:
python speedtest.py --list|more
# 如果你想列出指定地区的测试节点,可以使用
python speedtest.py --list | grep China
python speedtest.py --server 22991
# 如果是要生成分享的图片,那就加上 share
python speedtest.py --server 11599 --share

参考链接:https://juejin.im/post/59bb864b5188257e7a427c09

使用 iconfont

阿里开源图库 https://www.iconfont.cn/

使用方法 https://www.iconfont.cn/help/detail?spm=a313x.7781069.1998910419.d8d11a391&helptype=code

下载代码到本地(也可以使用在线链接)打开 demo_index.html 使用说明,有三种使用方式 unicode font-class symbol
unicode 方式: &#x33; 这样,不直观,语意不明确,不支持多色图标
font-class 方式: 使用 class 定义,有语意,需要注意命名空间的问题,也是不支持多色图标
symbol 方式:使用 svg 不用再去请求 woff|eot|ttf| 这些字体库,且缩放不会失真,支持更加复杂的图标

symbol 方式使用步骤:

第一步:引入项目下面生成的 symbol 代码:

<script src="./iconfont.js"></script>

或通过 import 导入

import './iconfont.js'

第二步:加入通用 CSS 代码:

.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}

第三步:挑选相应图标并获取类名,应用于页面:

<svg class="icon" aria-hidden="true"><use xlink:href="#icon-xxx"></use></svg>

symbol 其实使用了 SVG Sprite 技术, 所有的 svg-sprite 都是通过 iconfont 的 iconfont.js 生成的,所以:

所有图标 icon 都很不直观,完全不知道哪个图标名对应什么图标,每次增删改图标,或者添加一些自定义的 svg 图标,只能将其也上传到 iconfont 和原有的图标放在一个项目库中,之后再重新下载,将整体 js 文件一起替换,而且也做不到按需加载

导出的 svg 包含大量的无用信息,例如编辑器源信息、注释等。通常包含其它一些不会影响渲染结果或可以移除的内容

vue cli3 项目使用 svg-sprite-loader 打包 svg

vue cli3 默认使用 file-loader 处理 svg:

/* config.module.rule('svg') */
{
test: /\.(svg)(\?.*)?$/,
use: [
/* config.module.rule('svg').use('file-loader') */
{
loader: 'file-loader',
options: {
name: 'static/img/[name].[hash:8].[ext]'
}
}
]
}

并路径指定为在 img 文件夹下,但我们的 svg 并不在 img 文件夹,而且 svg-sprite-loader 已经自带了 file-loader 的功能,所以,我们可以在我们自定义的 vue.config.js 文件下将 rule(svg) 清除:

module.exports = {
chainWebpack: config => {
config.module.rule('svg').uses.clear()
}
}

或者添加忽略,然后加上自定义的 svg rule,最后的配置如下:

/* 使用 svg-sprite-loader 处理 svg */
// 默认规则忽略 src/icons 文件夹
config.module
.rule('svg')
.exclude.add(path.resolve(__dirname, 'src/icons'))
.end()

// src/icons 文件夹下的 svg 使用 svg-sprite-loader
config.module
.rule('svg-sprite-loader')
.include.add(path.resolve(__dirname, 'src/icons'))
.end()
.test(/\.svg$/)
.use('svg-sprite')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()

之后可以通过如下方式使用

import '@/icons/qq.svg'
<!-- xlink:href="#icon-图标文件名 -->
<svg><use xlink:href="#icon-qq" /></svg>

使用缺点:需要手动导入图标

自动导入

使用 webpack 的 require.context api

require.context 语法

require.context(directory, (useSubdirectories = false), (regExp = /^\.\//))
// directory:说明需要检索的目录
// useSubdirectories:是否检索子目录
// regExp: 匹配文件的正则表达式
// Examples:
require.context('./test', false, /\.test\.js$/)
// 表示在 test 文件夹(不包含子目录)下面的找所有文件名以 .test.js 结尾的能被 require 的文件

自动引入 @/icons 下面所有的图标

// 基础组件的自动化全局注册
const requireComponent = require.context('../../components', false)
// console.log(requireComponent.keys())
requireComponent.keys().forEach(filename => {
const componentConfig = requireComponent(filename)
// console.log(componentConfig)

const componentName = filename
.split('/')
.pop()
.replace(/\.\w+$/, '')
// console.log(componentName)

Vue.component(
componentName,
// 如果这个组件选项是通过 `export default` 导出的,
// 那么就会优先使用 `.default`,
// 否则回退到使用模块的根。
componentConfig.default || componentConfig
)
})
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('@/icons', false)
requireAll(req)

之后直接将图标放入 @/icons 文件夹下就可以直接使用了,删改图标同理

优化 svg

删除无用信息 svgo
阿里云导出的 svg 是带有默认的 fill 的,导致图标不能继承父级元素的颜色,可以通过删除默认 fill 解决

安装

npm i svgo svgo-loader -D
config.module
.rule('svg-sprite-loader')
.include.add(path.resolve(__dirname, 'src/icons'))
.use('svgo-loader')
.loader('svgo-loader')
.tap(options => {
options = {
plugins: [
{ removeXMLNS: true }, // 删除xmlns属性(对于内联svg,默认情况下禁用)
{ convertStyleToAttrs: true } // 将css样式转换为svg元素属性
]
}
return options
})

也可以在图标管理中 我的项目 批量操作 批量去色 将默认颜色去除, 之后可以通过 css 自定义颜色

svg {
fill: red;
}

问题:使用 axios 发送请求会拦截响应头中的 set-cookie,导致 cookie 丢失

https://github.com/axios/axios/issues/953

在控制台中也找不到 cookie

console.log(res.headers['set-cookie']) // undefined
console.log(document.cookie) // ''

解决方式:修改 axios 配置

axios.defaults.withCredentials = true // 默认是 false

// Axios.interceptors.request.use(
// config => {
// config.withCredentials = true // 添加
// return config
// })

axios.create({
withCredentials: true // 表示跨域请求时是否需要使用凭证 默认 false
})

设置 withCredentials = true 会造成跨域,需要使用代理解决跨域问题

谷歌浏览器扩展程序管理页面 chrome://extensions/

方式一 .crx

打开扩展程序管理页面,将 .crx 格式插件拖入浏览器即可

若安装时出现“程序包无效 CRX-HEADER-INVALID”的报错信息,或出现 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的,且插件无法启用,可使用方式二安装

方式二 .zip

将 .crx 插件后缀改成 .zip,或下载 .zip 格式插件

扩展程序管理页面,开启开发者模式,再按 F5 刷新一下,将 .zip 格式插件拖入浏览器,或者将 .zip 格式插件解压,点击加载已解压的扩展程序

其他

禁用 Chrome 的“请停用以开发者模式运行的扩展程序”提示的方法

用于注册临时账号,保护隐私

临时邮箱

https://bccto.me/
https://10minutemail.net/
http://24mail.chacuo.net/
http://www.yopmail.com/zh/
https://shorttimemail.com/zh-Hans/
https://temp-mail.org/zh/
https://t.odmail.cn/
https://9em.org/
https://maildrop.cc

https://eskiimo.com 匿名发送邮件

短信验证码平台

国内平台
https://www.pdflibr.com
https://www.visitorsms.com/cn
https://www.becmd.com
http://www.114sim.com
https://yunduanxin.net
http://www.smszk.com
http://z-sms.com
http://www.shejiinn.com
https://sms.cngrok.com

国外平台

https://ch.freephonenum.com
https://smsreceivefree.com
https://zh.mytrashmobile.com
https://www.receive-sms-online.info
https://receiveasms.com
https://sms-online.co/receive-free-sms
https://receive-sms.com