---
# System prepended metadata

title: Hybrid App Partial Update Note

---

# Hybrid App Partial Update Note

## Angular 編譯檔案架構
### 主要架構 (with params `--named-chunks`):
![](https://i.imgur.com/6dyESnJ.png)

- lazy loading 的 module 會被包成獨立的檔案，（如上圖的 `finance-manage-finance-manage-module-ngfactory.23fafcb915feb2af1e97.js`）。
- 檔名後綴的 hash 會因檔案內容異動而變更。
- 當我們僅修改其中一個 lazy-loading 的 module 時，其他未修改的 檔案不會被異動（除了下面提到的幾個檔案外）。
- 當其中一個檔案內容異動時，會連帶影響下面幾個檔案：
  - 因為檔名後綴的 hash 變更，引用該檔案的其他檔案也會異動，如 main.js、runtime.js、index.html。
  - 如果內容變動包含引用的第三方套件，有可能因為 tree-shake 讓原本有引用的套件被刪除或新增，因此 vendor.js 會被異動。
  - 如果內容變動包含 polyfill 的引用，有可能引響 polyfill.js

**main.js、runtime.js、index.html 這三個檔案應該是在每次有檔案異動，都會被連帶影響的檔案。**

### assets
angular 不會為在 assets 資料夾內的檔案加上後綴 hash（包括放在 asssets 內的 js 檔案）。
![](https://i.imgur.com/ULQjamP.png)

---

## Angular 建置的相關設定
為了符合熱更新需要，在開發建置 angular app 時，可以依情況修改下列配置。

### vendorChunk
未開啟 `vendorChunk` 時，所有的第三方套件都包在 `main.js`  
( main.js 約 2.36mB)
![](https://i.imgur.com/z4yEZye.png)

開啟 `vendorChunk` 後，第三方套件包在 `vendor.js`，而這些是相對被修改的機率較低的模組  
(main.js 約 572kB)
![](https://i.imgur.com/GpH2AD8.png)

### namedChunks
未開啟 `namedChunks` 時，lazy-loading 的 bundle 會以 chunk id 命名:
![](https://i.imgur.com/uv1QB2I.png)

開啟 `namedChunks` 後，chunk 會以 modula name 命名：
![](https://i.imgur.com/o3FOP27.png)

### 抽換檔案的安全性方案 （Subresource Integrity 機制）
開啟 `subresourceIntegrity` 參數後，angular 會在 index.html 引用外部資源之前，做檔案完整性的驗證。
> 僅限 `<link>` 及 `<script>` 引用的檔案 
```htmlembedded=
<link 
  rel="stylesheet" 
  href="styles.ebbe56918daaae479df8.css" 
  crossorigin="anonymous" 
  integrity="sha384-syjKH9QMpt/OVIpyzuxEuFPX3APZLUtToBCMDBEQXdliFB0lwjauutUFv6OxAf+P"
  >
<script 
  src="main.29531051127950c0d546.js" 
  crossorigin="anonymous" defer 
  integrity="sha384-hrXLiys5c5THFrUDK22AfyibUQI7y4xwh9cv2lJQLan8XhrDy1K9s/ojMxRX3W/A"
  ></script>
```
瀏覽器在引用相關資源之前，會先用 integrity 的 hash 值驗證檔案內容的完整性，若驗證不過就不會執行：
![](https://i.imgur.com/Gzu4tEB.png)

瀏覽器支援度：
![](https://i.imgur.com/FbhesRv.png)

Subresource Integrity [MDN]: https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity

### cache 相關
避免 index.html 被快取的做法：
```htmlmixed=
<meta http-equiv="Cache-Control" content="no-cache, no-store, max-age=0, must-revalidate">
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
```
**Reference**  
https://poychang.github.io/disable-browser-cache-on-angular-site/

