Node.js 给前端带来了什么
这篇讲的是 Node.js 如何重新定义前端工程师的职责边界。作者从传统 Web 开发中“两个 UI 层”的割裂现象切入——前端只能控制浏览器内的表现,而负责生成页面的服务端 UI 层通常由后端主导,这导致数据如何呈现往往受限于后端技术栈,前后端协作存在天然隔阂。 文章的核心观点是:Node.js 的出现让前端工程师可以用熟悉的 JavaScript 操控服务端 UI 层,从而打通前后端。具体来说,在面向服务架构下,后端只需提供稳定的 RESTful 接口处理数据逻辑,而前端通过 Node.js 可以完全自主地进行页面渲染、模板处理和交互逻辑,不再被后端的技术选择所掣肘。 这种分工模式将前后端通过数据接口解耦,双方可以独立高效迭代。作者也提到,这需要打破“JavaScript 只是玩具语言”的偏见,但实际效果显著:前端获得了对完整 UI 链路的控制权,后端则从不擅长的页面拼接工作中解放,最终提升的是整体开发效率和用户体验。
移动端点击、触碰随记
这篇讲的是移动端开发里几个老生常谈却又总踩坑的“事故”:点击延迟、点穿和焦点获取错误。作者从实测数据出发,直观展示了移动端原生click事件为何存在约300ms的固定延迟(为了判断是否双击缩放),以及为何要拥抱更快的tap事件(如zepto的实现)。 文章深入分析了触摸事件与鼠标事件的触发顺序,指出tap和click本质是同一次触碰的不同阶段。针对“点穿”这个经典坑(根源在于事件绑定层级),作者对比了阻止事件流的方法,明确preventDefault是关键大招,并顺势对比了fastclick、Yocto等库的解决方案,分析了它们的原理与适用场景。 最后,文章还深入探讨了在Angular框架下如何处理ng-click点穿问题,以及如何区分处理input、textarea等元素的焦点获取需求,给出了具体的代码思路。全文从现象到原理,再到框架内的实战方案,是一份扎实的移动端触控问题排查指南。
由NodeJieba谈谈Node.js异步实现
这篇文章以NodeJieba这个中文分词库的源码为例,深入浅出地拆解了Node.js异步操作的底层实现原理。作者没有停留在理论层面,而是直接打开`cut`函数的C++实现代码,带领读者一步步看清异步调用的“幕后”。 核心思路非常清晰:当我们在JavaScript中调用异步的`cut`函数时,实际是创建了一个`CutWorker`对象并将其推入`NanAsyncQueueWorker`队列。真正的耗时分词操作`segment.cut()`在后台线程的`Execute`方法中静默执行,完成后则通过`HandleOKCallback`回到主线程触发回调。 文章特别点明了两个巧妙而关键的设计:一是`CutWorker`必须用私有成员变量(如`inputStr`)来保持状态,确保后台线程执行时参数依然有效,即使原栈变量已销毁;二是整个异步非阻塞的魔力,正源于“主线程只负责投递任务,后台线程持续轮询队列并执行”这一经典线程池模型。 通过这个具体的例子,作者揭示了Node.js异步的本质其实并不高深,它无非是“状态保存”与“后台队列执行”两个核心环节的组合,为许多初学者揭开了异步编程的神秘面纱。
一个“三端”开发者眼中的React Native
这篇讲的是一位常年穿梭于前端、服务端和客户端的“三端”开发者,初次接触React Native时的真实感受与深度观察。作者没有停留在技术介绍,而是从自己饱受iOS开发中代码冗长、布局繁琐、调试耗时等痛点困扰的经历出发,生动地分享了RN如何像一位“校花”般用统一的Component模型、动态绑定、类CSS样式和Flexbox布局,解决了这些长期痛点。 文章直率地列举了RN当前阶段的不足,比如组件不全、性能损耗、仅支持iOS以及代码并非全平台通用等现实问题。但核心价值在于作者提出的理性视角:技术讨论不能脱离场景。他从前端与客户端两个角度分析了RN带来的影响——对前端而言,这是拓展技术栈的有趣方向;对客户端开发者,它简化了开发流程,并带来了更高效的NPM生态。 最后,作者展望了一种未来的协作模式:前端负责表层业务开发,客户端团队则专注于构建和封装底层原生组件。文章结尾鼓励开发者不要止于议论,而应动手实践,在学习中积累。这种从个人实践上升到团队协作模式的思考,为如何看待这类跨平台技术提供了切实的参考。
ExtJS怎么刷新Grid表格前面的行序列号
这篇讲的是ExtJS开发中一个常见的小痛点:Grid表格使用了RowNumberer列来显示行序号,但当删除中间某行后,序列号会断档(比如变成1、2、4),无法自动重排为1、2、3。 问题的根源在于数据视图在数据变更后没有及时刷新。文章给出的解决方案非常直接且高效:在删除操作的事件处理函数中,在调用`store.remove()`移除数据后,紧跟着调用`grid.getView().refresh()`。这一行代码会强制Grid的视图进行重绘,从而让RowNumberer列基于当前的Store数据重新计算并显示连续的序列号。 这种处理只刷新视图,不重新加载数据,操作轻量且针对性强,是解决此类UI刷新问题的标准做法。对于使用ExtJS进行表格开发的工程师来说,这个技巧能快速修复因数据增删导致的序号显示不全问题。
js代码因逗号不规范导致IE不兼容的问题
作者分享了一个在前端开发中容易遇到的兼容性陷阱:代码在Chrome、Firefox中运行正常,但在IE中却抛出“Expected identified, string or number”的错误。经过排查,根因是JavaScript对象字面量的最后一个属性后多写了一个逗号(trailing comma),这是老版本IE无法容忍的语法不规范。 文章展示了如何用Eclipse的正则搜索(`,\\s*}`)来定位这类问题,但也指出了该方法对注释中的代码无效的局限。因此,作者更推荐使用Spket这类IDE插件,它能在编码阶段实时检查并标记出代码中的不规范之处,帮助开发者从源头避免问题。此外,文章还提醒,像`console`对象这类在IE中不存在的API也是常见的兼容性问题源,需要一并清理。 总的来说,作者从实际项目报错出发,不仅给出了具体的排错和代码规范化工具,也强调了对运行时环境差异保持警惕的重要性。处理已知的兼容性“坑”很重要,而借助工具养成规范的编码习惯,是更根本的预防之道。
javascript定义对象的几种方法
这篇讲的是JavaScript中定义对象的几种经典方法。作者从最基础的对象扩充开始,逐步深入到工厂方式、构造函数、原型方式,最后介绍了试图融合两者优点的动态原型方式。 文章的核心价值在于对这些方式的细致对比。比如,它指出了“工厂方式”虽然方便,但每次创建对象都会生成新的函数实例,无法共享;而“构造函数方式”配合`new`关键字更规范,但方法不共享的问题依然存在。真正的突破点在于“原型方式”,它通过`prototype`让所有实例共享同一个方法,但作者也用代码清晰地演示了其中的陷阱:基本类型的属性变更不会同步,但引用类型(如数组)的变更却会在所有实例间反映出来。 最终,文章推荐了“动态原型方式”,它像一个精巧的折中方案:在构造函数内部通过一个标志变量,确保方法只添加一次到原型上,这样既保证了每个实例拥有独立的属性,又实现了方法的高效共享。这篇文章清晰地展示了每种方案的代码实现与适用场景,帮你理解为何需要从一种方式演进到另一种。
JavaScript初体验
这篇文章源于作者一次愉快的阅读体验。在读完《JavaScript语言精粹》后,他结合自己的使用经历,分享了几个对JavaScript印象最深的特点。 作者认为,JavaScript的灵活性是其核心魅力。比如“函数即变量”的特性,为异步和回调提供了天然支持;而JSON作为JS的“最伟大副产品”,极大地简化了数据序列化过程,对比传统语言的RPC工具堪称“酸爽”。他同时指出,抛开“原型继承”、“闭包”等看似高深的标签,JS其实是一门简单的语言,其Array、Object、函数参数等设计都透着直接和灵活。 文章也记录了作者的一些个人疑惑:他质疑JSONP在URL里写回调的方式是否足够优雅,思考Promise之外更佳的异步解决方案,并对Node.js在后端生态的统治地位表达了既批判又看好的复杂态度。在书评部分,他认为本书相比冗长的《权威指南》更为“接地气”。 通篇来看,这更像是一位有经验的开发者,在语言特性、生态现状和学习资源之间穿梭,给出的个人化思考笔记。对于想了解JS本质魅力或资深开发者心得的读者,其中的观察角度很有启发。
用JavaScript将数字转换为大写金额
这篇讲的是前端开发中一个常见但容易被忽视的需求:如何在JavaScript里将数字金额规范地转为“壹佰贰拾叁元整”这样的大写汉字格式。 作者直接分享了一个可以拿来即用的`digitUppercase`函数。它的核心思路很清晰:先用两个数组分别定义好“零”到“玖”和“角”、“分”等单位,然后通过循环和取余运算,逐位将数字映射到对应的大写汉字和货币单位上。函数巧妙地用正则表达式对转换后的字符串进行了多次清洗,处理了像“零元零角”这样可能出现的冗余情况,确保输出的格式既准确又符合中文财务书写习惯。 这个实现考虑得比较周全,能正确处理负数、小数(到分)以及像万亿这样的大额数字。对于需要实现发票打印、账单生成等场景的开发者来说,这段代码可以直接解决实际问题。
jQuery Ajax请求下载文件资源
这篇文章解决了一个常见的前端困境:如何用jQuery Ajax处理需要根据情况返回JSON数据或文件下载的请求。作者从一个实际项目场景出发,发现单次Ajax请求难以同时满足这两种响应要求。 文章核心介绍了两种经过验证的“两次请求”解决方案。第一种方案,服务端逻辑保持不变,客户端在收到包含 `Content-Disposition: attachment` 头的响应后,动态构建一个隐藏表单并提交,从而触发浏览器的文件保存对话框。第二种方案则修改了服务端逻辑,首次请求只返回一个下载URL,再通过iframe或一个GET请求去获取实际文件。两种方案都成功实现了需求,但各有侧重:前者对服务端改动最小,但会带来一次多余的带宽开销;后者网络效率更高,但需要服务端提供额外的接口。 作者坦诚地分析了实现细节与权衡,并提供了完整的代码示例。对于正在寻找类似问题解决方案的开发者来说,这篇实践总结提供了清晰、可操作的参考路径。
jQuery对象和DOM对象小结
这篇小结聚焦于jQuery开发中一个基础却易混淆的概念:jQuery对象和DOM对象的区别与转换。作者从实际编码中的常见错误切入,清晰阐述了两者的关系和使用场景。 DOM对象是通过原生JavaScript方法(如getElementById)获取的元素节点,可以直接使用innerHTML等标准DOM API。而jQuery对象则是通过$()函数包装DOM对象后产生的,拥有jQuery特有的方法链和便捷功能,例如用.html()获取内容。关键差异在于,两者的方法集完全不同,混用会导致运行时错误。 文章详细介绍了相互转换的技巧:jQuery对象转DOM对象可通过索引[0]或.get(0)方法;DOM对象转jQuery对象则只需用$()包裹。例如,var cr = document.getElementById('cr')得到的DOM对象,通过$(cr)就能变成jQuery对象。这些转换确保了开发者能灵活调用对应方法,避免代码失效。 通过实例对比,如$('#foo').html()与document.getElementById('foo').innerHTML,这篇总结以简洁方式强化了基础认知,帮助前端开发者写出更健壮的代码。
小tip: 子元素scroll父元素容器不跟随滚动JS实现
这篇讲的是前端开发中一个常见的交互痛点:当页面存在嵌套滚动容器时,子元素滚到底后,滚动事件会“冒泡”导致父容器继续滚动。作者从“萝卜蹲”的生动比喻出发,解析了这一浏览器默认行为的链条。 核心方案聚焦于PC端,利用JavaScript拦截鼠标滚轮事件(`mousewheel`或Firefox的`DOMMouseScroll`)。关键思路是:为子元素绑定滚轮事件监听器,当检测到滚动位置即将到达顶部(`scrollTop`为0)或底部(到达最大值)时,手动将滚动位置精确定位到边界,并立即调用`event.preventDefault()`阻止事件继续向上冒泡,从而“切断”父容器的滚动。 文章特别指出了IE浏览器的兼容性“坑”——它会在阻止前直接跳过边界。解决方案是在到达边界的前一次滚动时就介入处理,提前手动设置边界值。作者最终将方案封装成了一个简洁的jQuery插件`$.fn.scrollUnique()`,调用一行代码即可生效,并提供了可交互的在线演示。对于键盘等其他滚动触发方式,作者认为可按需扩展,但鼠标滚轮处理已覆盖主要场景。
充分发挥 JavaScript 语言的优势
作者从自身8年JavaScript开发经验出发,分享了如何从“将其视为辅助工具”到“真正发挥语言优势”的心得。他认为,随着Node.js和现代浏览器的发展,JavaScript已成为前端核心,但许多开发者仍未充分利用其特性。 文章聚焦于几个关键实践:利用“头等函数”实现简洁的函数式编程,掌握Array原生的map、reduce等方法来操作数据,以及拥抱ES6的箭头函数、解构等新语法让代码更直观。作者也强调了理解作用域、闭包和类型转换这些“绊脚石”的重要性,并建议谨慎使用class继承,转而以数据流和对象组合来思考程序结构。 对于有一定经验但感觉JavaScript“坑多”的开发者,这篇基于实战教训的总结,提供了从语言特性层面提升代码质量和效率的具体思路。
用 JavaScript 实现 mailto:
这篇讲的是如何用 JavaScript 更灵活地控制 mailto 链接。尽管 mailto 作为 URL 不如从前流行,但它在 Web 应用中依然是触发邮件发送最简单直接的方式之一。文章指出,单纯使用 HTML 标签创建 mailto 链接虽常见,但结合 JavaScript 可以实现更多可能。 作者展示了如何通过一个简单的 JavaScript 函数来动态触发 mailto,这样做的好处之一是,能在一定程度上混淆邮箱地址,对抗自动化收集数据的网络爬虫。更重要的是,这为将邮件发送集成到更复杂的业务逻辑中打开了大门,例如在用户执行特定操作(如点击按钮)时才触发。 文章还深入讲解了如何为 mailto 链接添加参数,比如邮件主题和正文,并给出了一个可复用的 JavaScript 函数示例。这个函数会使用 `encodeURIComponent` 对用户输入进行编码,确保生成的 URL 格式正确且安全。作者也提醒,除了常用的 subject 和 body 参数,浏览器对其他邮件头(如 bcc、cc)的支持程度不一,需要谨慎使用。 总的来说,这篇文章把一个看似简单的技术点讲透了,从基础用法到用 JavaScript 增强的实用技巧,为开发者提供了让 mailto 链接更好服务于特定场景的具体思路。
大搜车前端开发模式:被动编译和主动编译
这篇讲的是大搜车前端团队如何根据业务发展,演进他们的开发构建模式。作者从团队规模扩大、业务复杂度提升的背景出发,坦诚原有“被动编译”模式开始力不从心。 所谓“被动编译”,核心是源码在被浏览器访问时才通过小型服务器(ads)动态编译,实现了零配置、环境统一和高度灵活的动态应用(如在线换肤)。但随着 AngularJS、React 和 ES6 的大规模使用,这种模式难以处理复杂的打包需求。 因此,团队引入了“主动编译”作为补充。他们选用 gulp 作为构建工具,用于处理较重的前端项目,在本地完成打包后再上传。重要的是,这并非颠覆,而是互补:重项目用 gulp 独立构建,普通页面仍沿用简单高效的被动编译。 文章不仅分享了技术选型的思考,也强调了引入新模式时的风险控制,例如统一项目模板、规范插件使用。这为面临类似技术栈演进与团队协作平衡问题的团队,提供了一个务实且可参考的架构调整思路。
Node.js Web应用代码热更新的另类思路
这篇讲的是Node.js开发者长期面临的一个痛点:代码修改后必须重启进程才能生效。作者从Erlang语言的热更新机制中汲取灵感,提出了一种在Node.js中实现“零重启”代码更新的思路。 核心方案不依赖PM2或node-supervisor这类工具,而是直接操作Node.js的模块加载机制。关键在于理解并干预`require.cache`,通过清除指定模块的缓存,强制`require`重新加载最新文件。作者进一步指出,要将此方法应用于Web应用,需要将基础框架代码与频繁变动的业务路由代码进行隔离。以Express为例,通过文件监听触发缓存清理,并巧妙利用闭包特性,使主应用总能获取到最新的路由模块。 文章不仅解决了“如何更新代码”和“如何使用新代码处理请求”这两个关键问题,还深入讨论了如何避免老模块导致的内存泄漏,确保新旧模块切换后资源能被正确回收。整篇文章提供了一套最小化改造的实用方案,旨在让Node.js应用的开发体验更接近PHP的灵活修改。
JavaScript 中的 相等检测
这篇讲的是 JavaScript 开发者几乎都会遇到的经典困惑:相等比较。作者直接从那个让人抓狂的表格切入,将松散相等(==)和严格相等(===)的各种比较结果,用一张巨幅表格直观地呈现出来,比如 `0 == ""` 居然返回 `true`,而 `NaN == NaN` 却是 `false`。 表格的每一格都是一个具体的“坑”,清晰展示了 JavaScript 在类型转换时那些违反直觉的行为。这不仅仅是知识点的罗列,更像是一份“避坑指南”。文章通过可视化对比,点明了这些差异背后的核心:松散相等会进行隐式类型转换,而严格相等则同时比较值和类型。 对于开发者来说,理解这张表格是写出可靠、可预测代码的基础。它帮助我们在日常编码中快速决策:何时可以利用松散相等的便利,又在何时必须使用严格相等来避免隐蔽的 bug。
React初探
这篇文章讲的是作者对前端框架React的初体验和核心优势分析。React被视为前端领域的一次革新,它通过虚拟DOM和组件化的方式,重新定义了UI的构建逻辑。 作者从Hello World示例出发,展示了React如何通过JSX语法和组件类封装UI。文章重点拆解了React的几大优势:虚拟DOM通过内存中的DOM diff算法,大幅提升了性能,避免了直接操作真实DOM的高昂代价;组件化开发则鼓励将UI拆解为独立、可复用的模块,让代码结构更清晰。此外,React作为View层库,还兼顾了前后端统一和SEO友好,能兼容到IE8。 当然,作者也客观指出了React在初期存在基础包体积较大、与传统开发习惯有差异等挑战。整体来看,这篇初探为想了解React为何快速流行、其设计哲学与传统方式有何不同的开发者,提供了一个清晰的入门视角。
用 JS 复制艺术
这篇讲的是作者如何用 JavaScript 来模仿著名艺术家草间弥生的点画作品《无限网》。作者首先细致观察了原作,发现其特点在于圆点大小不一、带有扭曲且互不重叠,整体呈现出一种有序的流动感。 核心实现思路相当巧妙。作者没有追求像素级的完美复制,而是选择用最基础的循环和数学函数来近似。通过嵌套的循环遍历画布的像素坐标,利用正弦与指数函数的组合来计算每个圆点的位置与半径,并加入了随机偏移来模拟手绘的不规则感。仅仅几十行纯 JavaScript 代码,就生成了视觉上高度接近的波点图案,展现了代码生成艺术的简洁与强大。 文章最终呈现的效果令人印象深刻,不仅是一个有趣的技术试验,也证明了用简单算法可以逼近复杂的艺术效果。文末还附上了社区用户更精确的实现方案,体现了技术实现的多样性与迭代可能。
javascript双向数据绑定
这篇技术文章深入浅出地讲解了JavaScript中的双向数据绑定。作者以AngularJS中的经典特性为引,指出其核心优势在于视图与数据模型的自动同步,免去了繁琐的手动DOM操作,但也客观说明了其局限性,比如在游戏或图形编辑器这类高频复杂交互场景中并不适用。 文章的重点在于剖析实现原理,将其拆解为“识别绑定、监视变化、传播变化”三步,并展示了两种落地方式。一种是基于jQuery的简洁实现,利用了其成熟的事件订阅发布能力;另一种则是原生的JavaScript实现,通过构建一个发布者-订阅者模式的数据绑定器,巧妙地将DOM事件监听与模型更新连接起来,代码逻辑清晰且具有启发性。 文末,作者还对比了观察者模式与Angular内部采用的“脏读”机制,指出前者实时高效,后者则在特定事件触发后批量检查,性能开销不同。这种从概念到实践,再到不同方案取舍的梳理,帮助读者不仅理解“是什么”,更看清了“如何选”和“为什么”。