NProxy——Mac和Linux平台下的Fiddler

NProxy是一款支持Mac、Linux及Windows系统的跨平台代理工具,专注于前端开发中的文件替换功能,能够帮助开发者轻松调试线上UI问题。相较于Fiddler等同类工具,NProxy在文件替换方面更为出色。

Fiddler 相信大家,尤其是前端工程师们都知道。 用它的文件替换功能,将线上的静态资源文件(JS、CSS、图片)替换为本地相应的文件,来调试线上(代码都被压缩过)UI的问题。的确是一神器。(相比,它的HTTP请求的inspector功能因为各大主流浏览器都内置有这功能,反而现在用的不多)。

但是,Fiddler最大的问题就是只支持Windows,这对于Mac党和Linux党来说,有些遗憾。

以往,总是得开个虚拟机来用Fiddler。后来也有了跨平台的类似Fiddler的工具,如:CharlesRythem以及Tinyproxy

尽管这些各有优势,但是,都没有办法满足我的需求:

  • 支持Mac、Linux以及Windows
  • 支持HTTP和HTTPS(很重要)
  • 支持单文件替换
  • 支持combo文件替换(即多个文件合并为一个文件的替换)
  • 支持目录替换

下面这张图显示了,根据我的需求,罗列出的各工具的支持情况:

这就是为什么会有NProxy,它满足所有上述我的需求。这里并不表示Nproxy就比其他这4个工具优秀,只是NProxy在文件替换上更胜一筹。 它不提供HTTP Inspector功能,只专注在文件替换功能上。

目前,NProxy发布了1.3.0, 据我所知,除了我自己所在的公司——SuccessFactors(An SAP Company)在使用之外,部分天猫的前端也在使用。如果你也在用,麻烦请告诉

因此,各位平时用Mac和Linux的朋友(当然windows也完全可以),可以使用NProxy!具体的安装和使用非常简单,可以参考官网介绍


(paddle) vision@gpunode5:~$ conda config --show | findstr "proxy" findstr: command not found --- Logging error --- Traceback (most recent call last): File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/gateways/logging.py", line 139, in emit self.flush() File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 1065, in flush self.stream.flush() BrokenPipeError: [Errno 32] Broken pipe Call stack: File "/home/vision/jnf/anaconda3/bin/conda", line 13, in <module> sys.exit(main()) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/cli/main.py", line 129, in main return conda_exception_handler(main, *args, **kwargs) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/exceptions.py", line 1413, in conda_exception_handler return_value = exception_handler(func, *args, **kwargs) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/exceptions.py", line 1125, in __call__ return func(*args, **kwargs) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/cli/main.py", line 86, in main_subshell exit_code = do_call(args, p) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/cli/conda_argparse.py", line 93, in do_call return getattr(module, func_name)(args, parser) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/cli/main_config.py", line 29, in execute execute_config(args, parser) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/cli/main_config.py", line 175, in execute_config stdout_write('\n'.join(format_dict(d))) File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 1442, in info self._log(INFO, msg, args, **kwargs) File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 1585, in _log self.handle(record) File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 1595, in handle self.callHandlers(record) File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 1657, in callHandlers hdlr.handle(record) File "/home/vision/jnf/anaconda3/lib/python3.8/logging/__init__.py", line 950, in handle self.emit(record) File "/home/vision/jnf/anaconda3/lib/python3.8/site-packages/conda/gateways/logging.py", line 144, in emit self.handleError(record) Message: 'add_anaconda_token: True\nadd_pip_as_python_dependency: True\naggressive_update_packages:\n - ca-certificates\n - certifi\n - openssl\nallow_conda_downgrades: False\nallow_cycles: True\nallow_non_channel_urls: False\nallow_softlinks: False\nallowlist_channels: []\nalways_copy: False\nalways_softlink: False\nalways_yes: None\nanaconda_upload: None\nauto_activate_base: False\nauto_stack: 0\nauto_update_conda: True\nbld_path: \nchangeps1: True\nchannel_alias: https://conda.anaconda.org\nchannel_priority: flexible\nchannels:\n - defaults\nclient_ssl_cert: None\nclient_ssl_cert_key: None\nclobber: False\nconda_build: {}\ncreate_default_packages: []\ncroot: /home/vision/jnf/anaconda3/conda-bld\ncustom_channels:\n anaconda/pkgs/main: https://mirrors.tuna.tsinghua.edu.cn\n anaconda/pkgs/r: https://mirrors.tuna.tsinghua.edu.cn\n anaconda/pkgs/msys2: https://mirrors.tuna.tsinghua.edu.cn\n conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\ncustom_multichannels:\n defaults: \n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2\n local: \ndebug: False\ndefault_channels:\n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\n - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2\ndefault_python: 3.8\ndefault_threads: None\ndeps_modifier: not_set\ndev: False\ndisallowed_packages: []\ndownload_only: False\ndry_run: False\nenable_private_envs: False\nenv_prompt: ({default_env}) \nenvs_dirs:\n - /home/vision/jnf/anaconda3/envs\n - /home/vision/.conda/envs\nerror_upload_url: https://conda.io/conda-post/unexpected-error\nexecute_threads: 1\nexperimental_solver: classic\nextra_safety_checks: False\nforce: False\nforce_32bit: False\nforce_reinstall: False\nforce_remove: False\nignore_pinned: False\njson: False\nlocal_repodata_ttl: 1\nmigrated_channel_aliases: []\nmigrated_custom_channels: {}\nnon_admin_enabled: True\nnotify_outdated_conda: True\nnumber_channel_notices: 5\noffline: False\noverride_channels_enabled: True\npath_conflict: clobber\npinned_packages: []\npip_interop_enabled: False\npkgs_dirs:\n - /home/vision/jnf/anaconda3/pkgs\n - /home/vision/.conda/pkgs\nproxy_servers: {}\nquiet: False\nremote_backoff_factor: 1\nremote_connect_timeout_secs: 9.15\nremote_max_retries: 3\nremote_read_timeout_secs: 60.0\nrepodata_fns:\n - current_repodata.json\n - repodata.json\nrepodata_threads: None\nreport_errors: False\nrestore_free_channel: False\nrollback_enabled: True\nroot_prefix: /home/vision/jnf/anaconda3\nsafety_checks: warn\nsat_solver: pycosat\nseparate_format_cache: False\nshortcuts: True\nshow_channel_urls: True\nsigning_metadata_url_base: None\nsolver_ignore_timestamps: False\nssl_verify: True\nsubdir: linux-64\nsubdirs:\n - linux-64\n - noarch\ntarget_prefix_override: \ntrack_features: []\nunsatisfiable_hints: True\nunsatisfiable_hints_check_depth: 2\nupdate_modifier: update_specs\nuse_index_cache: False\nuse_local: False\nuse_only_tar_bz2: False\nverbosity: 0\nverify_threads: 1' Arguments: () Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> BrokenPipeError: [Errno 32] Broken pipe
06-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值