一个来自create-react-app脚手架警告的思考

鲁馗
• 阅读 1335
最近在开发一个react项目,项目是用create-react-app脚手架创建的,当我在我的项目的菜单栏中添加了一个打开一个外链的a标签时,我收到了一个来自create-react-app的警告信息,信息内容如下

<img alt="opener警告" src="http://198.252.107.180/~gongm...; width="100%"/>

意思就是说“在没有rel="noopener noreferrer"属性的a标签中使用target="_blank"存在一定的风险”

这个提示瞬间把我吸引了,以前关于a标签收到的提示都是没有设置alt属性啊什么的,但是也只是提示我说为了显示的友好什么的,这次竟然提示我有风险,面对这种问题,必须一探究竟啊。

查阅了一些资料得到了如下关于a标签一个介绍

当一个外部链接使用了target=_blank的方式,这个外部链接会打开一个新的浏览器tab。此时,新页面会打开,并且和原始页面占用同一个进程。这也意味着,如果这个新页面有任何性能上的问题,比如有一个很高的加载时间,这也将会影响到原始页面的表现。如果你打开的是一个同域的页面,那么你将可以在新页面访问到原始页面的所有内容,包括document对象(window.opener.document)。如果你打开的是一个跨域的页面,你虽然无法访问到document,但是你依然可以访问到location对象。

不看不知道一看吓一跳有木有。主要是两个点是我以前从未在意的

  1. 用target="_blank"方式打开的tab和原始页面占用同一个进程(UI进程)
  2. 新打开的页面能获取到原始页面的document。

第一个问题不用我说都知道是非常需要注意的,新的页面中的所有行为都会间接影响到原始页面的性能。

这里主要研究第二个问题。为此,我做了小小的实验。

一个来自create-react-app脚手架警告的思考

上图解释:

  • 首先打开了第一个页面,第一个页面只有一个“打开一个新页面”的a标签
  • 点击这个链接,打开了一个新页面。新页面中有一个按钮,“告诉打开我的那个页面,我喜欢林志玲”。
  • 点击新页面的按钮然后回到第一个页面,发现第一个页面多出来了一排红色的文字“我喜欢林志玲”。
  • 停在第一个页面5s钟,第一个页面自动跳转到了百度首页。

上面两个页面的代码分别如下:

opener-test.html

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <a target="_blank" href="test-opener-2.html">打开一个新页面</a>
    </body>
</html>

opener-test-2.html

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <h1>我是新打开的页面</h1>
        <button type="button" id="btn">告诉打开我的那个页面,我喜欢林志玲</button>
        <script>
            document.getElementById('btn').addEventListener('click', function() {
                var _opener = window.opener;
                var p = _opener.document.createElement('p');
                p.innerHTML = "我喜欢林志玲";
                p.style.color = "#f33";
                _opener.document.body.appendChild(p);
                setTimeout(function() {
                    _opener.location.href = "//www.baidu.com";
                }, 5000)
            });
        </script>
    </body>
</html>

新的页面不仅往原始页面添加了一段话,而且还让他离开了原来的页面。

注:在上面的例子中,两个页面位于同一个域下面,如果两个页面位于不同的域,那上面的第一个效果就是不行的,因为不同域的情况下,新页面拿不到opener对象的document,但是location对象是可以拿到的,所以第二个效果任然有效。

怎么禁止上面的行为呢?按照create-react-app的提示信息,给连接加上rel属性,如下:

<a rel="noopener noreferrer" target="_blank" href="https://marvengong.github.io/fastmock-docs/book/">

上面的rel属性值多了一个noreferrer它的作用和noopener是一样的,只是适用于低版本的浏览器。

这样处理后,新打开的页面的window对象上就没有opener和referrer对象了。

点赞
收藏
评论区
推荐文章
MLtech MLtech
4年前
Create React App
CreateReactAppCreateReactAppFacebook开源了React前端框架(MITLicence),也同时提供了React脚手架createreactapp(ht
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
烽烟 烽烟
3年前
vue+ts项目对app类型限制
描述做一个tsvueelementplus项目的时候总是有警告消除警告1.将src/plugins/element.js文件后缀名改成ts2.在element里面还要对脚手架现有的代码进行类型限制在element.ts中引入jsimportAppfrom'vue'在element.ts中对参数app和函数返回值进行类型限制jse
Jacquelyn38 Jacquelyn38
4年前
自己实现一个自定义React项目脚手架「ReactCli」
前言首先为什么想到自己实现一个React脚手架呢?是因为之前刚接触createreactapp时,觉得不太灵活。虽然文件目录很清晰,但是还是觉得不如VueCLI的可以自定义配置更加灵活。当然React官方提供了可以暴露配置的命令npmruneject,说再多不如自己实现一个。脚手架一览文档ProjectoperationInstallnpm ins
Karen110 Karen110
4年前
正式发布一款可cmd命令安装的React.js项目脚手架——FastReactApp
前言今天,篇幅可能比较短,主要介绍最近这段时间开发的一款脚手架——FastReactApp。这是一款基于Parcel2开发的React.js项目脚手架。虽然比不上正在前端界火爆的Vite以及占据稳定地位的CreateReactApp,但是基本的项目开发还是可以的。下面我将介绍FastReactApp几点特征:对JS、CSS、HTML、文件资产等的
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
鲁馗
鲁馗
Lv1
正是江南好风景,落花时节又逢君。
文章
3
粉丝
0
获赞
0