- 浏览器缓存有哪些,通常缓存有哪几种
1、http缓存:基于http协议的缓存 2、cookie:经常存储加密后的身份标识,由后端设置,前端发请求时携带cookie 3、localstorage:浏览器缓存,除非人为/代码删除,否则会一直存在 4、sessionstorage:浏览器缓存,关闭网站/浏览器后会自动删除掉缓存信息 ps:localstorage、sessionstorage都是以键值对字符串形式存储 5、application cache:缓存整个页面,通常用于静态资源(静态页面)的缓存
- 谷歌浏览器的核心是?
谷歌的核心是Webkit IE内核是Trident
- 打开谷歌会有四个进程,为什么?
因为打开1个页面,至少需要1个网络进程,1个浏览器进程,1个GPU进程以及1个渲染进程。
- 前端怎么解决跨域
1、 通过jsonp跨域 2、 document.domain + iframe跨域 3、 location.hash + iframe 4、 window.name + iframe跨域 5、 postMessage跨域 6、 跨域资源共享(CORS) 7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket协议跨域 详细分析可看 https://www.cnblogs.com/roam/p/7520433.html
- cookies sessionStorage和localstorage区别
1 cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。
2 存储大小限制也不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
3 数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。
4 作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
5 Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。
6 Web Storage 的 api 接口使用更方便。 - http 和 https 有何区别?如何灵活使用?
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
详细分析 HTTP和HTTPS的区别
https://blog.csdn.net/weixin_42645168/article/details/102964222
- 常见的HTTP状态码
200 - 服务器成功返回网页
400 - (错误请求)服务器不理解请求的语法。
404 - 请求的网页不存在
500 - (服务器内部错误)服务器遇到错误,无法完成请求。
503 - 服务器超时
- 优雅降级和渐进增强
渐进增强 progressive enhancement:
针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。优雅降级 graceful degradation:
一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。区别:
a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给
b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要
c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带
- 浏览器是如何渲染页面的?
* 浏览器将获取的 HTML 文档解析成 DOM 树;
* 处理 CSS 标记,构成层叠样式表模型(CSSOM);
* 将 DOM 和 CSSOM 合并为渲染树(rendering tree);
* 渲染树的每个元素的内容都是计算过的,称之为 布局layout;
* 将渲染树上的各个节点绘制到屏幕上,称之为 绘制painting;总结就是 DOM Tree和CSS RULE Tree将html和css解析成树形数据结构,然后Dom和css合并后生成Render Tree,用layout来确定节点的位置以及关系,通过painting按照规则来画到屏幕上,由display打击最终看到效果
- 从输入url到显示页面,都经历了什么
DNS 解析:将域名解析成 IP 地址 TCP 连接:TCP 三次握手 发送 HTTP 请求 服务器处理请求并返回 HTTP 报文 浏览器解析渲染页面 断开连接:TCP 四次挥手
- 离线缓存
离线缓存是Html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用。当然,Html5新的特性都不是所有浏览器都能支持的,离线缓存也一样。反正IE9(包括)及IE9以下的浏览器目前是不支持的。如果用在移动端,应该都能支持。检测是否支持离线缓存也是比较简单的。
- 浏览器事件流向
浏览器的事件流是指在浏览器中,从页面中接收事件(onKeyDown, onKeyMove)的顺序
DOM事件流三个阶段
事件冒泡 和 事件捕获 分别由 微软 和 网景 公司提出,后来 W3C 将两者结合,平息了战火,制定了统一的标准 —— 先捕获再冒泡。)由内向外
1、事件捕获阶段
由外向内,即从 DOM 树的父到子,document -> html -> body -> div
2、目标阶段
即从 DOM 树的子到父,div -> body -> html -> document
- Http报文的请求会有几个部分
一个HTTP请求报文由请求行(request line)、请求头(header)、空行和请求数据4个部分组成
- cookie和token都存放在header里面,为什么只劫持前者
token不是为了防止XSS的,而是为了防止CSRF的;
CSRF攻击的原因是浏览器会自动带上cookie,而不会带上token;
以CSRF攻击为例:
cookie:用户点击了链接,cookie未失效,导致发起请求后后端以为是用户正常操作,于是进行扣款操作;
token:用户点击链接,由于浏览器不会自动带上token,所以即使发了请求,后端的token验证不会通过,所以不会进行扣款操作; - 如何设计一个localStorage,保证数据的实效性
1 添加时间戳: 2 localStorage 代码封装 const set = (key, value) => { const curTime = new Date().getTime(); localStorage.setItem(key, JSON.stringify({ data: value, time: curTime })); }; const get = (key, exp) => { const localData = localStorage.getItem(key); if (!localData) return ""; const localDataObj = JSON.parse(localData); const nowTime = new Date().getTime(); const localDataTime = localDataObj.time || nowTime; if (nowTime - localDataObj.time > exp) { console.log("数据已过期"); // 删除 localStorage.removeItem(key); return false; } else { if (!localDataObj.data) return ""; const data = JSON.parse(localDataObj.data); return data; } }; 使用 const value = '{"name":"yd"}'; set("info", value); get("info", 1000); // 过期时间为1秒 get("info", 1000 * 60 * 60); // 过期时间为1分钟
- http缓存控制
通过复用以前获取的资源,可提高性能,减轻服务端的压力
缓存种类有很多,网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上的缓存方式,大致上分两类
私有缓存:浏览器缓存
共享缓存:架设的web代理
- xsrf跨域攻击的安全性问题怎么防范
XSRF全称是 cross-site request forgery(跨站点请求伪造),也称为CSRF,是一种常见的web攻击方式。
攻击形式描述如下:
1.用户登录并访问一个正常的站点 http://www.biz.com;
2.在同一个浏览器实例下,用户打开了恶意网站 http://www.bad.com;(至于用户怎么会打开这个恶意网站,可能是恶意网站通过一些链接或者垃圾邮件等等形式诱骗用户点了某一个链接)
3.恶意网站页面里包含下面一段代码:<form method="POST" name="evilform" target="hiddenframe" action="https://www.biz.com/update_profile"> <input type="hidden" name="password" value="heihei"> </form> <iframe name="hiddenframe" style="display: none"> </iframe> <script> document.evilform.submit(); </script>
用户在不知觉的情况下,被修改了密码。
通用的解决方案 加入一个供校验的action token
- 强缓存和协商缓存的过程
在 http 1.0 版本中,强制缓存通过 Expires 响应头来实现。
在 http 1.1 版本中,强制缓存通过 Cache-Control 响应头来实现。最常用的字段就是
max-age=xxx
,表示缓存的资源将在 xxx 秒后过期。一般来说,为了兼容,两个版本的强制缓存都会被实现。强制缓存只有首次请求才会跟服务器通信,读取缓存资源时不会发出任何请求,资源的 Status 状态码为 200,资源的 Size 为
from memory
或者from disk
,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现。在 http 1.0 版本中,第一次请求资源时服务器通过
Last-Modified
来设置响应头的缓存标识,并且把资源最后修改的时间作为值填入,然后将资源返回给浏览器。在第二次请求时,浏览器会首先带上If-Modified-Since
请求头去访问服务器,服务器会将If-Modified-Since
中携带的时间与资源修改的时间匹配,如果时间不一致,服务器会返回新的资源,并且将Last-Modified
值更新,作为响应头返回给浏览器。如果时间一致,表示资源没有更新,服务器返回304
状态码,浏览器拿到响应状态码后从本地缓存数据库中读取缓存资源。这种方式有一个弊端,就是当服务器中的资源增加了一个字符,后来又把这个字符删掉,本身资源文件并没有发生变化,但修改时间发生了变化。当下次请求过来时,服务器也会把这个本来没有变化的资源重新返回给浏览器。
在 http 1.1 版本中,服务器通过
Etag
来设置响应头缓存标识。Etag
的值由服务端生成。在第一次请求时,服务器会将资源和Etag
一并返回给浏览器,浏览器将两者缓存到本地缓存数据库。在第二次请求时,浏览器会将Etag
信息放到If-None-Match
请求头去访问服务器,服务器收到请求后,会将服务器中的文件标识与浏览器发来的标识进行对比,如果不相同,服务器返回更新的资源和新的Etag
,如果相同,服务器返回 304 状态码,浏览器读取缓存。协商缓存每次请求都会与服务器交互,第一次是拿数据和标识的过程,第二次开始,就是浏览器询问服务器资源是否有更新的过程。每次请求都会传输数据,如果命中缓存,则资源的 Status 状态码为
304
而不是200
。同样的,一般来讲为了兼容,两个版本的协商缓存都会被实现,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现。 - 浏览器渲染触发在EventLoop的哪个阶段,触发机制是怎么样的
JavaScript中,任务被分为Task(又称为MacroTask,宏任务)和MicroTask(微任务)两种 task任务源: ①setTimeout ②setInterval ③I/O ④UI rendering ⑤script ⑥setImmediate(Node.js API) 通常认为是MicroTask任务源有: ①promises ②MutationObserver MutationObserver API ③process.nextTick(Node.js API) ④Object.observe(已废弃) console.log('script start'); setTimeout(()=>{ console.log('setTimeout') },0); Promise.resolve() .then(()=>console.log('promise1')) .then(()=>console.log('promise2')) console.log('script end') //执行结果: script start script end promise1 promise2 setTimeout setTimeout(()=>{ console.log('1') },0); new Promise(function executor(resolve){ console.log('2') for(var i=0;i<10000;i++){ i=999 && resolve() } console.log('3') }).then(function(){ console.log('4') }) console.log('5') //2 //3 //5 //4 //undefined //1
- HTTP的几种请求方法用途
1.1.什么是HTTP 协议?
HTTP : Hyper Text Transfer Protocol 超文本传输协议1.2.HTTP 协议的作用
HTTP 最大的作用就是确定了请求和响应数据的格式,浏览器发送给服务器的数据:请求报文;服务器返回给浏览器的数据:响应报文。1.3 HTTP 协议的组成
HTTP 协议由请求和响应两部分构成,请求是由客户端往服务器传输数据,相应是由服务器往客户端传输数据1、Get方法
发送一个请求来取得服务器上的某一资源
特征:没有请求体
请求参数附着在URL 地址后面。
请求参数在浏览器地址栏能够直接被看到,存在安全隐患。
在URL 地址后面携带请求参数,数据容量非常有限。如果数据量大,那么超出容量的数据会丢失。
从报文角度分析,请求参数是在请求行中携带的,因为访问地址在请求行。
2、Post方法
向URL指定的资源提交数据或附加新的数据
特征:有请求体
请求参数放在请求体中
请求体发送数据的大小没有限制
可以发送各种不同类型的数据
从报文角度分析,请求参数是在请求体中携带
由于请求体参数是放在请求体中,所以浏览器地址栏看不到
3、Put方法
跟Post方法很像,也是向服务器提交数据,但是,Put指向了资源在服务器上的位置,而Post没有4、Head方法
只请求页面的首部5、Delete方法
删除服务器上的某资源6、Options方法
它用于获取当前URL所支持的方法。如果请求成功,会有一个Allow的头包含类似“Get,Post”这样的信息7、Trace方法
Trace方法被用于激发一个远程的,应用层的请求消息回路8、Connect方法
把请求连接转换到透明的TCP/IP通道 - 介绍一下你对浏览器内核的理解?
浏览器内核又可以分成两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。
渲染引擎 它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。
JS 引擎 则是解析 Javascript 语言,执行 javascript语言来实现网页的动态效果。最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。有一个网页标准计划小组制作了一个 ACID 来测试引擎的兼容性和性能。内核的种类很多,如加上没什么人使用的非商业的免费内核,可能会有10多种,但是常见的浏览器内核可以分这四种:Trident、Gecko、Blink、Webkit。
(1)Trident(IE内核)
国内很多的双核浏览器的其中一核便是 Trident,美其名曰 "兼容模式"。
代表: IE、傲游、世界之窗浏览器、Avant、腾讯TT、猎豹安全浏览器、360极速浏览器、百度浏览器等。
Window10 发布后,IE 将其内置浏览器命名为 Edge,Edge 最显著的特点就是新内核 EdgeHTML。
(2)Gecko(firefox)
Gecko(Firefox 内核): Mozilla FireFox(火狐浏览器) 采用该内核,Gecko 的特点是代码完全公开,因此,其可开发程度很高,全世界的程序员都可以为其编写代码,增加功能。 可惜这几年已经没落了, 比如 打开速度慢、升级频繁、猪一样的队友flash、神一样的对手chrome。
(3) webkit(Safari)
Safari 是苹果公司开发的浏览器,所用浏览器内核的名称是大名鼎鼎的 WebKit。
现在很多人错误地把 webkit 叫做 chrome内核(即使 chrome内核已经是 blink 了),苹果感觉像被别人抢了媳妇,都哭晕再厕所里面了。
代表浏览器:傲游浏览器3、 Apple Safari (Win/Mac/iPhone/iPad)、Symbian手机浏览器、Android 默认浏览器,
(4) Chromium/Blink(chrome)
在 Chromium 项目中研发 Blink 渲染引擎(即浏览器核心),内置于 Chrome 浏览器之中。Blink 其实是 WebKit 的分支。
大部分国产浏览器最新版都采用Blink内核。二次开发
(5) Presto(Opera)
Presto(已经废弃) 是挪威产浏览器 opera 的 "前任" 内核,为何说是 "前任",因为最新的 opera 浏览器早已将之抛弃从而投入到了谷歌怀抱了。
了解一点:
移动端的浏览器内核主要说的是系统内置浏览器的内核。Android手机而言,使用率最高的就是Webkit内核,大部分国产浏览器宣称的自己的内核,基本上也是属于webkit二次开发。
iOS以及WP7平台上,由于系统原因,系统大部分自带浏览器内核,一般是Safari或者IE内核Trident的
- HTML5的离线储存怎么使用,工作原理能不能解释一下?
原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示
如何使用
页面头部像下面一样加入一个manifest的属性;
在cache.manifest文件的编写离线存储的资源
在离线状态时,操作window.applicationCache进行需求实现CACHE MANIFEST #v0.11 CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: /offline.html
- 浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢
在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
离线的情况下,浏览器就直接使用离线存储的资源。 - iframe有那些缺点?
iframe的优点:
① iframe能够原封不动地把嵌入的网页展现出来。
② 如果有多个网页调用iframe,只需要修改iframe的内容,就可以实现对调用iframe的每一个页面内容的更改,方便快捷。
③ 网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用性。
④ 如果遇到加载缓慢的第三方内容,如图标和广告等,可以用iframe来解决。
iframe的缺点:
① 会产生很多页面,不容易管理。
② 在几个框架中都出现上下、左右滚动条时,这些滚动条除了会挤占已经非常有限的页面空间外,还会分散访问者的注意力。
③ 使用框架结构时,必须保证正确设置所有的导航链接,否则会给访问者带来很大的麻烦。比如被链接的页面出现在导航框架内,这种情况下会导致链接死循环。
④ 很多的移动设备(PDA手机)无法完全显示框架,设备兼容性差。
⑤ iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
现在基本上都是用Ajax来代替iframe,iframe已渐渐退出了前端开发。
- web开发中会话跟踪的方法有哪些
1.什么是会话
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话 。
2.什么是会话跟踪
对同一个用户对服务器的连续的请求和接受响应的监视 。
3.为什么需要会话跟踪
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求
4.介绍
当服务器响应客户端的第一次请求时,将会创建一个新的session对象(该对象实现了HttpSession接口)和一个唯一的ID分配给该请求,以后 客户将此会话ID与请求一起传给服务器,此会话ID在后续的请求中会将用户与session对象进行匹配,用于识别不同的客户。
5.会话跟踪常用的方法:① URL重写
URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 。
如果用户没有禁用cookie,而且又使用URL重写,则:用户在第一次访问EncodeURLServlet时,由于不知道用户是否禁用了 cookie,所以response.encodeURL()方法内部会将JSESSIONID重写在url上,但是一旦第二次访问时,由于用户是带着 cookie来的,所以response.encodeURL()不会将JSESSIONID重写在url上。
但是如果用户禁用cookie,则关闭了浏览器后,重新开启浏览器,则回话失效,无法实现回话跟踪;如果是用户没有禁用cookie,则可以通过设置装载JSESSIONID的cookie的失效时间来控制浏览器关闭后session仍未失效。public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
request.getSession(); //创建session
//调用response的encodeURL方法,将自动将JSESSION追加到url后面,如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4
String buyurl = response.encodeURL("/CookieAndSession/servlet/buy");
String payurl = response.encodeURL("/CookieAndSession/servlet/pay");
out.print("<a href='"+buyurl+"'>购买</a><br/>");
out.print("<a href='"+payurl+"'>结账</a><br/>");
}
② 隐藏表单域
将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示 。
③ Cookie
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。这样就实现了对客户的跟踪。
Cookie是可以被禁止的。//在服务器端获取Cookie
Cookie[]cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length;i++) {
Cookiecookie = cookies[i];
System.put.println(cookie.getName());
}
//在服务器端设置Cookie
String username = "sa";
Cookie usernameCookie = new Cookie("username", username);
response.addCookie(usernameCookie);
Cookie默认的maxAge值为-1。
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。
response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,并添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。
④ Session
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。此时可以考虑URL重写和表单隐藏域。removeAttribute(“key”) 废弃与指定键关联的值
invalidate删除整个会话(在当前web应用中)
logout将用户从web服务器中注销,并删除所有属于他的会
HttpSession session = request.getSession();设置session的空闲失效时间有两种方式:
1.在web.xml中设置:<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.设置session的maxInactiveInterval属性,(session的 默认空闲失效时间为30分钟,即30分钟内不访问服务器,session将自动销毁)如下:
session.setMaxInactiveInterval(2*60);
也可以通过 session.invalidate();销毁session。 - 模块化开发怎么做?
首先我们要知道什么是模块化开发?
1. 模块就是一个有特定功能的文件,我们可以通过加载这些模块得到特定的功能
2. 模块化开发就是js的功能分离,通过需求引入不同的文件
3. 模块化开发可以使代码耦合度降低,避免代码多次在页面出现,他最大的作用就是重用
模块开发要遵循的规范
1. AMD规范也叫异步模块加载规范,在这个规范下模块会异步加载,不影响后面语句的执行,我们可以使用define定义模块,使用require调用模块
2. CommonJS规范是服务器端模块的规范,node.js就采用了这个规范,每个模块都有一个单独的作用域,模块内部的变量无法被其他模块读取,除非定义为global的对象和属性
3. CMD规范通用模块定义.CMD是按需加载,一个模块就是一个文件
浏览器及HTTP相关面试总结
最新推荐文章于 2024-08-09 10:42:44 发布