fis3-postpackager-loader

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

注意

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

默認會把頁面中用到的樣式插入在 header 中,腳本插入在 body 底部。若是想修改,請在頁面本身插入<!--SCRIPT_PLACEHOLDER--> 和 <!--STYLE_PLACEHOLDER--> 佔位符來控制位置。前端

此插件會收集全部的資源,若是但願某個資源不被收集,請在資源結尾處如 </script> 後面加上 <!--ignore--> 註釋.git

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

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

安裝

支持全局安裝和局部安裝,根據本身的需求來定。shell

npm install fis3-postpackager-loader

使用

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

文件屬性

默認 loader 只會以 html 的方式處理後綴爲 .html 的文件,若是但願其餘後綴也以 html 的方式去處理,請設置 loaderLang 屬性。npm

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

處理流程說明

若是你真的很關心的話,如下詳細的流程處理介紹。後端

先假定全部優化功能全開,處理流程以下:markdown

  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' ] }) })
本站公眾號
   歡迎關注本站公眾號,獲取更多信息