fis3-postpackager-loader插件說明


fis3-postpackager-loader

靜態資源前端加載器,用來分析頁面中使用的依賴的資源(js或css), 並將這些資源做一定的優化后插入頁面中。如把零散的文件合並。

注意

此插件做前端硬加載,適用於純前端項目,不適用有后端 loader 的項目。因為不識別模板語言,對於資源的分析和收集,比較的粗暴!!!

默認會把頁面中用到的樣式插入在 header 中,腳本插入在 body 底部。如果想修改,請在頁面自己插入<!--SCRIPT_PLACEHOLDER--> 和 <!--STYLE_PLACEHOLDER--> 占位符來控制位置。

此插件會收集所有的資源,如果希望某個資源不被收集,請在資源結尾處如 </script> 后面加上 <!--ignore--> 注釋.

<script src="lib.js"></script><!--ignore-->

注意:被 ignore 的資源,不會被修改位置,同時也不會參與 allInOne 合並。

安裝

支持全局安裝和局部安裝,根據自己的需求來定。

npm install fis3-postpackager-loader

使用

fis.match('::packager', { postpackager: fis.plugin('loader', { allInOne: true }) });

文件屬性

默認 loader 只會以 html 的方式處理后綴為 .html 的文件,如果希望其他后綴也以 html 的方式去處理,請設置 loaderLang 屬性。

fis.match('*.md', { loaderLang: 'html' });

處理流程說明

如果你真的很關心的話,以下詳細的流程處理介紹。

先假定所有優化功能全開,處理流程如下:

  1. 遍歷所有的 html 文件,每個文件單獨走以下流程。
  2. 分析 html 內容,插入注釋塊 <!--SCRIPT_PLACEHOLDER--> 到 </body> 前面,如果頁面里面沒有這個注釋塊的話。
  3. 分析 html 內容,插入注釋塊 <!--STYLE_PLACEHOLDER--> 到 </head> 前面,如果頁面沒有這個注釋的話。
  4. 分析源碼中 <script> 帶有 data-loader 屬性的或者資源名為[mod.js, require.js, require.js]的資源找出來,如果有的話。把找到的 js 加入隊列,並且在該 <script> 后面加入 <!--RESOURCEMAP_PLACEHOLDER--> 注釋塊,如果頁面里面沒有這個注釋的話。
  5. 分析源碼中 <script> 帶有 data-framework 屬性的資源找出來。把找到的 js 加入隊列。
  6. 分析此 html 文件的依賴,以及遞歸進去查找依賴中的依賴。把分析到的 js 加入到隊列,css 加入到隊列。
  7. 分析此 html 中 <script> 、 <link> 和 <style> 把搜集到的資源加入隊列。
  8. 啟用 allinone 打包,把隊列中,挨一起的資源合並。如果是內聯內容,直接合並即可,如果是外鏈文件,則合並文件內容,生成新內容。
  9. 把優化后的結果,即隊列中資源,插入到 <!--SCRIPT_PLACEHOLDER--> 、 <!--STYLE_PLACEHOLDER--> 和 <!--RESOURCEMAP_PLACEHOLDER--> 注釋塊。

那么 js 的輸出順序就是:帶 data-loader 的js,帶 resource map 信息的js, 帶 data-framework 的js,依賴中的 js, 頁面中其他 js.

也就是說,如果你發現資源的加載順序不符合你的預期時,請加適當的屬性來調整資源級別。

疑問解釋

什么是頁面依賴?

分兩種方式指定依賴:

  1. 通過 fis 中的注釋指定依賴。

    <!--@require "xxx.js"-->
    

    更多用法,請查看聲明依賴

  2. 通過 js 語句指定依賴。

    require('./main');

    表示此代碼所在的文件,依賴當前目錄下面的 main.js 文件。

另外依賴又分兩種性質,以上都是同步依賴,還有一種異步依賴。

require(['./main']);

同步js 是頁面加載時加載,而異步js 依賴則是運行時加載,能滿足按需加載的需求。

什么是 js loader

fis 中對依賴的js 加載,尤其是異步 js,需要一個 js loader。比如 mod.js 是一個 loader, require.js 也是一種 loader。

什么是 resourcemap ?

當有異步依賴的時候,為了讓 loader 知道文件所在位置,所以需要需要 resourcemap 信息。

此插件能生成兩類 resourcemap.

  1. 給 mod.js 用的,格式如下:

    require.resourcemap({
      res: {...}, pkg: {...} })
  2. 給 require.js amd loader 用的,格式如下:

    require.config({
      paths: { ... } })

配置說明

  • scriptPlaceHolder 默認 <!--SCRIPT_PLACEHOLDER-->
  • stylePlaceHolder 默認 <!--STYLE_PLACEHOLDER-->
  • resourcePlaceHolder 默認<!--RESOURCEMAP_PLACEHOLDER-->
  • resourceType 默認 'auto', 可選 'mod''amd'
  • allInOne 默認 false, 配置是否合並零碎資源。

    allInOne 接收對象配置項。

    • css all in one 打包后, css 文件的路徑規則。默認為 pkg/${filepath}_aio.css
    • js all in one 打包后, js 文件的路徑規則。默認為 pkg/${filepath}_aio.js
    • includeAsyncs 默認為 false。all in one 打包,是不包含異步依賴的,不過可以通過把此屬性設置成 true,包含異步依賴。
    • ignore 默認為空。如果不希望部分文件被 all in one 打包,請設置 ignore 清單。
  • processor 默認為 {'.html': 'html'}, 即支持后綴是 .html 的文件,如果要支持其他后綴,請在此擴展。

    fis.match('::package', { postpackager: fis.plugin('loader', { processor: { '.html': 'html', // 支持 markdown 文檔 '.md': 'html' } }) })
  • obtainScript 是否收集 <script> 內容。(非頁面依賴部分)
  • obtainStyle 是否收集 <style> 和 <link> 內容。(非頁面依賴部分)
  • useInlineMap 是否將 sourcemap 作為內嵌腳本輸出。
  • resoucemap 默認為 /pkg/${filepath}_map.js 當 useInLineMap 為 false 的時候有效,用來控制 resourcemap 生成位置。
  • include 默認生成的 sourcemap 只會包含異步依賴的 js, 如果想把一批模塊化的 js 加入到 sourcemap 中,請參考一下配置:

    fis.match('::package', { postpackager: fis.plugin('loader', { include: '/widget/a/**.js' }) }) fis.match('::package', { postpackager: fis.plugin('loader', { include: [ '/widget/**.js', '!/widget/a/**.js' ] }) })


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM