PyJs系列介紹 三 編譯與上線

2022-07-15 13:54:10 字數 1606 閱讀 7435

如前,本地除錯過程的require,都是同步ajax請求的。這種邏輯不可能部署到線上吧,所以針對上線,我們做了特殊的處理。

在根目錄下執行

python pyjs.py

程式會在build目錄下生成所有module編譯後的檔案,如increment會編譯成

define( "increment" , function(require , exports , module);

} );

這與我們本地除錯時從除錯伺服器上獲取到的檔案是一致的,也保證了本地除錯與線上執行時的統一。

但僅僅這樣還是不行的,我們無法得到完整的依賴鏈,還是會重複requirejs和seajs的老路。

於是就有了下面。

boot.js是在編譯時生成的檔案,為pyjs.js和依賴關係的合集。

依賴關係的生成,是在編譯時對檔案進行全面掃瞄,提取出單個檔案的require模組,按照一定的方式合併起來。

依賴關係編譯後**如下:

adddependence('core' , 'main,math');

adddependence('main' , 'increment');

adddependence('increment' , 'math');

adddependence(

'math', 

'');

如此,如果我們引入了core模組,將能知道其依賴於main& math。雖然繼續尋找main和math的依賴關係,直至找出這個core的依賴鏈。

編譯後的require,不能使用require('module').a的方式執行,必須使用

require('module' , function(module))

這樣的**方式執行,原因自然明了:)。**的乙個引數是require的module的公開方法繫結的物件。

獲取到依賴鏈後將請求檔案,這裡有兩種方式。 

combo就是類似yui configurator服務。我們用乙個請求就可以將所有的依賴檔案按序讀回來。檔案中執行require的時候其依賴的模組已經在此之前載入到瀏覽器中了,所以可以直接讀取模組內容。

combo請求的url類似如下

使用combo服務需要在manifest.json中配置combo資訊。 

對於沒有combo服務的使用者,我們使用非同步並行載入的策略。

首先對所有的js檔案進行預載入,參考這篇文章

這樣所有檔案的請求都是非同步且並行的。

隨後按序序列執行每乙個js檔案, 因為本地已經有快取,按序執行並不會有太大的效能影響。

請求的瀑布圖如下:

可以看到,前面的請求已經把檔案快取到本地了,所以後面重新請求的時候都是from cache。

該機制目前還不完善,同時我們也推薦使用combo服務。 

最後附上pyjs和seajs的對比

如上,pyjs只有在本地依賴上有缺憾(對部分開發者來說xd,我個人還好)。但是本地伺服器也能帶來很多好處的,這在我們接下來會繼續介紹。 

ARM系列交叉編譯器介紹

arm linux gcc是針對arm linux的開發環境的,kernel使用的是linux,不是uclinux,arm是有硬體mmu 記憶體保護單元 的。arm elf gcc是針對no mmu arm uclinux的開發環境,kernel使用的是uclinux 可執行程式不是elf,而是fl...

庫檔案編譯與介紹

一句話概述 將函式封裝起來,放在裡面,提供介面,供呼叫。庫檔案可以說是程式設計師必須接觸的東西,我們常聽說庫,什麼編碼庫,xx庫啊等等,這些庫,其實它的前身仍然是 跟我們平常寫的.c等等這些檔案差不多 只不過,它編譯生成的不再是程式 裡面沒有main 而只是類似於標頭檔案之類的,只提供介面,給別人呼...

redis系列 redis介紹與安裝

這個redis系列的文章將會記錄博主學習redis的過程。基本上現在的網際網路公司都會用到redis,所以學習這門技術於你於我都是有幫助的。博主在寫這個系列是用的是目前最新版本4.0.10,虛擬機器裝的是4.0.10,為了方便window也安裝了 版本3.2.100 後續命令會採用命令列,jedis...