1. 程式人生 > >gulp前端自動化構建工具(四):gulp檔案路徑處理模組

gulp前端自動化構建工具(四):gulp檔案路徑處理模組

本篇前言

上一篇介紹了本工具的獨立配置檔案,歡迎閱讀

本篇還是先把gulpfile.js執行所用的一個方法模組展示出來,模組主要接收gulp.src()中檔案物件,對檔案自身所在的物理路徑及其內部資源引用的路徑進行處理,程式碼中我有做詳細的註釋,包括方法的單獨作用演示。

本模組牽扯到了config-tool.js和config-apps.js兩個配置檔案,檢視上一篇文章即可。

模組程式碼如下:

var path = require('path'),
    toolConfig = require('./config-tool.js'), // 工具配置
    appsConfig = require('./config-apps.js'), // 應用配置
    COMPILE = toolConfig.compile, // 獲取工具配置的設定的所有需編譯項
    ROOT = toolConfig.root, // 獲取本工具所在物理路徑
    SRCDIR = appsConfig.conf().srcDir, // 獲取應用配置中的開發版本目錄名
    SRCHTMLDIR = appsConfig.conf().srcHtmlDir, 
    SRC_STATIC_DIR = appsConfig.conf().srcStaticDir, // 獲取應用配置中的開發版本static目錄名
    DIST_STATIC_DIR = appsConfig.conf().distStaticDir, // 獲取應用配置中的開發版本static目錄名
    DIST_STATIC_DOMAIN = appsConfig.conf().distStaticDomain, // 獲取應用配置中的開發版本static使用域名
    HAS_DIST_STATIC_DOMAIN = appsConfig.hasDistStaticDomain(); //獲取應用配置中生產版本否存在static域名

var fileAttr = function(){};
fileAttr.prototype.get = function() {
    var src = arguments[0], // 獲取檔案完成物理路徑
        arg = arguments[1], // 獲取檔案轉換所需型別
        srcArr,
        allName,
        nameArr,
        fileDir;
    src = src.replace(/\\/g, "/"); // 替換目錄符"\"成"/" 結果如:E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx
    src = fileDir = src.replace(ROOT, ""); // 先替換物理路徑目錄 結果如:/src/html/app1/js/jsx/index.jsx
    src = src.replace(SRCDIR + '/', ""); // 替換src目錄 結果如:/html/app1/js/jsx/index.jsx
    srcArr = src.split('/'); // 切割成陣列 結果如:[ 'html', 'app1', 'js', 'jsx', 'index.jsx' ]
    allName = srcArr[srcArr.length - 1].toString(); // 獲取帶字尾檔名 結果如:index.jsx
    nameArr = allName.split('.'); //切割index.jsx 結果如:[ 'index', 'jsx' ]
    var result;
    switch(arg){
        case 'fileSrcArr':
            result = srcArr; // 獲取檔案路徑陣列 如:[ 'html', 'app1', 'js', 'jsx', 'index.jsx' ]
            break;
        case 'fileName':
            result = allName.replace('.'+nameArr[nameArr.length - 1],''); // 獲取檔名 如:index
            break;
        case 'fileSuffix':
            result = nameArr[nameArr.length - 1].toString(); // 獲取檔案字尾 如:jsx/js/css
            break;
        case 'fileNewSrc':
            result = fileDir; // 獲取檔案完成路徑 如: 如:src/html/app1/js/jsx/index.jsx
            break;
        case 'fileDir':
            result = fileDir.replace(allName,''); // 獲取檔案所在路徑 如:src/html/app1/js/jsx/
            break;
        case 'fileModDir': // 獲取檔案路徑中的專案資訊
            var flog = false,
                cdir;
            for (var key in COMPILE) { // 提取編譯目錄為擷取右邊界
                var cPath = COMPILE[key].path,
                    cPathArr = cPath.split('/'); // 獲取編譯目錄名
                if (src.indexOf('/'+ cPathArr[0] +'/') !== -1) {
                    cdir = cPathArr[0];
                    flog = true;
                    break;
                }
            }
            result = flog ? src.substring(0, src.indexOf('/'+ cdir +'/')) : src.replace(allName, ''); 
            // ↑ 如果編譯名存在,則以編譯目錄名作為右邊界,擷取當前檔案物件的目錄結構作丟擲。
            // 如:src為“/html/app1/js/jsx/index.jsx”,遍歷到"jsx"的編譯目錄後,丟擲“/html/apps1/js/”
            // 注:左邊界沒有擷取,還是包含“/html/”本處丟擲到gulpfile有多種用途
            break;
        default:
            console.log("獲取檔案屬性時發生錯誤,請檢查檔案路徑是否正確!");
            return false;
    }
    return result;
};
/**
 * 獲取檔案路徑(去除根目錄)
 * E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx  ===>  src/html/app1/js/jsx/index.jsx
 * E:/gitwww/demo/gulp/src/html/app1/js/index.js  ===>  src/html/app1/js/index.js
 */
fileAttr.prototype.newSrc = function(){
	var src = arguments[0],
		that = this;
	return that.get(src,'fileNewSrc'); 
};
/**
 * 獲取檔名
 * E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx  ===>  index
 * E:/gitwww/demo/gulp/src/html/app1/js/index.min.js  ===>  index.min
 */
fileAttr.prototype.name = function() {
    var src = arguments[0],
        that = this;
    return that.get(src, 'fileName');
};
/**
 * 獲取檔案格式字尾
 * E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx  ===>  jsx
 * E:/gitwww/demo/gulp/src/html/app1/js/index.js  ===>  js
 */
fileAttr.prototype.suffix = function() {
    var src = arguments[0],
        that = this;
    return that.get(src, 'fileSuffix');
};
/**
 * 獲取檔案所在目錄
 * E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx  ===>  src/html/app1/js/jsx/
 * E:/gitwww/demo/gulp/src/html/app1/js/index.js  ===>  src/html/app1/js/
 */
fileAttr.prototype.dir = function() {
    var src = arguments[0],
        that = this;
    return that.get(src, 'fileDir');
};
/**
 * 獲取檔案所在的模組
 * E:/gitwww/demo/gulp/src/html/app1/js/jsx/index.jsx  ===>  html/app1/js/
 * E:/gitwww/demo/gulp/src/html/app1/js/index.js  ===>  html/app1/js/
 */
fileAttr.prototype.modDir = function() {
    var src = arguments[0],
        that = this;
    return that.get(src, 'fileModDir');
};

//針對dist版,修改檔案引用路徑
fileAttr.prototype.changePath = function() {
    var that = this;
        src = arguments[0], // 引用資源的URL
    	pageRoot = arguments[1]; //當前頁面的路徑
    /**
     * 引用域或cdn的資源
     * 
     * config-apps.js設定distStaticDomain域名為"http://localhost:8871"時,如下:
     * 
     * http://localhost/jquery/3.0.0/jquery.js => http://localhost:8871/jquery/3.0.0/jquery.js
     * http://localhost:8080/jquery/3.0.0/jquery.js => http://localhost:8871/jquery/3.0.0/jquery.js
     * //cdn.bootcss.com/jquery/3.0.0/jquery.js => //cdn.bootcss.com/jquery/3.0.0/jquery.js
     * 
     * 未設定域名時:
     * 
     * http://localhost/jquery/3.0.0/jquery.js => http://localhost/jquery/3.0.0/jquery.js
     * http://localhost:8080/jquery/3.0.0/jquery.js => http://localhost:8080/jquery/3.0.0/jquery.js
     * //cdn.bootcss.com/jquery/3.0.0/jquery.js => //cdn.bootcss.com/jquery/3.0.0/jquery.js
     */
    if (src.substring(0, 4) === 'http' || src.substring(0, 2) === '//') {
        if(HAS_DIST_STATIC_DOMAIN && src.indexOf("localhost") !== -1 && src.indexOf(DIST_STATIC_DOMAIN) === -1){
            //使用了localhost域,但與dist域的埠不一致,有可能是src資源域。
            var port = DIST_STATIC_DOMAIN.substring(DIST_STATIC_DOMAIN.indexOf('t:')+2,DIST_STATIC_DOMAIN.length+1);
            //存在埠號
            if(src.indexOf('t:') !== -1){ 
                var a = src.substring(src.indexOf("//")+2,src.length+1);
                var b = [];
                b = a.split('/');
                b[0] = "localhost:"+port;
                a = b.join('/');
                src = "http://"+a;
            }
            //不存在埠號
            else{
                src = src.replace("localhost","localhost:"+port);
            }
        }
        return src; 
    }
    /**
     * 引用本地的位置為公共資源目錄
     * 
     * config-apps.js設定distStaticDomain域名為"http://localhost:8871"時,如下:
     * 
     * /static/path/to/file/demo.js => http://localhost:8871/path/to/file/demo.js
     * ../../../static/path/to/file/demo.js => http://localhost:8871/path/to/file/demo.js
     *
     * 未設定域名時:
     * 
     * /static/path/to/file/demo.js => /static/path/to/file/demo.js
     * ../../../static/path/to/file/demo.js => /static/path/to/file/demo.js
     */
    else if (src.indexOf(SRC_STATIC_DIR) !== -1) {
        DIST_STATIC_DOMAIN = HAS_DIST_STATIC_DOMAIN ? DIST_STATIC_DOMAIN : '/'+ DIST_STATIC_DIR;
        src = src.substring(src.indexOf(SRC_STATIC_DIR) + SRC_STATIC_DIR.length, src.length+1);
        return DIST_STATIC_DOMAIN + src;
    }
    /**
     * 引用的本地位置為模組自身資源目錄
     * 
     * config-apps.js設定distStaticDomain域名為"http://localhost:8871"時,如下:
     * 
     * ./js/demo.js => http://localhost:8871/apps/app1/js/demo.js
     * js/demo.js => http://localhost:8871/apps/app1/js/demo.js
     *
     * 未設定域名時:
     * 
     * ./js/demo.js => /static/apps/app1/js/demo.js
     * js/demo.js => /static/apps/app1/js/demo.js
     */
    else { 
        DIST_STATIC_DOMAIN = HAS_DIST_STATIC_DOMAIN ? DIST_STATIC_DOMAIN : '/'+ DIST_STATIC_DIR;
        src = src.substring(0,2) === './' ? src.substring(2, src.length + 1) : src ;
        var thisMod = that.modDir(pageRoot);
            thisMod = thisMod.replace(SRCHTMLDIR+'/','');
        return DIST_STATIC_DOMAIN + '/apps/' + thisMod + src;
    }
    
}
/*console.log(fileAttr.prototype.newSrc('E:/gitwww/demo/gulp/src/html/app1/js/index.min.js'));
console.log('changePath:http://localhost/jquery/3.0.0/jquery.js => '+ fileAttr.prototype.changePath('http://localhost/jquery/3.0.0/jquery.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath:http://localhost:8080/jquery/3.0.0/jquery.js => '+ fileAttr.prototype.changePath('http://localhost:8080/jquery/3.0.0/jquery.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath://cdn.bootcss.com/jquery/3.0.0/jquery.js => '+ fileAttr.prototype.changePath('//cdn.bootcss.com/jquery/3.0.0/jquery.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath:/static/path/to/file/demo.js => '+ fileAttr.prototype.changePath('/static/path/to/file/demo.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath:../../../static/path/to/file/demo.js => '+ fileAttr.prototype.changePath('../../../static/path/to/file/demo.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath:./js/demo.js => '+ fileAttr.prototype.changePath('./js/demo.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));
console.log('changePath:js/demo.js => '+ fileAttr.prototype.changePath('js/demo.js','E:/gitwww/demo/gulp/src/html/app1/index.html'));*/
module.exports = new fileAttr();



相關推薦

gulp前端自動化構建工具gulp檔案路徑處理模組

本篇前言 上一篇介紹了本工具的獨立配置檔案,歡迎閱讀 本篇還是先把gulpfile.js執行所用的一個方法模組展示出來,模組主要接收gulp.src()中檔案物件,對檔案自身所在的物理路徑及其內部資源引用的路徑進行處理,程式碼中我有做詳細的註釋,包括方法的單獨作用演示。 本

gulp自動化構建工具gulp入門

寫在前面 最近在學習web前端,剛好學習到gulp構建工具,就順便寫一寫筆記,當做一次簡單的練手。由於經驗缺乏,本文可能在某些地方做得不那麼細緻和準確,還望大家指正。 gulp介紹 關於gulp構建工具就不多加贅述了,不熟悉的小夥伴可以自行google或者

gulp構建專案gulp-watch監聽檔案改變、新增、刪除

一、gulp.watch()功能介紹 舉例說明:當’./src/*.html’發生變化時,執行’html’任務,同時重新整理瀏覽器。如下: gulp.task('watch', function(){ gulp.watch('./src/*.

webUI自動化測試框架程式碼分層-操作層及用例層

前面將基礎打好了,接下來就是具體的使用了,業務層主要是頁面中的各種業務操作,如登入,修改使用者資訊等,我們把這些操作都封裝在業務類中,如登入操作,我們把它封裝成一個類,登入的大致流程為開啟登入頁,輸入使用者名稱密碼,點選登入按鈕,這樣一個完整的登入業務就算完成了。 那為什麼

Android記憶體分析工具adb命令

1.adb shell dumpsys meminfo yourpakagename Pss對應的TOTAL值:記憶體所實際佔用的值。 Dalvik Heap Size:從RuntimetotalMemory()獲得,DalvikHeap總共的記憶體大小。 Dalvik

JUnit自動化單元測試@RunWith測試套件執行器的使用

一些常用的測試方法前面已經說了,但有人又說了,JUnit為專案裡每個類都建立一個對應的測試類,雖然一次能把類裡面所有的方法都測試一遍,但是,我一個專案有可能有上千百個類,總不能每個類都點一下進行測試吧。 沒錯,@RunWith註解就是為了這種情況,我們先宣告用

前端零基礎入門第一個HTML頁面

前面說到了html,css,js三者之間的關係 接下來我們就來看看html到底長什麼樣子。 隨便開啟一個編輯器,然後在檔案那裡點選新建html檔案,看到的程式碼大多如下: <!DOCTYPE html> <html lang="en"

thinkphp5.0學習入口檔案、路由模式、路由設定和url生成

一、路由的作用 簡化URL地址,方便記憶 有利於搜尋引擎的優化 二、入口檔案 前後臺分離 在網站public目錄下(專案\public)新建admin.php 開啟admin.ph

Java虛擬機器Class檔案結構及位元組碼指令

    接下來的兩個位元組為this_class項,它是一個對常量池的索引。在this_class位置的常量池入口必須為CONSTANT_Class_info表。該表由兩個部分組成——標籤和name_index。標籤部分是一個具有CONSTANT_Class值的常量,在name_index位置的常量池入口為一

前端自動化構建工具Webpack開發模式入門指南 網上看到的,寫得很詳細

Webpack Webpack是時下最流行的模組打包器 它的主要任務就是將各種格式的JavaScript程式碼,甚至是靜態檔案 進行分析、壓縮、合併、打包,最後生成瀏覽器支援的程式碼 特點: 程式碼拆分方案:webpack可以將應用程式碼拆分成多個塊,每個塊包含一個或

前端自動化構建工具-gulp

出現 ssa uglify 提醒 連接 變化 監聽 前端 復雜 gulp 和grunt這兩個是我知道的自動構建工具,但是說實話都沒在項目中用過,不太清楚自動化構建是什麽意思, 1、grunt和gulp有什麽相同點和不同點?   (1)、易於使用:采用代碼優於配置策略,gul

前端自動化構建工具Gulp簡單入門

margin 構建工具 function col 處理 .com order lis web 昨天聽同事分享了Gulp的一些簡單使用,決定自己也試一試。 一、安裝   gulp是基於nodejs的,所以要先下載安裝node(直接搜node,在官網下載就好了)   1、全局安

前端自動化構建工具——gulp

操作過程: 需要配置檔案後才能執行 $ gulp命令 (1)配置一些基本資訊,執行命令:$ npm init 在git指令中,對下面每一項進行配置,注意:GitHub專案的資訊與配置檔案一一對應,如果先關聯了GitHub專案,那麼下面的基本配置中的GitHub專案資訊將

gulp.js 自動化構建工具學習入門

http pat 圖片壓縮 pan 同時 sset ati 獲取文件 sheet 一、基本安裝 1、安裝gulp 1 $ npm install --global gulp 2、作為項目的開發依賴安裝 1 $ npm install --save-dev gulp

構建NetCore應用框架之實戰篇BitAdminCore框架1.0登錄功能細化及技術選型

1.0 dmi 也會 繼承 blank bit 技術選型 cor 我會 本篇承接上篇內容,如果你不小心點擊進來,建議從第一篇開始完整閱讀,文章內容繼承性連貫性。 構建NetCore應用框架之實戰篇系列 一、BitAdminCore框架1.0版本 1、1.0版本是指

接口自動化平臺搭建自動化項目Jenkins持續集成

工作量 我們 接口自動化 com 功能 http root kill png 一、Jenkins的優點 1、傳統網站部署流程 ??一般網站部署的流程 這邊是完整流程而不是簡化的流程 需求分析—原型設計—開發代碼—內網部署-提交測試—確認上線—備份數據—外網更新-最終測試 ,

前端自動化構建工具

urn 自身 合並文件 limit ase 有效 www. javascrip 路徑配置 全局安裝是把包安裝在Node安裝目錄下的node_modules文件夾中,一般在 \Users\用戶名\AppData\Roaming\ 目錄下,可以使用npm root -g查看全局

Web前端-Html部分筆記

以下是我對Web前端-Html部分的筆記,因為博主也是初學Web前端,有很多東西都還停留在表層的理解,如果我的部落格有任何錯誤,請及時評論或者私信我,我會及時更改。也歡迎同樣初學Web-前端的你願意關注我的部落格,我會把我每週的學習內容進行整理和上傳,方便大家溝通和交流學習經驗。 表格標籤

HTTP介面自動化經驗總結Okhttp3 介面測試用例編寫

經過前面幾次的分享,我們已經有了方法和結果,那麼這篇文章我們就來寫測試用例。 首先我們新建一個TestNG class,名字為APITest,繼承我們的依賴方法DependeicesMethod 1.get介面測試 //測試Get方法,其餘校驗請自行新增 @Test

Python自動化學習筆記——Python資料型別集合set,元組tuple、修改檔案、函式、random常用方法

1.修改檔案的兩種方式 1 #第一種 2 with open('users','a+') as fw: #用a+模式開啟檔案,使用with這種語法可以防止忘記close檔案 3 fw.seek(0) #移動檔案指標到最前面,然後才能讀到內容 4 result=fw.read()