10. 進入瀏覽器

Justin Lin
Justin LinTechnology / Community Evangelist at Free lancer
10. 進入瀏覽器
10.進入瀏覽器
• 學習目標
– script標籤基本特性
– 認識async與defer
– 初探同源策略與CORS
– 認識ES6前的模組管理
– 使用ECMAScript模組
2
初探script標籤
• prompt()與alert()是瀏覽器上全域物
件提供的函式
• 在瀏覽器中,全域物件就是window物件,
代表瀏覽器視窗,為Window的實例
3
• 現代Web應用程式,建議使用UTF-8編碼
4
• HTML4規範了script標籤的type屬性,
必須設定它的值
• type在HTML5中為選用,若沒有指定,預
設為"text/javascript“
– "module"
– "text/jscript"
– "text/vbscript"
– 其他自訂值
5
文件解析與script標籤
• 在瀏覽器載入HTML檔案後,必須先解析所
有HTML標籤
• 建立各標籤對應的DOM(Document
Object Model)物件並組成DOM樹
• 最後依DOM樹結構來呈現畫面
6
• 預設情況下,瀏覽器在遇到script標籤時,
會停止文件解析,先執行完標籤間定義的
JavaScript,再繼續之後的文件解析
7
• 在過去,JavaScript程式碼經常將script
放在head標籤之間
8
• 瀏覽器處理head間的JavaScript時,還沒
有解析body標籤,試圖操作body中標籤對
應的DOM物件就會出錯
9
• 可以將script標籤放在整份HTML文件之
後,</body>之前
10
• window.onload事件,在HTML網頁的
「全部資源」載入後會發生
11
• 「全部資源」載入不單只是DOM樹建立完
成,還包含了HTML頁面鏈結的CSS、圖片
等都載入完成
• HTML5標準化了DOMContentLoaded事
件,會在DOM樹建立之後就觸發
12
開發人員工具
13
14
15
引用.js原始碼
16
17
原始碼編碼
• 保持.js原始碼編碼與HTML檔案的編碼一致
• 如果HTML是UTF-8,那麼.js檔案也應該設
為UTF-8
• 瀏覽器會假設HTML與.js編碼兩者是一致的
18
noscript標籤
• 在無法執行 JavaScript 時出現,提供替代
的頁面內容
19
• 引用外部.js檔案,瀏覽器會暫停頁面解析、
「同步地」下載.js檔案,下載完成後執行
程式碼,執行完成後再繼續頁面解析
• HTML5為script標籤增加async與
defer屬性,這兩個屬性只在透過src引
用.js檔案才有作用
20
async屬性
• 只要出現async屬性就可以了
• 「非同步地」下載.js檔案(使用瀏覽器執行緒)
• 下載完成前,不阻斷後續資源下載與頁面剖析
• 下載完成,瀏覽器就會暫停頁面剖析,
JavaScript引擎執行.js的程式碼後,再繼續處
理頁面剖析
• 執行順序也就無法預測
21
• 如果程式庫檔案容量比較大,然而與初始
頁面處理沒有立即相關性
• 頂層程式碼不多或執行迅速,與其他程式
庫也沒有相依性
• 可以試著在script標籤上設置async屬性,
看看效果是否符合需求
22
defer屬性
• 只要出現defer屬性就可以了
• 瀏覽器會「非同步地」下載.js檔案,不會
阻斷後續資源下載與頁面剖析
• 下載完成後也不會馬上執行程式碼,而是
在DOM樹生成、其他非defer的.js執行完
後,才執行被加上defer屬性的.js
• 如果有多個defer屬性的.js,會按照「頁
面上出現的順序」執行
23
• 如果程式庫檔案容量比較大,必須在剖析
完DOM之後執行
• 與其他程式碼間有順序上的相依性
• 就可以試著在script標籤上設置defer屬
性,看看效果是否符合需求
24
初探安全
• 原始碼中的敏感資訊
• XSS
• 認識安全弱點
25
XSS
• 如果Web應用程式的輸出中,會包含使用
者的輸入字串,永遠都要假設使用者並不
會輸入你期望的格式
• 請求10.1.5中的hello8.html,輸入「Name:
<input>」會如何呢?
26
• HTML5規定,innerHTML被指定的字串若
有script標籤,不會被執行
• 10.1.2的hello3.html,若是在輸入方塊中
鍵入「<script>alert('Hello,
XSS')</script>」會如何呢?
27
認識安全弱點
• OWASP TOP 10
• CWE(Common Weakness
Enumeration)
• CVE(Common Vulnerabilities and
Exposures)
28
29
• CVE-YYYY-NNNN
• 2017年底的CPU「推測執行」
(Speculative execution)安全漏洞
– CVE-2017-5754
– CVE-2017-5753
– CVE-2017-5715
30
同源策略與CORS
• 同源指的是請求的資源與目前文件來源,
具有相同的協定、埠號以及位置
• http://caterpillar.onlyfun.net/
– https://caterpillar.onlyfun.net
– http://openhome.cc
– http://192.168.0.1
– http://caterpillar.onlyfun.net:8080
31
同源策略
• 無法取得src為非同源的iframe相關資訊
• 預設也無法以XMLHttpRequest或Fetch
API等,請求非同源的資源,瀏覽器會禁止
JavaScript取得結果
32
• 子網域的資源,預設視為非同源
• JavaScript在瀏覽器中,可以透過
document.domain設定子網域為同源
– 可以設為頂層網域,然而不能設其他網域
• 不同來源的.js檔案在HTML頁面中執行時,
是以該HTML頁面來源作為同源依據
33
簡介CORS
• Cross-Origin Resource Sharing
• 基於HTTP標頭的跨來源資源共享協議
• 瀏覽器發出非同源的跨域請求時,會附上
HTTP標頭Origin
• 伺服端若同意跨域請求,回應中要包含
Access-Control-Allow-Origin標頭,值
可以是*或某一網域名稱
• 瀏覽器收到回應時,若回應中沒有Access-
Control-Allow-Origin標頭,或者它的值
既非*也不符合目前文件來源,就不會交出收
到的資源
34
• 遵照CORS
– XMLHttpRequest或Fetch API
– ECMAScript模組的匯入
– script標籤若設定crossorigin屬性
35
36
37
38
39
名稱空間管理
• ES6以後才有了模組語法
40
物件名稱空間
41
運用IIFE
• 先前例子還是在全域佔用了validate名稱
42
43
44
45
名稱管理程式
46
47
48
49
50
51
從CommonJS到AMD
• 自2005年JavaScript逐漸被人們廣為應用
之後,當年倉促定義的語言特性也因而曝
露出許多缺點
• 在避免全域名稱這方面,也發展出物件階
層、IIFE等各種模式
• 過去許多程式庫上,像是Dojo、YUI、
jQuery等,都可見不同名稱空間管理模式
之實現
52
• 為了在瀏覽器環境之外構築出JavaScript生
態系,2009年1月,Mozilla的開發者Kevin
Dangoor發起了ServerJS專案
• JavaScript必須得有個模組的標準規範,同
年九月專案更名為CommonJS,顯示其不
想僅侷促於伺服端的意圖
• Node.js曾經遵循著CommonJS來實現模組
管理
53
• 就Node.js來說,一個.js就是一個模組
54
• 有人試圖將CommonJS的模組規範往前端
推進,希望能一統前端模組管理的混亂
• Node.js的主打特性是非同步,require()
函式在載入模組時卻是同步的
• 這意謂著require()某模組時,會阻斷瀏
覽器對後續頁面的處理
55
• 非同步模組定義AMD(Asynchronous
Module Definition)
• 定義模組時使用define()
• 載入模組時雖然也採用require(),然而
為了不影響頁面的後續處理,載入過程是
非同步
• AMD最為人所知的實現,正是RequireJS
56
script標籤與模組
57
• 預設具有defer的特性
• 引用模組時,.js不能來自本機
58
59
• 每個模組定義的名稱,僅在模組內可見
60
• type設為"module"並引用外部模組時,
可以附加async屬性
• 如果引用的模組非同源,就會遵守CORS
61
62
• 支援模組的瀏覽器,會忽略<script
nomodule></script>
63
模組語法入門
64
65
• import的來源可以使用./開頭指定相對路
徑,或者是以/開頭指定絕對路徑
• 也可以是http://、https://開頭
• 對於非同源的模組來源,必須遵循CORS
66
• 被匯入的模組在解析後,會執行其頂層程
式碼
• 同一模組無論import幾次,都只會下載、
解析、執行一次,不會重複匯入
• 可以為import的名稱取個別名
67
• 模組公開的名稱,都會是Module物件上的
唯讀特性
• import時指定的名稱,相當於const宣告
的名稱
68
69
70
71
• 要公開的名稱必須使用{}包含
• import時必須使用{}表示要匯入的是名稱
72
• export的是變數,不是被export時當時
參考的值
73
• 匯入名稱之後,在目前模組直接公開
74
• 如果打算提供模組的預設公開「值」
• export default公開的是值
75
• 模組可以有多個export,但是只能有一個
export default
• export default可以讓模組的客戶端,
在不知道模組中匯出了哪些名稱的情況下,
就能取用模組功能
76
77
78
• 此方式並不建議
79
• export default本質上是使用default
作為公開名稱
80
1 of 80

Recommended

11. DOM、事件與樣式 by
11. DOM、事件與樣式11. DOM、事件與樣式
11. DOM、事件與樣式Justin Lin
408 views125 slides
2. 型態、變數與運算子 by
2. 型態、變數與運算子2. 型態、變數與運算子
2. 型態、變數與運算子Justin Lin
588 views76 slides
從模組到類別 by
從模組到類別從模組到類別
從模組到類別Justin Lin
500 views63 slides
9. meta-programming by
9. meta-programming9. meta-programming
9. meta-programmingJustin Lin
363 views58 slides
資料永續與交換 by
資料永續與交換資料永續與交換
資料永續與交換Justin Lin
519 views72 slides
物件封裝 by
物件封裝物件封裝
物件封裝Justin Lin
1.1K views74 slides

More Related Content

What's hot

5. 建構式、原型與類別 by
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別Justin Lin
205 views61 slides
CH10:輸入輸出 by
CH10:輸入輸出CH10:輸入輸出
CH10:輸入輸出Justin Lin
253 views33 slides
14. 進階主題 by
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
406 views86 slides
進階主題 by
進階主題進階主題
進階主題Justin Lin
715 views77 slides
从浏览器渲染看标准的重要性 by
从浏览器渲染看标准的重要性从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性DoCode org
514 views40 slides
反射與類別載入器 by
反射與類別載入器反射與類別載入器
反射與類別載入器Justin Lin
562 views70 slides

What's hot(20)

5. 建構式、原型與類別 by Justin Lin
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin205 views
CH10:輸入輸出 by Justin Lin
CH10:輸入輸出CH10:輸入輸出
CH10:輸入輸出
Justin Lin253 views
14. 進階主題 by Justin Lin
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin406 views
進階主題 by Justin Lin
進階主題進階主題
進階主題
Justin Lin715 views
从浏览器渲染看标准的重要性 by DoCode org
从浏览器渲染看标准的重要性从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性
DoCode org514 views
反射與類別載入器 by Justin Lin
反射與類別載入器反射與類別載入器
反射與類別載入器
Justin Lin562 views
CH16:整合資料庫 by Justin Lin
CH16:整合資料庫CH16:整合資料庫
CH16:整合資料庫
Justin Lin359 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin161 views
認識物件 by Justin Lin
認識物件認識物件
認識物件
Justin Lin1.1K views
Java SE 8 技術手冊第 11 章 - 執行緒與並行API by Justin Lin
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin3.7K views
資料永續與交換 by Justin Lin
資料永續與交換資料永續與交換
資料永續與交換
Justin Lin1.8K views
CH14:NIO 與 NIO2 by Justin Lin
CH14:NIO 與 NIO2CH14:NIO 與 NIO2
CH14:NIO 與 NIO2
Justin Lin326 views
從模組到類別 by Justin Lin
從模組到類別從模組到類別
從模組到類別
Justin Lin1.7K views
CH04:認識物件 by Justin Lin
CH04:認識物件CH04:認識物件
CH04:認識物件
Justin Lin421 views
CH17:反射與類別載入器 by Justin Lin
CH17:反射與類別載入器CH17:反射與類別載入器
CH17:反射與類別載入器
Justin Lin280 views
CH09:Collection與Map by Justin Lin
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與Map
Justin Lin288 views
4. 使用物件 by Justin Lin
4. 使用物件4. 使用物件
4. 使用物件
Justin Lin174 views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin3.4K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API by Justin Lin
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin3.1K views
深入模組化 by Justin Lin
深入模組化深入模組化
深入模組化
Justin Lin1K views

Similar to 10. 進入瀏覽器

Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL by
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLJustin Lin
2.9K views71 slides
OPM by
OPMOPM
OPMgoto100
378 views22 slides
钱宝坤:多浏览器集成的JavaScript单元测试工具 by
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具taobao.com
1.8K views28 slides
美团前端架构简介 by
美团前端架构简介美团前端架构简介
美团前端架构简介pan weizeng
4.8K views47 slides
Ch01 簡介Web應用程式 by
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Justin Lin
1.7K views55 slides
DEV305 - ASP.NET 5 開發攻略 by
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略Will Huang
6.1K views39 slides

Similar to 10. 進入瀏覽器(20)

Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL by Justin Lin
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Justin Lin2.9K views
OPM by goto100
OPMOPM
OPM
goto100378 views
钱宝坤:多浏览器集成的JavaScript单元测试工具 by taobao.com
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具
taobao.com1.8K views
美团前端架构简介 by pan weizeng
美团前端架构简介美团前端架构简介
美团前端架构简介
pan weizeng4.8K views
Ch01 簡介Web應用程式 by Justin Lin
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式
Justin Lin1.7K views
DEV305 - ASP.NET 5 開發攻略 by Will Huang
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
Will Huang6.1K views
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2 by Duran Hsieh
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練22016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
Duran Hsieh307 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin1.2K views
Elastic stack day-1 by YI-CHING WU
Elastic stack day-1Elastic stack day-1
Elastic stack day-1
YI-CHING WU1K views
EtherCodes中的HTML5 by Garry Yao
EtherCodes中的HTML5EtherCodes中的HTML5
EtherCodes中的HTML5
Garry Yao285 views
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式 by Justin Lin
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Justin Lin19.2K views
Html5 by cazhfe
Html5Html5
Html5
cazhfe867 views
Build desktop app_by_xulrunner by Rack Lin
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunner
Rack Lin1.2K views
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例 by Will Huang
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang19.5K views
浅析浏览器解析和渲染 by Ailsa126
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
Ailsa1262.4K views
构建可维护的Javascript 小米网 by yang alex
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
yang alex1.8K views
Postgre sql intro 0 by March Liu
Postgre sql intro 0Postgre sql intro 0
Postgre sql intro 0
March Liu1.5K views
ASP.NET MVC 6 新功能探索 by Will Huang
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
Will Huang11.5K views
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet by Justin Lin
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Justin Lin6.1K views

More from Justin Lin

Ch14 簡介 Spring Boot by
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
872 views22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
280 views58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
274 views31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
157 views8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
153 views30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
233 views92 slides

More from Justin Lin(20)

Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin133 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin352 views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin238 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin149 views
9. 資料結構 by Justin Lin
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin292 views
8. open() 與 io 模組 by Justin Lin
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin245 views
7. 例外處理 by Justin Lin
7. 例外處理7. 例外處理
7. 例外處理
Justin Lin115 views
6. 類別的繼承 by Justin Lin
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
Justin Lin166 views
4. 流程語法與函式 by Justin Lin
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
Justin Lin188 views

10. 進入瀏覽器