浅谈 npm 依赖治理

<p>想想项目创建之后,多久没给 npm 依赖升级了?</p> <p>如何得知当前项目 npm 依赖的“健康度”?</p> <p>给老项目升级 npm 依赖,有哪些注意事项?</p>

2022/6/28
阅读更多

记录 Got(Node.js) 代理 HTTP 请求的坑

<p>在过去,request 模块几乎是 Node.js 端的不二选择,可惜已被放弃维护。如今流行的模块虽然变多,但不意味着它们足够成熟,我还是倾向于专注 Node.js 端的那几个。</p> <p>需求越简单,选择越不重要。不过相较而言,Got 的接口设计看起来更友好,并且它是做到支持 Connection Timeout 和 Read Timeout 的少数。</p> <blockquote> <p>见 <a href="https://github.com/sindresorhus/got/#comparison" target="_blank" rel="noopener">https://github.com/sindresorhus/got/#comparison</a> 的 Advanced timeouts</p> </blockquote> <p>实际用下来,还是遇到了坑,顺便扒了一眼 Got 的代码。</p>

2021/1/27
阅读更多

如何管理桌面窗口

<p>想向同事分享窗口切换的一点心得,不小心写成一篇没什么营养的方法论。虽然主要还是讲窗口切换。</p>

2020/12/23
阅读更多

SSR 页面 CDN 缓存实践

<p>SSR 是一项资源密集型任务,要抵抗更大流量、提供更快的服务,缓存是其中的必修课。</p> <p>而 CDN 缓存——作为静态资源的首要支撑,适合武装到 SSR 页面吗?</p>

2020/7/3
阅读更多

从 is-promise 事件我们可以学到什么

<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>4 月 25 日,NPM 社区又一次因更新事故引燃技术圈的讨论,导火索便来自名为 is-promise 的包。</p> <p>网上盛传一个单行代码的包影响到了谷歌、FaceBook、亚马逊等众多大咖的知名项目,也有人扬言它使几乎整个 JavaScript 生态陷入了混乱。</p> <p>不过“雪崩”之时,我和身边人都没有体会到震感,不禁疑惑,平时很少有场景需要判断某个值是否为 Promise,如此名声不显、功能又不重要的 NPM 包,真的有这么大的影响和破坏力吗?</p> <p>既是好奇心的驱使,也是不认同部分夸张的言辞,我决定向前一探究竟。</p>

2020/5/16
阅读更多

分享一个 npm dist-tag 的冷知识

<p>dist-tag 是广为 npm 包开发者所熟知的属性,如果不是今天碰到一个有趣的问题,我根本没想过拉它出来玩。</p> <p>为了照顾不曾了解 dist-tag 的用户,我先用一句话介绍 —— dist-tag 是 npm 版本号的命名空间,而 latest 则是默认的命名空间。想必大家不会陌生 <code>npm install &lt;name&gt;@latest</code> 这样的用法吧。</p> <p>更重要的是,除非 package.json 中有所指定,所有安装默认在 latest 空间下匹配版本号。而处在 latest 空间时,也不会去名为 beta 的 dist-tag 下查找版本号。</p> <p>那么问题来了!设想一个 npm 包首次发布就使用 beta 作为 dist-tag,它可以被 <code>npm install &lt;name&gt;</code> 安装吗?</p>

2020/4/29
阅读更多

从 Vimium 到 qutebrowser

<p>过去两年,不论我安装、切换到哪家浏览器,<del>除了已逝的 Vimperator</del>,Vimium 都是第一个安装的插件。</p> <p>曾经偶然听闻 qutebrowser 大名,但得知它没有让我难以割舍的 Dark Reader 插件,因此擦肩而过。</p> <p>然而 Vimium 的小缺陷屡屡挑衅我的耐心,直到真正开始使用 qutebrowser,终于让我下定了迁移的决心。</p>

2020/1/1
阅读更多

Verdaccio 性能优化:单机 Cluster

<p>本篇将讨论如何解决 <a href="https://github.com/verdaccio/verdaccio" target="_blank" rel="noopener">Verdaccio</a> 官方本地存储方案不支持 Cluster 的问题。</p>

2019/12/31
阅读更多

让 npm install 不使用缓存的方法

<h1 id="Why"><a href="#Why" class="headerlink" title="Why"></a>Why</h1><p>npm 的安装出错是屡见不鲜,往往是因为安装的环境不够 “clean”。</p> <p>通常情况下,只要删除项目目录的 node_modules 和 package-lock.json,重新执行 install 就能解决。</p> <p>偶尔也会出现上述操作解决不了的问题,譬如 npm 的缓存文件异常,就需要在安装前执行 <code>npm cache clean --force</code> 清空缓存目录。</p> <p>但 npm cache clean 也存在两个未处理的缺陷,使它既不完全可靠又具备风险。</p>

2019/12/6
阅读更多

Verdaccio 性能优化:代理分流

<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这里的 <a href="https://github.com/verdaccio/verdaccio" target="_blank" rel="noopener">Verdaccio</a> 是指用于搭建轻量级 npm 私有仓库的开源解决方案,以下简称 npm 私服。</p> <p>前段时间写了一点分流相关的<a href="http://claude-ray.com/2019/10/22/optimize-verdaccio-package-route/">优化思路</a>,但那是以节省资源开销为主、不冲破原有结构的微调,从结果上看,甚至不是合格的优化。</p> <p>随着用户(请求)数量的上升,服务响应速度和效率其实才是最要紧的问题,节省资源终究不能改善这一点。因此我决定实施上次浮现在脑中的想法,将内外网的 npm 包流量彻底分流。</p>

2019/11/30
阅读更多

Verdaccio 性能优化:上游路径转发

<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>这里的 <a href="https://github.com/verdaccio/verdaccio" target="_blank" rel="noopener">Verdaccio</a> 是指用于搭建轻量级 npm 私有仓库的开源解决方案,以下简称 npm 私服。</p> <p>近期观察发现,有些项目依赖了名为 <code>npm</code> 的 npm 包,每次项目部署时都会向私服 <code>/npm</code> 发起请求记录,并在监控曲线上呈明显的高耗时,这引起了我们的关注。</p> <p>有些项目依赖了 npm 自身的包,每次项目部署时都会产生对私服 <code>/npm</code> 路由的请求记录,并在监控曲线上呈明显的高耗时,这引起了我们的关注。</p>

2019/10/22
阅读更多

CSAPP DataLab 题解

<h1 id="DataLab"><a href="#DataLab" class="headerlink" title="DataLab"></a>DataLab</h1><p>近来开始读 CS:APP3e 第二章,但干看书做课后题太乏味,于是提前把 DataLab 拉出来练练。不一定是优解,趁热记录一下思路吧。</p>

2019/10/2
阅读更多

不靠谱的 Egg.js 框架开发指南

<p>这是一篇面向 Egg.js 上层框架开发者的科普文。</p> <p>Egg 官网基本做到了呈现所有“必知必会”的内容,再写一份 Egg 使用教程已经毫无必要,不如聊聊 Egg 上层框架开发过程中可能有用的技巧。</p>

2019/9/17
阅读更多

如何解决 Debian 系 Elastic apm-server 7.x 启动失败

<p>本来是几个月前在 Ubuntu 部署 Elastic apm-server 遇到的问题,当时处理起来没遇到特别的卡点,就只是把解决过程丢到 Evernote 了。最近发现还有人在重复踩这个坑,因此我把笔记整理之后搬到这里作一个极简的分享。</p>

2019/9/13
阅读更多

Hexo NexT 主题升级 7.4

<p>使用 7.1.2 才过了不到 3 个月,我又将博客主题升级了,不过这次是因为 sidebar 出现了统计隐藏的样式 bug,没想到意外赶上了几个特别明显的优化。这次是真的值得所有 NexT 老用户去尝试了。</p>

2019/9/12
阅读更多

From Journeyman to Master

<p>《 The Pragmatic Programmer: From Journeyman to Master 》这本书已加入愿望单许久,最近终于在通勤路上读完了。对于处于或将处于熟练工阶段的程序员,毫无疑问这是本值得用心阅读的书,因此我也写一下短评和推荐理由。</p>

2019/9/10
阅读更多

Mac 上移除 EasyConnect 常驻后台进程

<p>想必大家已经知道,EasyConnect 会在后台强行添加名为 EasyMonitor 的开机自启守护进程,网上已经有关闭教程了</p> <figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo launchctl unload /Library/LaunchDaemons/com.sangfor.EasyMonitor.plist</span><br></pre></td></tr></table></figure> <p>可实际上 EasyConnect 还启动了另一个“杀不掉”的后台进程 ECAgent,活动频率很低,似乎不会造成内存泄漏,略显不起眼。但这无法作为它肆意常驻的理由。</p>

2019/8/23
阅读更多

Nginx SWRR 算法解读

<p>Smooth Weighted Round-Robin (SWRR) 是 nginx 默认的加权负载均衡算法,它的重要特点是平滑,避免低权重的节点长时间处于空闲状态,因此被称为平滑加权轮询。</p> <blockquote> <p>该算法来自 nginx 的一次 commit:<a href="https://github.com/nginx/nginx/commit/52327e0627f49dbda1e8db695e63a4b0af4448b1" target="_blank" rel="noopener">Upstream: smooth weighted round-robin balancing</a></p> </blockquote> <p>在阅读之前,你应该已经了解过 nginx 的几种负载均衡算法,并阅读了 SWRR 的实现。</p> <p>介绍此算法的文章有很多,但用数学角度给出证明过程的较少,尽管并不复杂。这里把自己的思路分享一下,为了便于理解,只考虑算法核心的 current_weight,忽略受异常波动影响的 effective_weight。</p>

2019/8/10
阅读更多

记一次 Node.js 进程挂起的 BUG 追踪

<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>先把干货放前面,辅助排查的 npm 模块有:<a href="https://github.com/myndzi/wtfnode" target="_blank" rel="noopener">wtfnode</a>,why-is-node-running,active-handles 等,使用方法差不多如下,可以查看各自的文档。</p> <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> wtf = <span class="built_in">require</span>(<span class="string">'wtfnode'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// your codes</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// track down</span></span><br><span class="line">wtf.dump();</span><br></pre></td></tr></table></figure> <p>也可以更深入地排查,因为上述模块的核心都是 Node.js 文档未标注的两个接口:</p> <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">process._getActiveHandles();</span><br><span class="line">process._getActiveRequests();</span><br></pre></td></tr></table></figure> <p>好了,本篇到这里结束了,剩下的内容,劝你还是跳过吧:流水帐警告⚠️️ 翻车警告⚠️️</p>

2019/8/8
阅读更多

警惕 Travis CI 的 npm 缓存

<p>从 2019 年 7 月份开始,Travis CI 默认开启 npm 缓存。这意味着 node_module 和 package-lock.json 会在初次构建时缓存,倘若后续更新 npm 依赖而不刷新该缓存,可能带来构建失败的问题。</p>

2019/8/1
阅读更多