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' });
處理流程說明
如果你真的很關心的話,以下詳細的流程處理介紹。
先假定所有優化功能全開,處理流程如下:
- 遍歷所有的 html 文件,每個文件單獨走以下流程。
- 分析 html 內容,插入注釋塊
<!--SCRIPT_PLACEHOLDER-->到</body>前面,如果頁面里面沒有這個注釋塊的話。 - 分析 html 內容,插入注釋塊
<!--STYLE_PLACEHOLDER-->到</head>前面,如果頁面沒有這個注釋的話。 - 分析源碼中
<script>帶有 data-loader 屬性的或者資源名為[mod.js, require.js, require.js]的資源找出來,如果有的話。把找到的 js 加入隊列,並且在該<script>后面加入<!--RESOURCEMAP_PLACEHOLDER-->注釋塊,如果頁面里面沒有這個注釋的話。 - 分析源碼中
<script>帶有 data-framework 屬性的資源找出來。把找到的 js 加入隊列。 - 分析此 html 文件的依賴,以及遞歸進去查找依賴中的依賴。把分析到的 js 加入到隊列,css 加入到隊列。
- 分析此 html 中
<script>、<link>和<style>把搜集到的資源加入隊列。 - 啟用 allinone 打包,把隊列中,挨一起的資源合並。如果是內聯內容,直接合並即可,如果是外鏈文件,則合並文件內容,生成新內容。
- 把優化后的結果,即隊列中資源,插入到
<!--SCRIPT_PLACEHOLDER-->、<!--STYLE_PLACEHOLDER-->和<!--RESOURCEMAP_PLACEHOLDER-->注釋塊。
那么 js 的輸出順序就是:帶 data-loader 的js,帶 resource map 信息的js, 帶 data-framework 的js,依賴中的 js, 頁面中其他 js.
也就是說,如果你發現資源的加載順序不符合你的預期時,請加適當的屬性來調整資源級別。
疑問解釋
什么是頁面依賴?
分兩種方式指定依賴:
-
通過 fis 中的注釋指定依賴。
<!--@require "xxx.js"-->更多用法,請查看聲明依賴
-
通過 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.
-
給 mod.js 用的,格式如下:
require.resourcemap({ res: {...}, pkg: {...} }) -
給 require.js amd loader 用的,格式如下:
require.config({ paths: { ... } })
配置說明
scriptPlaceHolder默認<!--SCRIPT_PLACEHOLDER-->stylePlaceHolder默認<!--STYLE_PLACEHOLDER-->resourcePlaceHolder默認<!--RESOURCEMAP_PLACEHOLDER-->resourceType默認 'auto', 可選'mod'、'amd'。-
allInOne默認 false, 配置是否合並零碎資源。allInOne 接收對象配置項。
cssall in one 打包后, css 文件的路徑規則。默認為pkg/${filepath}_aio.cssjsall in one 打包后, js 文件的路徑規則。默認為pkg/${filepath}_aio.jsincludeAsyncs默認為 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' ] }) })
