npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nproxy-plus

v1.6.3

Published

A cli proxy tool specialized in file replacing, extend from nproxy

Downloads

14

Readme

NProxy-Plus

基于Nproxy开发的本地代理转发服务器

安装

npm install -g nproxy-plus

使用

本地编写一个匹配规则文件,命名为例如rule.config.js:

var proxy = require('nproxy-plus');

module.exports = [
  //替换单个本地文件
  {
    pattern : 'http://nproxy6.com/a.js',
    responder : 'local',
    options : {
      file: '/repos/nproxy/test/support/files/replaced/c1.js'
    }
  },

  //映射到本地路径
  {
    pattern : 'http://nproxy6.com/xx/',
    responder : 'local',
    options : {
      file: '/repos/nproxy/test/support/files/replaced/'
    }
  },

  //替换单个网络文件
  {
    pattern : 'http://nproxy6.com/b.js',
    responder : 'web',
    options : {
      file: 'http://g.tbcdn.cn/kissy/k/1.4.0/seed-min.js'
    }
  },

  //本地concat
  {
    pattern : 'http://nproxy6.com/c.js',
    responder : 'concat',
    options : {
      dir : '/repos/nproxy/test/support/files/replaced/',
      files: [
        'c1.js',
        'c2.js',
        'c3.js',
        'c1.js'
      ]
    }
  },

  //网络combo
  {
    pattern : 'http://nproxy6.com/??c1.js,c2.js,js/he.js',
    responder : 'combo',
    options : {
      base: '/repos/nproxy/test/support/files/replaced/'
    }
  },


  //kissy模块实时编译
  {
    pattern : 'http://nproxy6.com/d.js',
    responder : 'kissy-combo',
    options : {
      packages: [{
        'name': 'mt',
        'path': '/repos/tb-buy/mt',
        'charset': 'gbk'
      }],
      input: '/repos/tb-buy/mt/index.js' 
    }
  },

  //使用自定义函数实现更复杂的匹配条件
  {
    pattern : function(url, pattern, req, res){
      if(req.query.local && req.cookies.user == 'john'){
        return true;
      }
      return false;
    },
    responder : function(pattern, options, req, res, next){
      var html = xtemplateCompiler('xxx');
      res.send(html);
    },
    options : {
      tplPath: '/repos/nproxy/test/support/files/tpl/'
    }
  },

  //混合响应模式
  //下例中分别从网络、本地、本地concat以及本地kissy实时合并的结果混合后返回给浏览器
  {
    pattern: 'http://nproxy6.com/??aa.js,bb.js,cc.js,dd.js',
    responder: proxy.mix(
      proxy.route('fetch', 'http://www.remote.com/aa.js'),
      proxy.route('local', '/repos/nproxy/replaced/bb.js'),
      proxy.route('concat', {
        base : '/gitlab/tm/buy/src/',
        files : [
            'app',
            'data',
            'util',
            'init'
        ]
      }),
      proxy.route('kissy', {
        packages: [{
          'name': 'mt',
          'path': '/repos/tb-buy/mt',
          'charset': 'gbk'
        }],
        input: '/repos/tb-buy/mt/index.js' 
      })
    )
  }
];

运行以下命令启动服务器

nproxy -l rule.config.js 

设置浏览器代理为 127.0.0.1:8989

更多启动选项:

用法: nproxy [options]

选项:

  -h, --help         输出使用方法
  -V, --version      输出版本号
  -l, --list [list]  指定匹配规则文件
  -p, --port [port]  指定监听端口号
  -t, --timeout [timeout] 设置请求超时时间
  -w, --watch [path] 本地监听目录,当目录中的文件修改时重现加载匹配规则文件,默认只监听匹配规则文件

规则配置

pattern : {String|Regx|Function} 匹配规则,可以是字符串,正则表达式和自定义函数
  当为函数,匹配规则时,该函数会传递以下参数调用
  function(url, pattern, req, res){}
  url : 当前url
  pattern : 当前函数引用
  req : express的Request对象
  res : express的Response对象
  函数返回true表示规则匹配命中,返回false表示规则匹配失败

responder : {String|Function} 
  当为字符串,表示使用内置插件输入,当前支持的插件有
  local : 本地文件或路径
  web : 网络文件
  concat : 本地文件根据配置打包
  combo : 本地文件根据url combo格式打包
  kissy-combo : 根据配置中的kissy配置输出实时编译后的kissy包内容

  当为函数,在规则匹配命中后会调用此函数进行输出,该函数会传递以下参数调用
  function(pattern, options, req, res, next){}
  pattern : 匹配规则
  options : 配置信息
  req : express的Request对象
  res : express的Response对象
  next : express的next方法

options : {Object} 配置信息,在获取输出时会传递到插件函数中

混合模式的responder

往往有时候会遇到这种情况,对于一个combo请求,一部分内容需要从网络上获取,一部分内容则来自本地

混合式响应就是为了解决这种问题

可以使用nproxy-plus中的mix方法产生一个混合式响应

以下配置分别从网络、本地、本地concat、本地kissy实时合并以及一个自定义函数输出的的结果混合后返回给浏览器

var proxy = require('nproxy-plus');

function sayHi(callback, name){
  var content = 'hello' + name;
  callback(null, content);
}

module.exports = {
  pattern: 'http://nproxy6.com/??aa.js,bb.js,cc.js,dd.js',
  responder: proxy.mix(
    proxy.route('fetch', 'http://www.remote.com/aa.js'),
    proxy.route('local', '/repos/nproxy/replaced/bb.js'),
    proxy.route('concat', {
      base : '/gitlab/tm/buy/src/',
      files : [
          'app',
          'data',
          'util',
          'init'
      ]
    }),
    proxy.route('kissy', {
      packages: [{
        'name': 'mt',
        'path': '/repos/tb-buy/mt',
        'charset': 'gbk'
      }],
      input: '/repos/tb-buy/mt/index.js' 
    }),
    proxy.route(sayHi, 'world')
  )
};

proxy.route接收一个字符串或者自定义函数,作为内容加工函数

内置的四种函数为 fetch local concat kissy

为什么要用Nproxy-Plus

本地代理服务器做的事情大同小异,可以将流程抽象化为:

  • 匹配URL
  • 输出本地(或者远端)内容

Nproxy-Plus实现了一个简单的服务器框架,并提供基本的处理函数

开发者可以在这个框架的基础上,自定义搭建适合业务使用的代理环境

License

NProxy-Plus is available under the terms of the MIT License