### 看東西要仔細,關鍵的地方一個字不看清楚就會意淫差之千里
sea.js 的 CMD 推崇 as lazy as possible,并不是懶加載,而是懶執行(懶解析)
> 注意我這里說的是執行(真正運行define中的代碼)模塊, 而非加載(load文件)模塊.
模塊的加載都是并行的, 沒有區別, 區別在于執行模塊的時機, 或者說是解析.
script加載后立即運行是沒錯,只不過是運行define,而不是運行define內的代碼,請注意這點。
之前沒看仔細,誤讀了sea.js的意思,還以為真是懶加載文件的,就和懶加載圖片是一樣的,真是自己一廂情愿的意淫的,呵呵,想多了。
* * * * *
### sea.js
可以看到b.js中的代碼此時才執行。這樣就真正實現了“就近書寫,延遲執行“,不可謂不優雅。
如果你一定要挑出一點不爽的話,那就是b.js的預先下載了。你可能不太想一開始就下載好所有的資源,希望像requirejs那樣,等點擊按鈕的時候再開始下載b.js。本著兼容并包的思想,seajs也實現了這一功能,提供require.async API,在點擊按鈕的時候,只需這樣寫:
JavaScript
var b = require.async('b');
b.hello();
var b = require.async('b');
b.hello();
b.js就不會在一開始的時候就加載了。這個API可以說是簡單漂亮。
引自:[JavaScript 模塊化歷程 · Issue #6 · wqb2017/yctabs](https://github.com/wqb2017/yctabs/issues/6)
### 參考
[SeaJS 所為何](http://cyj.me/why-seajs/zh/)
- [seajs與requirejs區別](http://zccst.iteye.com/blog/2084545)
- [第三課:sea.js模塊加載原理](http://www.cnblogs.com/chaojidan/p/4123980.html)
- [seajs的CMD模式的優勢以及使用 - chaojidan - 博客園](http://www.cnblogs.com/chaojidan/p/4147925.html)
- [JS模塊加載器加載原理是怎么樣的? - 知乎](https://www.zhihu.com/question/21157540)
- [Sea.js作者發布微博: 應該給 Sea.js 和 KISSY 也樹一塊墓碑了。 為啥啊?過時了嗎?](https://www.zhihu.com/question/34756861)
- [LABjs、RequireJS、SeaJS 哪個最好用?為什么? - 知乎](https://www.zhihu.com/question/20342350)
> 大部分的頁面不是Single Page Application,不需要依靠腳本來初始化頁面。服務器返回的頁面是立即可用的。也就是單頁往往服務器返回的都不是立即可用的。請注意,體會這個用詞。
- [讓我們再聊聊瀏覽器資源加載優化](http://www.infoq.com/cn/articles/browser-resource-loading-optimization)
[Hello Sea.js 深入淺出分析Sea.js模塊機制](http://island205.github.io/HelloSea.js/)
### 擴展
>[info] 上文說過SeaJS會在html頁面打開時通過靜態分析,一次性下載所有需要的js文件,如果想要某個js文件在用到時才下載,可以使用require.async。
原來你說的懶并不是真正的懶加載啊?
```text
我之前還一直糾結:
到底是異步加載文件還是怎么的啊,都在繞著彎子,只談想讓別人知道的,而對于別人想知道的,文件加載方式,避而不談,諱莫如深,避重就輕,還說什么沒有明顯的bug
```
如果以服務端的模式去思考前端的模塊化,文件加載,那是行不通的,因為服務端不用考慮網絡IO,并且JS也不想PHP,并沒有PHP那樣可以在腳本執行的過程中直接引入其他文件的特性,所以以服務端的思維來看前端的模塊化,就是不正確的。并且如果真的懶加載文件,那么頁面解析執行的過程中,不斷的請求加載JS文件,頁面就會卡卡卡的,這樣的用戶體驗誰受得了,所以直接拿S端的開發經驗來給B端使用,這本身就是一件非常愚蠢的事情。(所以別老揪著懶加載這個問題不放,讓自己糾結了)
瀏覽器端無法做到和服務端一樣的依賴加載模式,因為瀏覽器端和服務端工作的方式不同
依賴都是以根為起點,在服務端,先加載根,遇到依賴的葉子,直接加載葉子。
而在瀏覽器端,還是以根為起點,如果先加載根,再遇到葉子加載葉子就行不通了,因為瀏覽器端的工作模式不像服務端,js也不是PHP,所以要處理好依賴關系,實現類似的加載,在瀏覽器端就必須首先分析出依賴樹,然后從最末的葉子端依次往根的方向加載才行,也就是和服務端的加載順序完全相反。
既然這樣,那么瀏覽器端也就無法做到跟服務端一樣的懶加載了,所以服務端的思維拿過來是夠不能直接套用的。
其實sea.js也有真正的懶加載,`require.async()` 用到才加載,不過實際應用中不會大規模使用這種方式,而是更偏向于一次性靜態分析加載所有的文件,因為瀏覽器環境的特性決定了越少的http請求越好,不能過度依賴網絡IO,并且SPM依賴打包分析的工具也是將靜態分析的結果一次性打包加載,關于這個問題我們已經在 [技術/思想的斗爭](http://www.hmoore.net/xiak/quanduan/279198)里面討論過了。
本來瀏覽器端的依賴關系對加載順序很重要,[script標簽](http://www.hmoore.net/xiak/quanduan/278616) 的順序,因為JS沒有PHP運行時動態加載包含文件的特性,所以這個加載順序是很嚴格的,沒嚴格按照依賴順序加載就會出錯的。比如依賴JQ的插件必須放在JQ的下面。
現在使用模塊化工具后,js文件按照模塊化的格式書寫,定義在define函數里面,此時依賴關系完全的交給框架來處理了,所以忘了之前的標簽順序關系吧,使用框架就好了。
所以前端要實現模塊化,依賴加載,依賴管理,加載順序,就不是那么容易了,不是僅僅只處理好文件的加載,網絡的IO就好了那么簡單的。
這就是模塊化規范,框架需要做的事了。
update:2017-8-4 18:33:18
- 開始
- 微信小程序
- 獲取用戶信息
- 記錄
- HTML
- HTML5
- 文檔根節點
- 你真的了解script標簽嗎?
- 文檔結構
- 已經落后的技術
- form表單
- html實體
- CSS
- css優先級 & 設計模式
- 如何編寫高效的 CSS 選擇符
- 筆記
- 小計
- flex布局
- 細節體驗
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物語
- js函數定義
- js中的數組對象
- js的json解析
- js中數組的操作
- js事件冒泡
- js中的判斷
- js語句聲明會提前
- cookie操作
- 關于javascript你要知道的
- 關于innerHTML的試驗
- js引擎與GUI引擎是互斥的
- 如何安全的修改對象
- 當渲染引擎遇上強迫癥
- 不要使用連相等
- 修改數組-對象
- 算法-函數
- 事件探析
- 事件循環
- js事件循環中的上下文和作用域的經典問題
- Promise
- 最佳實踐
- 頁面遮罩加載效果
- 網站靜態文件之思考
- 圖片加載問題
- 路由及轉場解決方案
- web app
- 寫一個頁面路由轉場的管理工具
- 談編程
- 技術/思想的斗爭
- 前端技術選型分析
- 我想放點html模板代碼
- 開發自適應網頁
- 后臺前端項目的開發
- 網站PC版和移動版的模板方案
- 前后端分離
- 淘寶前后端分離
- 前后端分離的思考與實踐(一)
- 前后端分離的思考與實踐(二)
- 前后端分離的思考與實踐(三)
- 前后端分離的思考與實踐(四)
- 前后端分離的思考與實踐(五)
- 前后端分離的思考與實踐(六)
- 動畫
- 開發小技巧
- Axios
- 屏幕適配
- 理論基礎
- 思考
- flexible.js原理
- 實驗
- rem的坑,為什么要設置成百分比,為什么又是62.5%
- 為什么以一個標準適配的,其它寬度也能同等適配
- 自適應、響應式、彈性布局、屏幕適配
- 適配:都用百分比?
- 番外篇
- 給你看看0.5px長什么樣?
- 用事實證明viewport scale縮放不會改變rem元素的大小
- 為什么PC端頁面縮放不會影響rem元素
- 究竟以哪個為設備獨立像素
- PC到移動端初試
- 深入理解px
- 響應式之柵格系統
- 深入理解px(二)
- 一篇搞定移動端適配
- flex版柵格布局
- 其他
- 瀏覽器加載初探
- 警惕你的開發工具
- JS模塊化
- webpack
- 打包原理
- 異步加載
- gulp
- 命名規范
- 接口開發
- sea.js學習
- require.js學習
- react學習
- react筆記
- vue學習
- vue3
- 工具、技巧
- 臨時筆記
- 怎么維護好開源項目
- 待辦
- 對前端MVV*C框架的思考
- jquery問題
- 臨時
- 好文
- 節流防抖