首页

javascript中的this绑定

前端达人

his是一个关键字,表示执行当前函数的对象

  • this永远跟着当前函数走,
  • 永远是一个对象,

  • 永远在函数执行时才能确定。
  • 1. 默认绑定:没有明确被隶属对象执行的函数,this指向window


function fn(){
    console.log(this);              //window
    console.log(typeof this);       //object
}
fn();

- 严格模式下,this指向undefiend

"use strict";
function fn(){
    console.log(this);              //undefined
}
fn();




Webpack:知识点总结以及遇到问题的处理办法

前端达人

文章目录

0.官方文档:

1.webpack概述:

2.webpack的基本使用:

3.在项目中安装和配置 webpack:

4.配置自定义打包的自定义入口和出口:

4.配置自动打包功能:

5.配置生成预览页面功能:

6.配置自动打包相关参数:

7.webpack 中的加载器:

8.loader加载器的基本使用:

9.Vue单文件组件:

10.webpack 打包发布:

11.以上所有配置 webpack.config.js 截图


1.webpack概述:
webpack是一个流行的前端项目构建工具(打包工具) ,可以解决当前web开发中所面临的困境
webpack提供了友好的模块化支持,以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能,从而让程序员把工作的重心放到具体的功能实现上,提高了开发效率和项目的可维护性

2.webpack的基本使用:
2.1:打开终端运行命令 npm init -y 初始化包管理配置文件 package.json

2.2:新建 src 源文件目录(里面放程序员自己写的代码比如 html css js images …)

2.3:如果需要引入 jquery 库 终端运行以下命令npm install jquery -S 安装 jquery

自己在src文件夹中创建 index.js 引入下载的jquery包import $ from 'jquery'

3.在项目中安装和配置 webpack:
3.1:终端运行 npm install webpack-cli -D 命令,安装webpack相关的包

这里要注意一个问题 : package.json 和 package-lock.json 文件里的名字默认为 “name”=“webpack”,在配置 webpack-cli 之前要把name 改成 其他名字 比如 “name”=“webpack_” 不然的话为出现无法安装的问题

具体可点击这里 Webpack依赖包安装问题解决方案
3.2:在项目根目录中 ,创建名为 webpack.config.js 的 webpack 配置文件

3.3:在 webpack.config.js 中,初始化一下基本配置

建议选择 development (打包速度快,体积大),项目上线是才改成 production (如果选择production会进行代码的压缩和混淆,打包速度慢,体积小)

3.4:在package.json中的 script节点 新增一个dev脚本 值为 webpack ,就可以实现打包功能



  • 在终端运行命令:npm run dev 就可以打包 默认打包成main.js在 dist文件夹中

  • src自己新建的index.html 中引入打包后的 js




属性描述符与Proxy的区别&Vue3.0为何改用Proxy

前端达人

属性描述符

什么是属性描述符?

属性描述符就是一个属性除了属性名与属性值之外的其他相关信息

通过Object.getOwnPropertyDescriptor(对象, 属性名)可以得到一个对象的某个属性的属性描述符

let obj = {
    a: 1
}
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// {
//     value: 1,
//     writable: true,
//     enumerable: true,
//     configurable: true
// }

通过Object.getOwnPropertyDescriptors(对象)可以得到某个对象的所有属性描述符

let obj = {
    a: 1,
    b: 2
}
console.log(Object.getOwnPropertyDescriptors(obj));
// {
//     a: {
//         value: 1, 
//         writable: true,
//         enumerable: true,
//         configurable: true
//     }
//     b: {
//         value: 2, 
//         writable: true, 
//         enumerable: true, 
//         configurable: true
//     }
// }


接下来,说一说每一个属性描述符的作用

value-属性值

不多逼逼

configurable-属性描述符是否可被修改

当我们设置configurable为false以后,再去修改属性描述符的话,会报错


let obj = {
    a: 1,
    b: 2
}
Object.defineProperty(obj, 'a', {
    value: 'a',
    configurable: false
})
Object.defineProperty(obj, 'a', {
    value: 'a',
    configurable: true
})
// Uncaught TypeError: Cannot redefine property: a
//    at Function.defineProperty (<anonymous>)



enumerable-该属性是否可被枚举

当设置一个属性的enumerable为false时,该属性不可被forin循环
但是不影响forof循环,因为forof循环看有没有Symbol(Symbol.iterator)
forin循环的是属性名,forof循环的是属性值


丑出天际的莲花足球场,竟然是知名设计团队的作品!

资深UI设计者

不用看时间,你没有穿越,现在是 2020 年,不是 2000 年。这复古的字体设计和这带有年代感的落日背景,以及悠扬壮阔的背景音乐,甚至让我以为是在看二十年前新年晚会的演出视频。

△ 视频链接:https://v.youku.com/v_show/id_XNDYzNTE2MzgxNg==.html

不得了,不得了,恒大足球场的宣传视频甚至登上了央视的广告舞台,展示给了全国观众,壕气十足,花开富贵,这绚烂的烟花背景,让我瞬间梦回三十年前。

建筑不仅外表华丽,其实文化内涵还很深厚,与中老年表情包冥冥之中有了一个巧妙的对应,蕴含着给你带来好运,祝你平安健康。

据网友考据,设计理念可能来自于一盆多肉,为了更加贴近人民群众的生活,让人们时时感受到自然的美妙。

还有网友幻想出最终建设完成时的终极形态,积极对建筑进行了自己的解读和创作,看这广泛的联合角色设计,佛祖、红孩儿;这跨越多个时代的风格杂糅,上个世纪的吉祥如意、这个世纪的游戏建模;涵盖多个领域的莲花主题,植物、彩灯,应有尽有,真是妙啊!

什么?你觉得不好看吗?这可是恒大总裁许家印从 9 种莲花宝座设计方案中精挑细选出来的一个!九种不同的莲花设计方案,深浅不同的粉红色,看不出有多大不同的开合程度,微微不一样的花瓣设计,供你瞪大双眼选择。

你问:可以阻止这个色彩绚丽的建筑修建起来么?来晚了,莲花宝座已经于 4 月 16 日开始修建,届时会成为世界规模最大的顶尖专业足球场。开心一点,说不定以后能在中国看世界杯了呢。

既然是世界规模最大的顶尖足球场!为什么不修好看一点?这什么设计师,这种红配绿,亮瞎人眼的设计是哪个沙雕公司设计的?许老板这么有钱,怎么不请好一点的设计师呢。广州这么时尚的城市配上这样的土味建筑,真是令人头大。其实,你可能骂错人了。背后的设计公司可是 Gensler,现在世界上数一数二的的设计团队。这不是变魔术,设计出上面土味十足的建筑和下面高级感扑面而来的建筑的就是一个团队。

上海中心大厦(右一),凭借其独特的造型和楼高,荣获诸多大奖,成为上海地标性的建筑之一。

还有菲律宾金融中心大厦,与周围的建筑对比起来,科技感和现代感十足,在 CBD 群中独占鳌头。

又或者是在波士顿起到枢纽作用的综合体建筑设计,一眼望去称霸整个地区。

这怎么看,都不像是一个团队设计出来的作品。莲花球场和高级感相关在哪里?这不是随随便便一个设计师都可以设计出来的么?其实,这也不是许老板第一次这么偏爱莲花了,看看海花岛项目就知道了,网友调侃说到,果然设计师还是败给了金钱。

不过同样是以莲花为设计元素,印度的莲花寺怎么看起来就这么高端优雅呢?与莲花球场「土味建筑」不同的是,莲花寺广受好评,被称为新德里的「悉尼歌剧院」。

类似莲花球场这样的案例在中国还有很多。之前被评为 2017 年中国最丑陋的十大建筑之一的广州圆大厦,由意大利米兰设计师 Joseph di Pasquale 设计,他在采访中说到:「中国改变了他,让他知道了文化如何融于建筑,如何更好地满足客户的欲望。」其实建筑的寓意「双环玉璧」是很好的,但是最终的效果不尽人意,建筑类似于黄金的外表颜色,被网友们吐槽,称其为「土豪圆」。

不过设计这个事情,有时候也很难去用单纯的美丑判别。例如设计出台北 101 大厦的李祖原老师,在同年设计出的沈阳方圆大厦,是参考铜钱的形状设计而成。在 2000 年威尼斯世界建筑设计展览会上被称赞为是「世界上最具创意性和革命性的完美建筑」,但在 2012 年却被 CNN 旗下的生活旅游网评选为全球最丑的十大建筑之一。

你以为这就结束了吗?别走,奇葩建筑还有很多,中国各个省都互不相让。首先我们从南看起,海南三亚的「美丽之冠」,就是后面那些像树一样的建筑,一模一样的楼不知道为什么要修建九个。

往北走,我们来到了官方宣传视频里写到的「不来万家丽,枉来中国行」,之中的世界最大建筑「长沙万家丽」。这栋同样金碧辉煌、中西结合的建筑让你深刻体会到一句话「有钱就是可以为所欲为」。不论是美是丑是否合适,只要是自己喜欢的元素,通通都堆砌在一栋建筑里。

接着我们来到了山东的文成城堡,沈腾的《西虹市首富》取景地,看看这个豪华程度,一晃神还以为自己来到了欧洲。

最后我们来到河北,学习魔法不需要出国,直接来河北美术学院,一个被戏称为「霍格沃茨华北分校」的美术帝国,由于其仿照魔法学院进行的设计,在中国众多美院中独树一帜。

以上这些奇葩建筑的盘点,均来自于 B 站 up 主史里芬 Schlieffen,一个被长沙万家丽老板黄总盛情邀请再次体验万家丽的男人。盘点中国奇葩建筑,现代青年当仁不让。想要了解中国建筑底层设计的朋友,可以前去品鉴和观赏,不要怪我用丑陋和土味蒙蔽了你们的双眼。押韵的解说词,第一视角的全方位建筑讲解,你值得拥有。

主页链接:https://space.bilibili.com/323733137/

这样的建筑作品很新鲜但是确实不美观。且不说中国其实有很多好的设计师,为什么和国外知名设计团队合作,做出来的作品依旧差强人意呢?难不成是我们的审美水平真的已经沦落成这个地步了?如果哪天全民都觉得这样的建筑是美的,都欣赏这样的建筑,那我们整个社会才算是陷入了「恶趣味审美」之中,就真正完蛋了。标榜着以「莲花绽放」这一美好寓意为核心的莲花球场设计,何尝不是披着虚伪外衣的土味建筑设计呢?美能够让人感到幸福,反过来,丑则使人感到不适。

对于莲花宝座外形的足球场设计,我想开了,毕竟我不是亚洲第五富,众位设计师,你们是怎样看待的呢?

文章来源:优设    

想设计Feed 流产品?先来收下这份基础知识科普

资深UI设计者

什么是「Feed」

feed 单词释义:v. 喂养;进食;为……提供充足的食物;施肥;为(某人)提供(信息、主意等);

n. 饲料;饲养;(尤指给动物或婴儿)喂食;进食;(计算机的)订阅源

形象来讲,如今新浪微博、微信朋友圈、抖音、今日头条、小红书、Facebook、QQ 空间等等内容平台每时每刻都在不断投喂给我们赖以维系健康生活(废柴生活)的精神食粮——信息内容。而这些信息组合起来的格式便是 feed。

1. Feed

feed 是一种信息格式,平台通过它将资讯传递给用户。feed 是信息聚合的最小单元,每一条状态或者消息都是 Feed,比如朋友圈中的一个动态就是一个Feed,微博中的一条微博就是一个 Feed。

2. Feed流

feed 流即持续更新并呈现给用户内容的信息流。每个人的朋友圈,微博关注页,头条新闻等等都是一个 Feed 流。

Feed的前世今生

Feed 源于早期的 RSS(Really Simple Syndication )

RSS(简易信息聚合):将用户主动订阅的若干消息源组合在一起形成内容(aggregator),帮助用户持续地获取的订阅源内容。对用户而言,聚合器是专门用来订阅网站的软件,一般亦称为 RSS 阅读器、feed 阅读器、新闻阅读器等。用户选择订阅多个订阅源,网站提供 feed 网址 ,用户将 feed 网址登记到聚合器里,在聚合器里形成聚合页,用户便能持续地获取的订阅源内容。

在早期的 Web 时代,订阅源一般是新闻网站以及博客。用户主动订阅感兴趣的多个订阅源,订阅器帮用户及时更新订阅源信息,然后按照 timeline 时间顺序展示出来。这样,用户可以通过订阅器获取即时信息,而不用每天都检查各个订阅源是否有更新。

转折出现在 2006 年,Facebook 宣布了一项新的首页形式「News Feed」,这一形式打破了传统 RSS 的订阅方式。News Feed 可以看做一个新型聚合器,订阅源不仅仅是某个网址、某个新闻网站或者某个内容,而是生产内容的人或者团体,而内容即是好友或关注对象的动态(发布的内容以及其他的社交行为)。News Feed 的出现使得 RSS 被迫淡出历史舞台。News Feed 发展至今已经拓展出多种多样的模式和呈现方式。

Feed流的主要模式:

推模式:每当用户发帖,对所有粉丝推送一条该用户的动态消息记录。需要考虑的是如果一个粉丝量级非常大的用户(大 V),发布一条动态那么需要在每个粉丝页推送一条动态,多个大 V 级别用户同时发帖对数据的存储负荷是非常大的。

拉模式:每当请求好友动态,拉取用户所有关注者的最近动态,然后汇总排序。如果用户同时关注非常多的用户,那么查询这类型的用户的关注列表也是很大的数据成本。

推拉模式:在线推,离线拉;定时推,离线拉。

Feed流的排序方式:

除了关注 feed 流的主要模式之外,feed 流的排序方式也值得一提:

Timeline:按发布的时间顺序排序,先发布的先看到,后发布的排列在最顶端,类似于微信朋友圈等。这也是一种最常见的形式。产品如果选择 Timeline 类型,那么就是认为 feed 流中的 feed 不多,但是每个 feed 都很重要,都需要用户看到。

Rank:按某个非时间的因子排序,一般是按照用户的喜好度排序,用户最喜欢的排在最前面,次喜欢的排在后面。这种一般假定用户可能看到的 Feed 非常多,而用户花费在这里的时间有限,那么就为用户选择出用户最想看的 Top N 结果,场景的应用场景有微博、头条新闻推荐类、商品、视频推荐等。

目前 feed 流的主流排序方式不再严格按照 timeline,而是广泛使用智能 feed 排序。

智能排序基于趋势 trending、热门 hot、用户生产 UGC 、编辑推荐 PGC、相似 Similarity 等等因素综合考虑,随着技术的进步,智能算法将会更加懂得用户的喜好。新的 feed 流不再需要用户主动订阅或者搜索,只要监测我们的浏览时长、点赞分享等动作,或者建立用户画像类别,就可以主动推荐我们感兴趣的内容。它对我们了如指掌,给我们想了解的,让我们不停刷新沉溺于其中。就现在 feed 流中的广告,女性用户对化妆品的喜好,男性用户对车的偏爱,临时借钱的窘迫,这些暖广告已经不再像牛皮癣一样惹人讨厌,甚至变成了一颗我们愿意吃下的安利。

Feed流的应用

可以有以下大致分类:

  • 社交互动类:微信、微博、Instagram、Facebook
  • 新闻资讯类:今日头条、腾讯新闻
  • 视频直播类:抖音、快手

feed 作为信息聚合的最小单元,每一个 feed 都会具备相应的内容。其中包括发布的时间、发布者、文字内容、图片内容,还包含点赞、转发、评论、关注等操作、根据应用场景、业务目标不同,其表现方式也大有不同,任何表现形式都应该是为了更好地呈现功能及内容。

新闻资讯类产品和社交互动类产品 feed 元素大体相同,区别在于新闻资讯类产品通常着重展现新闻内容,标题,简介,匹配的图片等,而发布时间和发布作者等会在单个 feed 的底部出现。在图文兼备的排版布局中,左文右图适合文字内容类比如文章或者知乎、豆瓣等长答案评论等,图片是辅助信息支撑文字内容。左图右文图片更加吸引人的注意通常出现在商品信息比如什么值得买。

社交互动类产品,其最终目的是发现和拓展社交关系,融入相应的社交圈。而这时候社交拓展的基本单位人或者团体发挥着至关重要的作用。所以我们可以发现,通常的社交互动软件都会将发布者头像放在上部展示的位置,也会在底部突出点赞,评论,分享等互动操作。

视频直播类产品与前两者相异,页面的大部分空间留给视频内容的展示,一般一屏只承载一个 feed 信息单元,内容等提示元素在左侧呈现,除回复评论等操作元素列在右侧。

feed 中各元素的位置关系、所占比例与产品自身定位密切相关。如微博作为泛社交应用产品,社交关系主要建立在内容上,社交关系质量较弱,多为单向传播,注重的是传播的速度和内容公开。所以其 feed 的呈现方式发布者与发布内容不做明显的设计排布区分。以卡片间隔的形式在 feed 与 feed 之间做区隔。评论页面在下一层级。

微信是作为一个社交工具,社交关系质量较强,多为双向关系,注重的是私人内容的交流和互动,信息的传播速度不快,但受众信息消化率很高。所以将发布者头像与发布内容做出较明显区分,feed 与 feed 之间因为已经有了头像元素这一明显区别要素,仅用分割线做区隔。且注重评论区域的互动与展示。

无论怎样的设计布局方式,遵循的核心思想始终是根据场景需求、业务目标去发展深化设计方案。每一个设计点都要有足够的支撑,多问问自己为什么这么设计,解决了用户什么样的问题?还有没有更好的替代方案?而不是这样设计是不是新颖,出奇制胜。

文章来源:优设    作者:Nicole

web下的性能优化1(网络方向)

seo达人

性能优化(网络方向)

web应用无非是两台主机之间互相传输数据包的一个过程; 如何减少传输过程的耗时就是网络方向优化的重点, 优化出发点从第一篇文章中说起


DNS解析过程的优化

当浏览器从第三方服务跨域请求资源的时候,在浏览器发起请求之前,这个第三方的跨域域名需要被解析为一个IP地址,这个过程就是DNS解析;

DNS缓存可以用来减少这个过程的耗时,DNS解析可能会增加请求的延迟,对于那些需要请求许多第三方的资源的网站而言,DNS解析的耗时延迟可能会大大降低网页加载性能。


dns-prefetch

当站点引用跨域域上的资源时,都应在<head>元素中放置dns-prefetch提示,但是要记住一些注意事项。首先,dns-prefetch仅对跨域域上的DNS查找有效,因此请避免将其用于您当前访问的站点


<link rel="dns-prefetch" href="https://fonts.googleapis.com/">

preconnect

由于dns-prefetch仅执行DNS查找,但preconnect会建立与服务器的连接。如果站点是通过HTTPS服务的,则此过程包括DNS解析,建立TCP连接以及执行TLS握手。将两者结合起来可提供机会,进一步减少跨源请求的感知延迟


<!-- 注意顺序, precontent和dns-prefetch的兼容性 -->

<link rel="preconnect" href="https://fonts.googleapis.com/" crossorigin>

<link rel="dns-prefetch" href="https://fonts.googleapis.com/">

TCP传输阶段优化

这个前端方面好像能做的有限, 我们都知道 http协议 是基于 tcp的;

升级http协议版本可以考虑下, 比如把 http/1.0 -> http/1.1 -> http/2;

这个需要我们在应用服务器上配置(nginx, Apache等), 不做概述了, 另外还需要客户端和服务器都支持哦, 目前还没开发出稳定版本,好多只支持https,不过也不远了...


http2 的优势

#  1.多路复用: 同一个tcp连接传输多个资源

这样可以突破统一域名下只允许有限个tcp同时连接,

这样http1.1所做的减少请求数优化就没有太大必要了

如多张小图合成一张大图(雪碧图),合并js和css文件


# 2.报文头压缩和二进制编码: 减少传输体积

http1 中第一次请求有完整的http报文头部,第二次请求的也是;

http2 中第一次请求有完整的http报文头部,第二次请求只会携带 path 字段;

这样就大大减少了发送的量。这个的实现要求客户端和服务同时维护一个报文头表。


# 3.Server Push

http2可以让服务先把其它很可能客户端会请求的资源(比如图片)先push发给你,

不用等到请求的时候再发送,这样可以提高页面整体的加载速度

但目前支持性不太好...emm...

总的来说, 在 c 端业务下不会太普及, 毕竟需要软件支持才行...


http 请求响应阶段优化

为了让数据包传输的更快, 我们可以从两个方面入手: 请求的数据包大小(服务器), 请求数据包的频率(客户端)


减少请求文件的大小

请求文件对应的是我们项目完成后,打包所指的静态资源文件(会被部署到服务器), 文件越小, 传输的数据包也会相对较小, 讲道理也会更快到达客户端


how to reduce a package size?

目前我们都会使用打包工具了(比如webpack, rollup, glup 等), 如何使用工具来减小包的体积呢? 这边建议您去官网文档呢...当然这里列举一下常用的手段(webpack 的), 但是注意要插件版本更新哦


JS文件压缩

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {

plugins: [

  new UglifyJsPlugin({

    // 允许并发

    parallel: true,

    // 开启缓存

    cache: true,

    compress: {

      // 删除所有的console语句    

      drop_console: true,

      // 把使用多次的静态值自动定义为变量

      reduce_vars: true,

    },

    output: {

      // 不保留注释

      comment: false,

      // 使输出的代码尽可能紧凑

      beautify: false

    }

  })

]

}

CSS 文件压缩

// optimize-css-assets-webpack-plugin

plugins: [

 new OptimizeCSSAssetsPlugin({

   assetNameRegExp: /\.css$/g,

   cssProcessor: require('cssnano'),

 }),

];

html 文件压缩

// html-webpack-plugin

plugins: [

 new HtmlWebpackPlugin({

   template: path.join(__dirname, 'src/index.html'),

   filename: 'index.html',

   chunks: ['index'],

   inject: true,

   minify: {

     html5: true,

     collapseWhitespace: true,

     preserveLineBreaks: false,

     minifyCSS: true,

     minifyJS: true,

     removeComments: false,

   },

 }),

];

source map 文件关闭

tree shaking

1.代码不会被执行,不可到达,比如 if(false){// 这里边的代码}

2.代码执行的结果不会被用到

3.代码只会影响死变量(只写不读)

4.方法不能有副作用


// 原理相关: 以后在研究

利用 ES6 模块的特点:

 只能作为模块顶层的语句出现

 import 的模块名只能是字符串常量

 import binding 是 immutable 的

代码擦除: uglify 阶段删除无用代码

scope hoisting(作用域提升)

分析出模块之间的依赖关系,尽可能的把打散的模块合并到一个函数中去,但前提是不能造成代码冗余


const ModuleConcatenationPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin');

module.exports = {

 resolve: {

   // 针对 Npm 中的第三方模块优先采用 jsnext:main 中指向的 ES6 模块化语法的文件

   mainFields: ['jsnext:main', 'browser', 'main']

 },

 plugins: [

   // 开启 Scope Hoisting

   new ModuleConcatenationPlugin(),

 ],

};

项目中使用按需加载,懒加载(路由,组件级)

const router = new VueRouter({

 routes: [

   { path: '/foo', component: () => import(/* webpackChunkName: "foo" */ './Foo.vue') }

   { path: '/bar', component: () => import(/* webpackChunkName: "bar" */ './Bar.vue') }

 ]

})

开启 gizp 压缩

有时候启用也会消耗服务器性能, 看情况使用吧

暂时先提这么些吧...后续想到了再加


减少请求频率

因为同一域名下 tcp 连接数的限制导致过多的请求会排队阻塞, 所以我们需要尽量控制请求的数量和频率


常见措施

将静态资源的内联到HTML中

这样这些资源无需从服务器获取, 但可能影响到渲染进程...


<!-- 1.小图片内联 base64 (url-loader) -->

<!-- 2.css内联 -->

<!-- 3.js内联 -->

<script>

 ${require('raw-loader!babel-loader!./node_modules/lib-flexible/flexible.js')}

</script>

利用各级缓存(下一篇存储方面介绍)

通常都是在服务端做相关配置, 但你要知道


我们可以利用http缓存(浏览器端)来减少和拦截二次请求, 当然一般都是在服务端设置的;

服务器端也可以设置缓存(redis等), 减少数据查询的时间同样可以缩短整个请求时间

利用本地存储

我们可以将常用不变的信息存在本地(cookie,storage API 等);

判断存在就不去请求相关的接口, 或者定期去请求也是可以的

花钱买 CDN 加速

CDN 又叫内容分发网络,通过把资源部署到世界各地,用户在访问时按照就近原则从离用户最近的服务器获取资源,从而加速资源的获取速度。 CDN 其实是通过优化物理链路层传输过程中的网速有限、丢包等问题来提升网速的...


购买 cdn 服务器;

然后把网页的静态资源上传到 CDN 服务上去,

在请求这些静态资源的时候需要通过 CDN 服务提供的 URL 地址去访问;


# 注意, cdn 缓存导致的新版本发布后不生效的问题

所以打包的时候常在文件后面加上 hash 值

然后在 HTML 文件中的资源引入地址也需要换成 CDN 服务提供的地址

/alicdn/xx12dsa311.js


# 利用不同域名的 cdn 去存放资源, (tcp连接限制)

webpack 构建时添加 cdn

// 静态资源的导入 URL 需要变成指向 CDN 服务的绝对路径的 URL 而不是相对于 HTML 文件的 URL。

// 静态资源的文件名称需要带上有文件内容算出来的 Hash 值,以防止被缓存。

// 不同类型的资源放到不同域名的 CDN 服务上去,以防止资源的并行加载被阻塞。

module.exports = {

 // 省略 entry 配置...

 output: {

   // 给输出的 JavaScript 文件名称加上 Hash 值

   filename: '[name]_[chunkhash:8].js',

   path: path.resolve(__dirname, './dist'),

   // 指定存放 JavaScript 文件的 CDN 目录 URL

   publicPath: '//js.cdn.com/id/',

 },

 module: {

   rules: [

     {

       // 增加对 CSS 文件的支持

       test: /\.css$/,

       // 提取出 Chunk 中的 CSS 代码到单独的文件中

       use: ExtractTextPlugin.extract({

         // 压缩 CSS 代码

         use: ['css-loader?minimize'],

         // 指定存放 CSS 中导入的资源(例如图片)的 CDN 目录 URL

         publicPath: '//img.cdn.com/id/'

       }),

     },

     {

       // 增加对 PNG 文件的支持

       test: /\.png$/,

       // 给输出的 PNG 文件名称加上 Hash 值

       use: ['file-loader?name=[name]_[hash:8].[ext]'],

     },

     // 省略其它 Loader 配置...

   ]

 },

 plugins: [

   // 使用 WebPlugin 自动生成 HTML

   new WebPlugin({

     // HTML 模版文件所在的文件路径

     template: './template.html',

     // 输出的 HTML 的文件名称

     filename: 'index.html',

     // 指定存放 CSS 文件的 CDN 目录 URL

     stylePublicPath: '//css.cdn.com/id/',

   }),

   new ExtractTextPlugin({

     // 给输出的 CSS 文件名称加上 Hash 值

     filename: `[name]_[contenthash:8].css`,

   }),

   // 省略代码压缩插件配置...

 ],

};

/*

以上代码中最核心的部分是通过 publicPath 参数设置存放静态资源的 CDN 目录 URL,

为了让不同类型的资源输出到不同的 CDN,需要分别在:


output.publicPath 中设置 JavaScript 的地址。

css-loader.publicPath 中设置被 CSS 导入的资源的的地址。

WebPlugin.stylePublicPath 中设置 CSS 文件的地址。

设置好 publicPath 后,WebPlugin 在生成 HTML 文件和 css-loader 转换 CSS 代码时,会考虑到配置中的 publicPath,用对应的线上地址替换原来的相对地址。

*/

参考

DNS MDN]

webpack 文档

深入浅出 Webpack

Scope Hoisting



内嵌iframe页面在IOS下会受内部元素影响自动撑开的问题

seo达人

IOS下的webview页面,内嵌iframe元素,将其样式指定为宽高100%:

.iframe { width: 100%; height: 100%;
}

在安卓下运行均无问题,但是在IOS下会出现异常。

具体表现为iframe页面内的子元素一旦超出原先的边界,只要能影响到html元素的宽高,就会自动撑开iframe,即使html元素设置了overflow:hidden也没用。
比如一个body元素下的弹层需要从下往上滑动进场,这个弹层的位置就会导致html高度的变化,因此页面底部的tabbar就会在弹层运动期间先消失再出现。

解决方法就是使用具体的宽高数值锁定iframe元素:

function onLoadIFrame (index) { // 修复IOS下轮播图初始化瞬间会让iframe宽度自行扩大问题 if (this.ENV.isIOS) { const iframe = this.$el.querySelector('#iframe' + index)
    iframe.style.width = iframe.clientWidth + 'px' iframe.style.height = iframe.clientHeight + 'px' }
}

前端学习之JavaScript DOM以及DOM操作的基础知识

前端达人

在了解了javascript的语言基础和特性后

javascript真正大放光彩的地方来了——这就是javascript DOM


Javascript DOM
DOM(Document Object Model),文档对象模型。

是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口;W3C已经定义了一系列DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。

简单的说就是一套操作文档内容的方法。

需要注意的是,我们需要把DOM当作一个整体,不能分割看待,即DOM(文档对象模型)是一套操作文档内容的方法。


  • 文档:一个页面就是一个文档,DOM中使用document表示
  • 元素:页面中的所有标签都是元素,DOM中使用element表示
  • 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示

DOM把以上内容看作都是对象

<!DOCTYPE html>
<html>
<head>
    <title>Shopping list</title>
    <meta charset="utf-8">
</head>
<body>
<h1>What to buy</h1>
<p id="buy" title="a gentle reminder">Don't forget to buy this stuff</p>
<ul id="purchases">
    <li>A tin od beans</li>
    <li>Cheese</li>
    <li>Milk</li>
</ul>
</body>
</html>



用树表示这个网页的结构:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2ktYmV0YS8xODQ2ODAyLzIwMTkxMi8xODQ2ODAyLTIwMTkxMjIzMTcxMDI5MTY1LTExNTE0OTgxMDMucG5n.jpg

1、获取DOM四种基本方法
1、getElementById()

2、getElementsByTagname()

3、getAttribute()

4、setAttribute()

 

常用的两种解析:

1. getElementById():

参数:元素的ID值。 (元素节点简称元素) 
返回值:一个有指定ID的元素对象(元素是对象) 
注:这个方法是与document对象相关联,只能由document对象调用。 
用法:document.getElementById(Id) 

例:

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="time">2020-04-16</div>
    <script>
        // 1. 因为我们文档页面从上往下加载,所以先得有标签 所以我们script写到标签的下面
        // 2. get 获得 element 元素 by 通过 驼峰命名法 
        // 3. 参数 id是大小写敏感的字符串
        // 4. 返回的是一个元素对象
        var timer = document.getElementById('time');
        console.log(timer);
        console.log(typeof timer);
        // 5. console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
        console.dir(timer);
    </script>
</body>

</html>




看一下控制台打印的是什么

20200416221227181.png


可以看到 console.log(timer)打印出来的是整个div标签

timer类型是个对象

 

2. getElementsByTagName():

参数:元素名
返回值:一个对象数组。这个数组里每个元素都是对象,每个对象分别对应着文档里给定标签的一个元素。
注:这个方法可和一般元素关联。这个方法允许我们把通配符当作它的参数,返回在某份html文档里总共有多少个元素节点。
用法:element.getElementsByTagName(TagName) 

例:

var items=document.getElementsByTagName("li");
items.length;//3
document.getElementsByTagName(“*”);//12
 

 

2、事件基础
3.1 事件概述
JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。

简单理解:触发——>响应机制

网页中每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮产生一个事件,然后去执行某些操作

3.2 事件三要素
事件源 、事件类型、事件处理程序,我们也称为事件三要素

(1) 事件源 事件被触发的对象   谁  
(2) 事件类型  如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
(3) 事件处理程序  通过一个函数赋值的方式 完成

代码实例

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button id="btn">唐伯虎</button>
    <script>
        // 点击一个按钮,弹出对话框
        // 1. 事件是有三部分组成  事件源  事件类型  事件处理程序   我们也称为事件三要素
        //(1) 事件源 事件被触发的对象   谁  按钮
        var btn = document.getElementById('btn');
        //(2) 事件类型  如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
        //(3) 事件处理程序  通过一个函数赋值的方式 完成
        btn.onclick = function() {
            alert('点秋香');
        }
    </script>
</body>

</html>


运行结果

20200416223238828.png

3.3 执行事件的步骤

1、获取事件源

2、注册事件(绑定事件)

3、添加事件处理程序(采取函数赋值形式)

 

代码实战


        


<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>123</div>
    <script>
        // 执行事件步骤
        // 点击div 控制台输出 我被选中了
        // 1. 获取事件源
        var div = document.querySelector('div');
        // 2.绑定事件 注册事件
        // div.onclick 
        // 3.添加事件处理程序 
        div.onclick = function() {
            console.log('我被选中了');

        }
    </script>
</body>

</html>



常用的DOM事件
onclick事件---当用户点击时执行
onload事件---当用户进入时执行
onunload事件---用用户离开时执行
onmouseover事件---当用户鼠标指针移入时执行
onmouseout事件---当用户鼠标指针移出时执行
onmousedown事件---当用户鼠标摁下时执行
onmouseup事件---当用户鼠标松开时执行
 
————————————————
版权声明:本文为CSDN博主「那是我呐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42402867/article/details/105567787

【CSS基础学习】CSS的三大特性

前端达人

文章目录


CSS有三大特性,分别是 继承性,层叠性,优先级。CSS的主要特征是继承性,这里先讲解继承性。

继承性

继承性的使用说明

继承性的描述:
继承性是指被包在内部的标签将拥有外部标签的样式性,即子元素可以继承父类的属性。
例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            color: blue;
        }
    </style>
</head>
<body>
    <div>父元素
        <div>子元素
            <p>我依旧是子元素</p>
        </div>
    </div>
</body>
</html>



效果如下:

有图可见,被div包裹住的元素,都具有了div的css样式属性,这被我们称为继承性。

在CSS中以,text-,font-,line-开头的属性都是可以继承的。

CSS继承的局限性
并不是所有的CSS属性都可以被继承的,以下就不具有继承性:

a标签的字体颜色不会被继承,a标签的字体颜色是不会改变的,可以通过页面的的F12可以查看到,a标签是有一个默认的color:-webkit-link;字体颜色属性,所以父元素设置颜色是不能发生改变a标签字体的颜色。
h标签的字体的大小也是不能被继承的,如下代码给父元素在设置一个字体属性20px,再添加一个h标签,在浏览器中可以发现h标签中字体的大小是不会发生改变的,因为h标签中有一个默认的font-size:1.5em;字体大小属性。
div标签的高度如果不设置由内容来绝对(没有内容高度未0),宽度默认由父元素继承过来
边框属性
外边距属性
内边距属性
背景属性
定位属性
布局属性
元素宽高属性
层叠性
层叠性的使用说明
层叠性的表述
所谓层叠性是指多种CSS样式的叠加,例如,当使用内嵌式CSS样式表定义p标记字号大小为12像素,ID选择器定义p标记颜色为红色,那么段落文本将显示为12像素红色,即这两种样式产生了叠加。
例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        p{
            font-size: 32px;
        }
    </style>
</head>
<body>
            <p style="color: blue;">我这里体现了层叠性呀</p>
</body>
</html>



使用结论
由于内容有限,但是结论是一定的,所以我直接给出结论:

若多个选择器定义的样式不冲突,则元素应用所有选择器定义的样式。
若多个选择器定义的样式发生冲突(比如:同时定义了字体颜色属性),则CSS按照选择器的优先级,让元素应用优先级搞得选择器样式。
CSS定义的选择器优先级从高到低为:行内样式–>ID样式–>类样式–>标记样式。
如若想直接定义使用哪个样式,不考虑优先级的话,则使用!important,把这个加在样式后面就行了。
优先级
定义CSS样式时,经常出现两个或更多规则应用在同一个元素上,这时就会出现优先级的问题。层叠性和选择器的圈中有很大的关系。

优先级的使用说明
权重分析:

内联样式:如:style="",权重为1000。
ID选择器,如:#content,权重为100。
类,伪类和属性选择器,如.content,权重为10。
标签选择器和伪元素选择器,如div p,权重为1。
继承样式,权重为0。
将基本选择器的权重相加之和,就是权重大小,值越大,权重越高。
计算权重方法
数标签:先数权重最高的标签,然后数第二高权重的标签,以此类推,就会生成一个数组,里面包含四个数字。
比如(0,0,0,0)分别对应(行内式个数,id选择器个数,类选择器个数,标签选择器个数)
然后两个选择器通过对别四个数字的大小,确定权重关系。
例:
#box ul li a.cur有1个id标签,1个类,3个标签,那么4个0就是(0,1,1,3)
.nav ul .active .cur有0个id,3个类,1个标签,那么4个0就是(0,0,3,1)
例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .p1{
            color: blue;
        }
        #p1{
            color: red;
        }
    </style>
</head>
<body>
            <p id="p1" class="p1">我们来试一下优先级</p>
</body>
</html>


先推测一波,因为前面讲到了ID选择器的权重是大于类选择器的,所以这里颜色应该为red。
效果如下:

推测正确!优先级GET!


vue,vant,使用过程中 Swipe 轮播自定义大小遇到的坑

前端达人

今天讲一下使用vant Swipe 轮播控件过程中遇到的问题

主要是使用swiper自定义的大小的时候,宽度适应不同分辨率的移动设备

适应宽度的同时还需控件的正常使用


先看一下需要实现的功能,

微信截图_20200417142351.png

微信截图_20200417142429.png

一个简单的轮播图,但是每个轮播的宽度需要低于100%,使第二个轮播的van-swipe-item可以展示到第一个位置一部分



这时我们再去vant的文档查看一下控件

微信截图_20200417142821.png


刚好有一个自定义控件大小的可以使用,完美解决了我们的问题


当我们使用控件之后


 <van-swipe :loop="false"  @change="onChange" :width="350">
        <van-swipe-item v-bind:id="item0"><div class="swipe0">
            <div class="contion">

                <p class="title">家中有事,申请请假一天</p>
                <p class="title1"><span class="rice"></span>部门经理核审中</p>
                <p class="time">03.8 &nbsp;&nbsp;&nbsp; 14.25</p>
                <p class="type">放假申请</p>
            </div>
            <img src="../../assets/images/index/xx/fangjia.png">

        </div></van-swipe-item>
        <van-swipe-item ><div class="swipe1"></div></van-swipe-item>
        <van-swipe-item ><div class="swipe2"></div></van-swipe-item>
        <template #indicator>
            <div class="custom-indicator">
                {{ current + 1 }}/3
            </div>
        </template>
    </van-swipe>



发现功能可以使用,但是再 iPhone8/7 plus  以及iPhone5/se 等分辨率下出现了宽度固定而不适应的情况,

微信截图_20200417143329.png

微信截图_20200417143349.png


简单来说,我们把van-swipe-item宽度控制在了80% 第二个van-swipe-item自然可以展示出来一部分

但是当滑到第二页的时候 由于第一页的宽度还是80% 所以就出现了这样的情况,所以我打算采用

监听 change 事件

动态的改变 滑动到第几页的时候 把当页的宽度变为80% 其他页保持不变,


于是

 <van-swipe :loop="false"  @change="onChange" >
        <van-swipe-item v-bind:id="item0"><div class="swipe0">
            <div class="contion">

                <p class="title">家中有事,申请请假一天</p>
                <p class="title1"><span class="rice"></span>部门经理核审中</p>
                <p class="time">03.8 &nbsp;&nbsp;&nbsp; 14.25</p>
                <p class="type">放假申请</p>
            </div>
            <img src="../../assets/images/index/xx/fangjia.png">

        </div></van-swipe-item>
        <van-swipe-item v-bind:id="item1"><div class="swipe1"></div></van-swipe-item>
        <van-swipe-item v-bind:id="item2"><div class="swipe2"></div></van-swipe-item>
        <template #indicator>
            <div class="custom-indicator">
                {{ current + 1 }}/3
            </div>
        </template>
    </van-swipe>





首先 我们为每个swipe-item添加id



 data(){
            return {
                android: true,
                ios: true,
                iphoneX: true,
                current: 0,
                item0:'item0',
                item1:'item1',
                item2:'item2',
            }
        },
        mounted(){

        },
        methods: {
            onChange(index){
                console.log('当前 Swipe 索引:' + index);
                if(index==1){
                    var div =document.getElementById("item0").style.setProperty('width', '10rem', 'important');
                    var div1 =document.getElementById("item1").style.setProperty('width', '9.3333333rem', 'important');
                    var div2 =document.getElementById("item2").style.setProperty('width', '9.3333333rem', 'important');
                } else  if(index==2){
                    var div1 =document.getElementById("item1").style.setProperty('width', '10rem', 'important');
                    var div0 =document.getElementById("item0").style.setProperty('width', '10rem', 'important');
                    var div2 =document.getElementById("item2").style.setProperty('width', '9.3333333rem', 'important');
                } else  if(index==0){
                    var div =document.getElementById("item2");
                    var div0 =document.getElementById("item0").style.setProperty('width', '9.3333333rem', 'important');
                    var div1 =document.getElementById("item1").style.setProperty('width', '9.3333333rem', 'important');
                }
            },



此外,监听滑动事件,根据滑动到第几页 更改当前页面的宽度,


这样就解决了




Swipe自定义宽度下,同时适应不同分辨率的情况


兰兰设计:前端达人





日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档