发布于 2024 年 10 月 21 日,星期一
HTML、CSS、JavaScript等前端基础技术的特定用法、浏览器兼容性问题、性能优化技巧、以及一些新兴的前端框架或库的使用方法。通过总结这些陌生点,博客旨在帮助前端开发者更好地理解和掌握这些技术细节,从而提升开发效率和代码质量。
1. obj.a -> value
2. obj["a"] -> value
eg = null
/**
1. Cloud.openid.subscribeMessage.send({
touser: ‘推送的 openid’
page: ‘点击推送进入的页面路径(绝对路径)’
data: {
{{things1:DATA}}
},
templateId: ‘订阅消息模板 ID’
})
2. 在 config.json 中进行配置:
"permissions": {
"openapi": [
"templateMessage.send"
]
}
*/
/**
1. export 导入: export {errorFun,throttle};
import {errorFun,throttle} from '../../util/util';
2. export default errorFun;
import errorFun from '../../util/util';
3. module.exports {error:errorFun,throttle};
let errorFun = require('../../util/util');
*/
{
"permissions": {
"openapi": [
"templateMessage.send"
]
}
}
\* {
margin: 0;
padding: 0;
}
// H5:
window.addEventListener('online', () => {
// 网络由异常到正常时触发
});
window.addEventListener('offline', () => {
// 网络由正常常到异常时触发
});
// minapp:
wx.onNetworkStatusChange(res => {
console.log(res.isConnected); // true false
console.log(res.networkType); // 3G 4G
});
dayjs:Day.js
是一个极简的 JavaScript 库,可以为现代浏览器解析、验证、操作和显示日期和时间。lodash:Lodash
是一个一致性、模块化、高性能的 JavaScript 实用工具库,处理字符串、数组、对象,函d3js:D3
是最流行的数据可视化库,使用 Web 标准,并利用现代浏览器的强大功能,使数据npm install figlet
https://smalldev.tools/
https://storytale.io/
https://undraw.co/
https://error404.fun/
https://ihateregex.io/
https://carbon.now.sh/
https://animista.net/
https://yibanbianji.com/?utm=baidu_qxq2&kword=%CE%A2%D0%C5%B9%AB%D6%DA%BA%C5%B6%FE%CE%AC%C2%EB%D4%F5%C3%B4%C9%FA%B3%C9&bd_vid=10796501980713393318
let arr = [1, 5, 1, 5, 12, 1, 21, 2];
let arr = [].concat(arr);
/**
1. 创建新变量
2. 确定其数据类型
3. 赋值给新的变量
*/
console.log(arr); // > [1,5,1,5,12,1,21,2]
let obj = { name: 'zhangsan' };
let newObj = new Object(obj.name);
console.log(newObj);
删除线:~~世界是平坦的。~~
任务列表:
Write the press release
Update the website
Contact the media
使用 emjoy 表情:去露营了! :tent: 很快回来。真好笑! :joy:
锚点:回到顶部
start 历史:https://star-history.com/#guodongxiaren/README&Date
let obj = {
a: 1,
b: function () {
console.log('b中的method');
}
};
obj['b'](); // > b中的method
obj.b(); // > b中的method
object-fit 属性可接受如下值:
fill
contain
cover
none
scale-down
resize:
none
用户无法调整元素的尺寸。both
用户可调整元素的高度和宽度。horizontal
用户可调整元素的宽度。vertical
用户可调整元素的高度。https://www.w3school.com.cn/css/css3_images.asp
:root {
--blue: #6495ed;
--white: #faf0e6;
}
body {
background-color: var(--blue);
}
new map()
用来存储一组键值对集合,有很快的查找速度;new set()
用来存储值的集合,且存储的值都是唯一的,可自动去重;Math.abs(x)
返回数的绝对值Math.ceil(x)
向上取整Math.floor(x)
乡下取整Math.max(x,y)
返回 x,y 的最大值Math.min(x,y)
返回 x,y 的最小值Math.round(x)
返回数的四舍五入最接近的整数https://www.fundebug.com/
腾讯云:前端性能监控<font face="黑体">我是黑体字</font> <font face="微软雅黑">我是微软雅黑</font> <font face="STCAIYUN">我是华文彩云</font>
<font color="#0099ff" size="12" face="黑体">黑体</font> <font color="#00ffff" size="3">null</font>
<font color="gray" size="5">gray</font>
https://guide.aotu.io/
https://tgideas.qq.com/doc/index.html
https://github.com/ecomfe/spec/blob/master/README.md
http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/
https://github.com/airbnb/javascript
http://nec.netease.com/standard
console.time()
和 console.timeEnd()
;console.time()
相当于开启一个计时器console.timeEnd()
相当于关闭一个计时器console.time()
和 console.timeEnd()
方法传值console.time('timer1');
setTimeout(() => {
let res = console.timeEnd('timer1');
console.log(res);
}, 1000);
console.timeLog()
打印当前计时器的当前时间console.time('timer');
setTimeout(() => {
console.timeLog('timer');
setTimeout(() => {
console.timeLog('timer');
}, 2000);
}, 1000);
// timer: 1002.80224609375 ms
// timer: 3008.044189453125 ms
console.count()
计数器,统计打印次数console.countReset()
重置计数器console.table()
打印成表格,
console.table()
方法有两个参数第一个参数是需要打印的对象第二个参数是需要打印的表格的标题,const users = [
{
first_name: 'Harcourt',
last_name: 'Huckerbe',
gender: 'Male',
city: 'Linchen',
birth_country: 'China'
},
{
first_name: 'Allyn',
last_name: 'McEttigen',
gender: 'Male',
city: 'Ambelókipoi',
birth_country: 'Greece'
},
{
first_name: 'Sandor',
last_name: 'Degg',
gender: 'Male',
city: 'Mthatha',
birth_country: 'South Africa'
}
];
console.table(users, ['first_name', 'last_name', 'city']);
console.table()
来打印数组元素:const app = ['facebook', 'google', 'twitter'];
console.table(app);
console.table()
只能处理最多 1000 行console.trace()
方法可以用于打印当前执行的代码在堆栈中的调用路径, 有利于开发人员进行调试console.dir()
方法可以在控制台中显示指定 JavaScript 对象的属性,并通过类似文件树样式的交互console.dirxml()
方法用于显示一个明确的 XML/HTML 元素的包括所有后代元素的交互树console.memory
是 console
对象的一个属性,而不是一个方法。它可以用来查看当前内存的使用情console.log()
会占用较多的内存,导致浏览器出现卡顿情况。window.addEventListener('load', event => {
// 查询网页Navigation Timing 指标
setTimeout(() => {
const timing = window.performance.timing;
console.log('DNS查询耗时:', timing.domainLookupEnd - timing.domainLookupStart);
console.log('TCP链接耗时:', timing.connectEnd - timing.connectStart);
console.log('request耗时:', timing.responseEnd - timing.responseStart);
console.log('解析DOM树耗时:', timing.domComplete - timing.domInteractive);
console.log('白屏时间:', timing.domLoading - timing.fetchStart);
console.log('domready时间:', timing.domContentLoadedEventEnd - timing.fetchStart);
console.log('onload时间:', timing.loadEventEnd - timing.fetchStart);
}, 0);
});
[English](README.en.md) | [中文](README.md)
npm install -g jsdom
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
yarn add babel-plugin-transform-remove-console -D
// 项目在发布时需要用到的 babel 插件数组
const proPlugins = [];
// 如果当前是development开发环境或者是production生产环境,则使用去掉 console 的插件
if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production') {
proPlugins.push('transform-remove-console');
}
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [...proPlugins]
};
npx babel --clear-cache
yarn babel --clear-cache
let obj = {
name: 'John Doe',
content: {
type: 'text',
value: 'Hello, World!'
}
};
function test(
info = {
name: '',
content: {
type: '',
value: ''
}
}
) {
console.log('info --->', info);
}
test(obj);
// 指定特定版本号
"engines": {
"node": "14.17.0"
}
// 范围符号:表示项目需要Node版本大于等于12.0.0且小于16.0.0。
"engines": {
"node": ">=12.0.0 <16.0.0"
}
// 波浪线符号:表示项目需要Node版本为14.17.x
"engines": { "node": "~14.17.0" }
// 插入符号:表示项目需要Node版本为14.x.x
"engines": { "node": "^14.17.0" }
# .npmrc
engine-strict = true
npm ERR! code ENOTSUP
npm ERR! notsup Unsupported engine for react_antd_admin_template@1.0.0: wanted: {"node":"14.17.5","npm":"6.14.14"} (current: {"node":"16.18.1","npm":"8.19.2"})
npm ERR! notsup Not compatible with your version of node/npm: react_antd_admin_template@1.0.0
npm ERR! notsup Not compatible with your version of node/npm: react_antd_admin_template@1.0.0
npm ERR! notsup Required: {"node":"14.17.5","npm":"6.14.14"}
npm ERR! notsup Actual: {"node":"16.18.1","npm":"8.19.2"}
.nvmrc
文件,来制定 node 版本:# .nvmrc
v14.17.5
npm
会基于当前项目的目录的 node_modules/.bin
目录下超窄是否存在 vue-cli-service
node_modules/.bin
中没有找到 vue-cli-service
, 则 npm
会继续在全局 node_modules/.bin
目录下查找 <script>
对应的可执行文件。vue-cli-service
后,npm
执行该命令。./node_modules/.bin/vue-cli-service serve
npm run serve
时,npm
实际上会将项目的 node_modules/.bin
目录添加到系统的环境变量的 PATH
中,这个目录包含了大部分通过 npm install
安装的可执行文件,其中也包括了 vue-cli-service
vue-cli-service
命令,不用再命令行中执行完整的路径。node_modules/.bin
目录下。让我们逐步实现这个功能:
首先,我们需要给 user-detail 组件添加一个 name 属性,这样它就可以递归地引用自己:
<script>
export default {
name: 'UserDetail'
// ... 其他代码保持不变
};
</script>
在 user-detail 组件的 methods 中,修改 showPromoterInfo 方法:
methods: {
// ... 其他方法保持不变
showPromoterInfo(unionid) {
if (!unionid) {
this.$message.warning('推广员 ID 不存在');
return;
}
// 创建一个新的 UserDetail 组件实例
const PromoterDetailComponent = this.$options.components.UserDetail;
const instance = new PromoterDetailComponent({
propsData: {
// 如果需要传递一些特定的 props,可以在这里添加
}
});
// 挂载组件
const vm = instance.$mount();
document.body.appendChild(vm.$el);
// 调用 show 方法并传入 unionid
vm.show(unionid);
// 监听关闭事件
vm.$once('close', () => {
document.body.removeChild(vm.$el);
vm.$destroy();
});
},
},
在 user-detail 组件的 script 部分,确保组件被正确导入和注册:
<script>
export default {
name: 'UserDetail',
components: {
UserDetail: () => import('./UserDetail.vue') // 使用动态导入来避免循环依赖
}
// ... 其他代码保持不变
};
</script>