前端代理nproxy


一、場景/用途

前端代理的用途,相信大家都清楚。應用場景很多,如——

1. 將線上的靜態資源文件(JS、CSS、圖片)替換為本地相應的文件,來調試線上(代碼都被壓縮過)的問題;
2. 本地開發過程,當后端接口未就緒的情況下(也就是前端和后端同學並行開發),將AJAX接口映射於本地文件;
3. 將測試環境或者線上環境的AJAX接口的數據映射於本地,反過來說,也就是開啟本地的服務,本地的服務拉取的數據來自測試環境或者線上環境的數據(因為此時測試環境或者線上環境的服務比較穩定,還有,主要此時,測試同學基本都是基於測試環境來注明bug,所以此時可以直接將測試環境的數據來模擬本地拉取的數據,而不是用於自己模擬一套本地數據)

上述三個場景比較普遍,需要做代理映射的方面基本在后端服務接口及靜態資源(頁面代理當然也是可以,只不過場景不多)。

 

二、工具介紹

直接上官網吧,https://github.com/goddyZhao/nproxy,在git上搜索nproxy,會出現不少五花八門的nproxy,可別用錯。來自作者GoddyZhao,牛叉的不得了。

基於node的代理服務工具,具體原理,我也不知,暫時停留在應用的階段,能好好把它應用到極致,也是一個收獲。

從官網中,作者提到幾款流行的代理工具。下面是這些流行代理工具的對比圖:

當然,上面的列舉中我個人並沒有真正去用過除了fiddler和nproxy之外的代理,當然還有一個web服務器nginx同樣可以當做前端代理工具來使用。

如作者所說,nproxy的優勢主要在這三個方面——

A: 支持Mac、Linux以及windows
D: 支持多個文件合並一個文件的替換
E: 支持目錄替換

大家可以根據它的優勢,可以適當的去做本地及線上文件的映射關系(可以用流行構建工具如Grunt、Gulp、Webpack、Fis等),來最大化呈現代理工具nproxy的優勢。

至於,nproxy的具體使用,在這兒不copy了。主要注意要對瀏覽器使用代理進行端口配置,個人推薦chrome來去做,安裝個chrome的代理工具插件會更加方便(如ProxySwitchySharp)。

下面是代理文件配置的模板文件

module.exports = [

  // 1. replace single file with local one
  {
    pattern: 'homepage.js',      // Match url you wanna replace
    responder:  "/home/goddyzhao/workspace/homepage.js"
  },

  // 2. replace single file with web file
  {
    pattern: 'homepage.js',      // Match url you wanna replace
    responder:  "http://www.anotherwebsite.com/assets/js/homepage2.js"
  },

  // 3. replace combo file with src with absolute file path
  {
    pattern: 'group/homepageTileFramework.*.js', 
    responder: [
      '/home/goddyzhao/workspace/webapp/ui/homepage/js/a.js',
      '/home/goddyzhao/workspace/webapp/ui/homepage/js/b.js',
      '/home/goddyzhao/workspace/webapp/ui/homepage/js/c.js'
    ] 
  },

  // 4. replace combo file with src with relative file path and specified dir
  {
    pattern: 'group/homepageTileFramework.*.js',
    responder: {
      dir: '/home/goddyzhao/workspace/webapp/ui/homepage/js',
      src: [
        'a.js',
        'b.js',
        'c.js'
      ]
    }
  },

  // 5. Map server image directory to local image directory
  {
    pattern: 'ui/homepage/img',  // must be a string
    responder: '/home/goddyzhao/image/' //must be a absolute directory path
  },

  // 6. Write responder with regular expression variables like $1, $2
  {
    pattern: /https?:\/\/[\w\.]*(?::\d+)?\/ui\/(.*)_dev\.(\w+)/,
    responder: 'http://localhost/proxy/$1.$2'
  },

  // 7. Map server image directory to local image directory with regular expression
  // This simple rule can replace multiple directories to corresponding locale ones
  // For Example, 
  //   http://host:port/ui/a/img/... => /home/a/image/...
  //   http://host:port/ui/b/img/... => /home/b/image/...
  //   http://host:port/ui/c/img/... => /home/c/image/...
  //   ...
  {
    pattern: /ui\/(.*)\/img\//,
    responder: '/home/$1/image/'
  }
];

 

三、使用體驗

根據我們常碰到的場景,舉幾個例子——

單文件映射:

{
    pattern: 'http://test-qian.genshuixue.com/asset/js/registerCard_68edda4ec0.js',
    responder: '/Users/bjhl/Desktop/workplace/qianqian-frontend/asset/js/registerCard.js' //must be a absolute directory path
}

要注意,要寫本地文件的絕對路徑。

映射目錄:

{
    pattern: /asset\/js/,
    responder: '/Users/bjhl/Desktop/workplace/qianqian-frontend/output/asset/js/'
}

這個的應用場景,加入我的本地構建一次項目代碼(非壓縮版本),如果測試環境的代碼同樣沒有壓縮,那么我就可以順利使用本地目錄映射了。如果測試環境的代碼是壓縮過(這里我簡單講一下使用md5的方式)的,通過正則來進行映射——

{
    pattern: /^http:\/\/test-qian.genshuixue.com\/asset\/js\/(.*)_\w{10}.js$/,
    responder: '/Users/bjhl/Desktop/workplace/qianqian-frontend/output/asset/js/$1.js'
}

上面僅僅映射js文件,如果我想要同時樣式asset目錄項目的css文件,沒有問題,如下配置——

{
    pattern: /^http:\/\/test-qian.genshuixue.com\/asset\/(.*)_\w{10}\.(js|css)$/,
    responder: '/Users/bjhl/Desktop/workplace/qianqian-frontend/asset/$1.$2'
}

玩兒好正則表達式,怎么美妙的映射方式你都可以構建。

對於多文件的映射方式,對於簡單的js文件拼接方式,還行,否則,就要考慮文件的順序了。這里舉個小例子:

{
    pattern: 'http://test-tianyan.genshuixue.com/src/dep/base.js',
    responder: [
        '../js-common/dep/requirejs/require.min.js',
        '../js-common/dep/angular/angular-1.2.16.js',
        '../js-common/dep/angular-ui-router/release/angular-ui-router.js',
        '../js-common/dep/angular/ui-bootstrap-tpls-0.11.2.js'
    ]
}

對nproxy的使用過程,下面截個圖說明一下:

對於nproxy,啟動一次就可以了。它會監控配置文件的實施變更。也就是上面的[WARN]。上面的[INFO]代表匹配成功的請求路徑。[ERROR]代表網絡異常或者匹配規則配置錯誤,需要重新配置匹配規則。

一般情況下,建議nproxy的配置文件(如nproxy-conf.js)放在項目工程同級目錄下,沒有其他好處,維護方便而已。

 

OK,對於nproxy的使用體驗就寫這么多。

跨平台前端代碼調試神器,大家試試。

 


免責聲明!

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



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