• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    gulp進階-自定義gulp插件_html/css_WEB-ITnose

    來源:懂視網 責編:小采 時間:2020-11-27 16:36:50
    文檔

    gulp進階-自定義gulp插件_html/css_WEB-ITnose

    gulp進階-自定義gulp插件_html/css_WEB-ITnose:gulp已經成為很多項目的標配了,gulp的插件生態也十分繁榮,截至2015.1.5,npm上已經有10190款gulp插件供我們使用。我們完全可以傻瓜式地搭起一套構建。 然而,我們經常會遇到一種情況,我們好不容易按照文檔傳入對應的參數調用了插件,卻發現結果不如預期,
    推薦度:
    導讀gulp進階-自定義gulp插件_html/css_WEB-ITnose:gulp已經成為很多項目的標配了,gulp的插件生態也十分繁榮,截至2015.1.5,npm上已經有10190款gulp插件供我們使用。我們完全可以傻瓜式地搭起一套構建。 然而,我們經常會遇到一種情況,我們好不容易按照文檔傳入對應的參數調用了插件,卻發現結果不如預期,

    gulp已經成為很多項目的標配了,gulp的插件生態也十分繁榮,截至2015.1.5,npm上已經有10190款gulp插件供我們使用。我們完全可以傻瓜式地搭起一套構建。

    然而,我們經常會遇到一種情況,我們好不容易按照文檔傳入對應的參數調用了插件,卻發現結果不如預期,這時候我們就要一點點去排錯,這就要求我們對gulp插件的工作原理有一定的了解。本文以實現一個gulp插件為例,講解一下gulp插件是如何工作的。

    需求描述

    通常,我們的構建資源為js/css/html以及其它的一些資源文件,在開發或發布階段,js/css會經過合并,壓縮,重命名等處理步驟。

    有些場景下,我們不能確定經過構建后生成js/css的名稱或者數量,如此就不能在HTML文件中寫死資源的引用地址,那么該如何實現一個Gulp的插件用以將最終生成的資源文件/地址注入到HTML中呢?

    假設我們需要實現的插件是這樣使用方式:

      

    我們通過一個HTML注釋用以聲明需要依賴的資源,InlineResource 是匹配的關鍵詞,":"做為分割,/*.css$/,/*.js$/ 是聲明要依賴的文件的正則匹配。

    在gulpfile.js我們需要這邊配置:

    gulp.task('dist', function () { return gulp.src('index.html') .pipe(InjectResources( gulp.src(['*.js', '*.css']) .pipe(hash(/*添加MD5作為文件名*/)) )) .pipe(gulp.dest('dist'))})

    這里簡單介紹下其中的一些方法與步驟:

  • gulp.src('index.html')會讀取文件系統中當前目錄下的index.html,并生成一個可讀的Stream,用于后續的步驟消費

  • InjectResources(stream)是我們將要實現的插件,它接受一個參數用以獲取要注入到HTML中的JS/CSS,此參數應該是一個 Stream實例,用生成一個Stream實例,用于接收并處理上一步流進來的數據

  • hash(options)是一個第三方插件,用于往當前流中的文件名添加md5串,如: gulp-hash

  • gulp.dest('dist')用于將注入資源后的HTML文件生成到當前目錄下

  • 我們要關心的是第2點:如何接所有的資源文件并完成注入?

    我們可以將該邏輯分成4個步驟

    1. 獲取所有的js/css資源
    2. 獲取所有的HTML文件
    3. 定位HTML中的依賴聲明
    4. 匹配所依賴的資源
    5. 生成并注入依賴的資源標簽

    在開編之前,我們需要依賴一個重要的第三方庫: map-stream

    map-stream 用于獲取當前流中的每一個文件數據,并且修改數據內容。

    步驟1 (JS/CSS資源)

    module.exports = function (resourcesStream) { // step 1: TODO => 這里要獲取所有的js/css資源}

    資源流會作為參數的形式傳給InjectResources方法,在此通過一個異步的實例方法獲取所有的文件對象,放到一個資源列表:

    var resources = []function getResources(done) { if (resources) return done(resources) // 由于下面的操作是異步的,此處要有鎖... resourcesStream.pipe(mapStream(function (data, cb) { resources.push(data) cb(null, data) })) .on('end', function () { done(resources) })}

  • mapStream的處理方法中獲取到的data是由gulp.src生成的 vinyl對象,代表了一個文件
  • 每一個stream都會在接受后拋出end事件
  • Note: mapStream的處理方法中的cb方法,第二個參數可以用于替換當前處理的文件對象

    到此,我們就完成了第一步的封裝啦!

    module.exports = function (resourcesStream) { // step 1: function getResources () { ... }}

    步驟2 (HTML文件)

    module.exports = function (resourcesStream) { // step 1: ?? // step 2: TODO => 獲取當前流中的所有目標HTML文件 return mapStream(function (data, cb) { })}

    InjectResources插件方法會返回一個 Writable Stream實例,用于接收并處理流到InjectResources的HTML文件,mapStream的返回值就是一個writable stream。

    此時,mapStream的處理方法拿到的data就是一個HTML文件對象,接下來進行內容處理。

    步驟3 (定位依賴)

    module.exports = function (resourcesStream) { // step 1: ?? // step 2: ? return mapStream(function (data, cb) { var html = data.contents.toString() // step 3: TODO => 獲取HTML中的資源依賴聲明 })}

    我們拿到的data是一個 vinyl對象,contents屬性是文件的內容,類型可能是Buffer也可能是String, 通過toStraing()后可以獲取到字符串內容。

    所有的依賴聲明都有InlineResource關鍵詞,簡單點的做法,可以通過正則來定位并替換HTML中的資源依賴:

    html.replace(//g, function (expr, fileRegexpStr){ // fileRegexp是用以匹配依賴資源的正則字符串})

    到此,我們完成了資源依賴的定位,下一步將是獲取所依賴的資源用以替換。

    步驟4 (依賴匹配)

    我們將通過步驟1定義的 getResources 方法獲取所需的資源文件:

    module.exports = function (resourcesStream) { // step 1: ?? // step 2: ? return mapStream(function (data, cb) { // step 3: ? getResources(function (list) { html.replace(depRegexp, function (expr, fileRegexpStr) { var fileRegexp = new RegExp(fileRegexpStr) // step 4: TODO => 獲取匹配的依賴 }) }) })}

    由于 getResources 是異步方法,因此需要把替換處理邏輯包裹在 getResources 的回調方法中

    根據依賴聲明中的正則表達式,對資源列表一一匹配:

    function matchingDependences(list, regexp) { var deps = [] list.forEach(function (file) { var fpath = file.path if (fileRegexp.test(fpath)) { deps.push(fpath) } }) return deps}

    到此只差最后一步,將資源轉換為HTML標簽并注入到HTML中

    步驟5 (資源轉換/依賴注入)

    module.exports = function (resourcesStream) { // step 1: ?? // step 2: ? return mapStream(function (data, cb) { // step 3: ? // step 4: ? // ... html.replace(depRegexp, function (expr, fileRegexpStr) { var deps = matchingDependences(list, fileRegexpStr) // step 5: 文件對象轉換為HTML標簽 }) })}

    接下來的定義一個transform方法,用于將路徑列表轉換為HTML的資源標簽列表,其中引入了 path模塊用于解析獲取文件路徑的一些信息,該模塊是node內置模塊。

    var path = require('path') function transform(deps) { return deps.map(function (dep) { var ext = path.extname(dep) switch (ext) { case 'js': '

    最終,我們將標簽列表拼接為一個字符串來HTML中的依賴聲明(注入):

    html = html.replace(depRegexp, function (expr, fileRegexpStr) { var deps = matchingDependences(list, fileRegexpStr) // step 5: 文件對象轉換為HTML標簽 return transform(deps)})// html文件對象data.contents = new Buffer(html)// 把修改后的文件對象放回HTML流中cb(null, data)

    到此也就完整地實現了一個擁有基本注入功能的插件~~~~~~

    One More Thing

    通過上面實現的示例步驟,可以清楚了解到gulp插件的工作原理。 但要做一個易用/可定制性高的插件,我們還要繼續完善一下,例如:

  • 比較資源的路徑與HTML的路徑,輸出相對路徑作為默認的標簽資源路徑
  • 提供 sort 選項方法用于修改資源的注入順序
  • 提供 transform 選項方法用于定制標簽中的資源路徑
  • 在依賴聲明中支持 inline 聲明,用以將資源內容內聯到HTML中,例如:

     

  • 支持命名空間,用于往同一個資源流中使用多次資源注入的區分,例如:

     gulp.src('index.html') .pipe( InjectResources(gulp.src('asserts/*.js'), { name: 'asserts'}) ) .pipe( InjectResources(gulp.src('components/*.js'), { name: 'components'}) ) ...

  • . . .

  • 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    gulp進階-自定義gulp插件_html/css_WEB-ITnose

    gulp進階-自定義gulp插件_html/css_WEB-ITnose:gulp已經成為很多項目的標配了,gulp的插件生態也十分繁榮,截至2015.1.5,npm上已經有10190款gulp插件供我們使用。我們完全可以傻瓜式地搭起一套構建。 然而,我們經常會遇到一種情況,我們好不容易按照文檔傳入對應的參數調用了插件,卻發現結果不如預期,
    推薦度:
    標簽: html css gu
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 999久久久免费国产精品播放| 亚洲国产精品综合久久网络| 精品国产成人在线| 国99精品无码一区二区三区| 亚洲精品一级无码鲁丝片| 国产精品免费久久久久影院| 国产精品无圣光一区二区| 无码人妻精品一区二区三区99不卡| 亚洲精品欧美综合| heyzo高无码国产精品| 亚洲精品线路一在线观看| 精品国产免费一区二区三区| 99九九精品免费视频观看| 国产精品视频一区二区三区| 国产精品白丝AV网站| 无码国内精品久久人妻蜜桃| 亚洲精品国产电影| 免费精品国产自产拍在线观看| 国产精品人人做人人爽人人添| 91精品无码久久久久久五月天| 国产午夜精品视频| 成人国产精品高清在线观看| 国语自产少妇精品视频蜜桃| 亚洲精品无码久久久久去q| 婷婷成人国产精品| 久久久久人妻一区精品果冻| 精品无人区无码乱码毛片国产| 国产精品亚洲美女久久久| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 一本之道av不卡精品| 午夜亚洲av永久无码精品| 日本一区二区三区精品国产| 人人妻人人澡人人爽精品欧美| 欧美日韩精品在线观看| 婷婷成人国产精品| 亚洲AV无码久久精品狠狠爱浪潮| 久久国产精品成人片免费| 国产精品水嫩水嫩| 久久99热精品| 99久久精品免费国产大片|